feat: fix Cursor hook delivery and improve notify workflow

Route hook notifications through /dev/tty and client_tty so OSC reaches
Ghostty when Cursor captures stdout. Add afterAgentResponse hook, hook
logging, debounce, split test modes, and use directory name for titles.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-26 12:46:50 +08:00
parent aa9c2b8ea5
commit 021fc3a828
20 changed files with 757 additions and 76 deletions
+7 -7
View File
@@ -3,7 +3,7 @@ package context
import "testing"
func TestRenderTitle(t *testing.T) {
meta := Meta{Agent: "Cursor", Context: "myapp"}
meta := Meta{Agent: "Cursor", CWD: "/home/user/code/myapp"}
got := Render("{agent} — {context}", meta)
want := "Cursor — myapp"
if got != want {
@@ -13,14 +13,14 @@ func TestRenderTitle(t *testing.T) {
func TestContextFromCWD(t *testing.T) {
meta := Meta{Agent: "Claude", CWD: "/home/user/code/myapp"}
if meta.ResolveContext("") != "myapp" {
t.Fatalf("got %q", meta.ResolveContext(""))
if meta.ResolveContext() != "myapp" {
t.Fatalf("got %q", meta.ResolveContext())
}
}
func TestContextPrefersWindow(t *testing.T) {
meta := Meta{Agent: "Claude", CWD: "/home/user/code/myapp"}
if meta.ResolveContext("tmux-win") != "tmux-win" {
t.Fatalf("expected window name")
func TestContextExplicitOverride(t *testing.T) {
meta := Meta{Agent: "Claude", CWD: "/home/user/code/myapp", Context: "custom"}
if meta.ResolveContext() != "custom" {
t.Fatalf("expected explicit context override")
}
}