package cmd import ( "bytes" "io" "os" "path/filepath" "strings" "testing" "github.com/steveyegge/gastown/internal/beads" "github.com/steveyegge/gastown/internal/rig" ) func captureStdout(t *testing.T, fn func()) string { t.Helper() old := os.Stdout r, w, err := os.Pipe() if err != nil { t.Fatalf("create pipe: %v", err) } os.Stdout = w fn() _ = w.Close() os.Stdout = old var buf bytes.Buffer if _, err := io.Copy(&buf, r); err != nil { t.Fatalf("read stdout: %v", err) } _ = r.Close() return buf.String() } func TestDiscoverRigAgents_UsesRigPrefix(t *testing.T) { townRoot := t.TempDir() writeTestRoutes(t, townRoot, []beads.Route{ {Prefix: "bd-", Path: "beads/mayor/rig"}, }) r := &rig.Rig{ Name: "beads", Path: filepath.Join(townRoot, "beads"), HasWitness: true, } allAgentBeads := map[string]*beads.Issue{ "bd-beads-witness": { ID: "bd-beads-witness", AgentState: "running", HookBead: "bd-hook", }, } allHookBeads := map[string]*beads.Issue{ "bd-hook": {ID: "bd-hook", Title: "Pinned"}, } agents := discoverRigAgents(map[string]bool{}, r, nil, allAgentBeads, allHookBeads, nil, true) if len(agents) != 1 { t.Fatalf("discoverRigAgents() returned %d agents, want 1", len(agents)) } if agents[0].State != "running" { t.Fatalf("agent state = %q, want %q", agents[0].State, "running") } if !agents[0].HasWork { t.Fatalf("agent HasWork = false, want true") } if agents[0].WorkTitle != "Pinned" { t.Fatalf("agent WorkTitle = %q, want %q", agents[0].WorkTitle, "Pinned") } } func TestRenderAgentDetails_UsesRigPrefix(t *testing.T) { townRoot := t.TempDir() writeTestRoutes(t, townRoot, []beads.Route{ {Prefix: "bd-", Path: "beads/mayor/rig"}, }) agent := AgentRuntime{ Name: "witness", Address: "beads/witness", Role: "witness", Running: true, } output := captureStdout(t, func() { renderAgentDetails(agent, "", nil, townRoot) }) if !strings.Contains(output, "bd-beads-witness") { t.Fatalf("output %q does not contain rig-prefixed bead ID", output) } }