From e98ad32d7fe752fd5f1d03870dfe5126fd9581f5 Mon Sep 17 00:00:00 2001 From: Dan Shapiro Date: Sun, 4 Jan 2026 08:48:20 -0800 Subject: [PATCH] fix: list existing town agent beads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Install now detects existing town-level agents via bd list to avoid relying on bd show prefix matching, and the role slot test reads JSON from stdout only to ignore stderr warnings. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- internal/cmd/install.go | 20 +++++++++++++++----- internal/cmd/install_integration_test.go | 7 +++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/internal/cmd/install.go b/internal/cmd/install.go index 74d37d90..7b645aff 100644 --- a/internal/cmd/install.go +++ b/internal/cmd/install.go @@ -424,12 +424,22 @@ func initTownAgentBeads(townPath string) error { }, } + existingAgents, err := bd.List(beads.ListOptions{ + Status: "all", + Type: "agent", + Priority: -1, + }) + if err != nil { + return fmt.Errorf("listing existing agent beads: %w", err) + } + existingAgentIDs := make(map[string]struct{}, len(existingAgents)) + for _, issue := range existingAgents { + existingAgentIDs[issue.ID] = struct{}{} + } + for _, agent := range agentDefs { - // Check if already exists (exact ID + agent type). - if issue, err := bd.Show(agent.id); err == nil { - if issue.ID == agent.id && issue.Type == "agent" { - continue - } + if _, ok := existingAgentIDs[agent.id]; ok { + continue } fields := &beads.AgentFields{ diff --git a/internal/cmd/install_integration_test.go b/internal/cmd/install_integration_test.go index 96cca1c6..c4f4e4a1 100644 --- a/internal/cmd/install_integration_test.go +++ b/internal/cmd/install_integration_test.go @@ -342,9 +342,12 @@ func assertSlotValue(t *testing.T, townRoot, issueID, slot, want string) { t.Helper() cmd := exec.Command("bd", "--no-daemon", "--json", "slot", "show", issueID) cmd.Dir = townRoot - output, err := cmd.CombinedOutput() + output, err := cmd.Output() if err != nil { - t.Fatalf("bd slot show %s failed: %v\nOutput: %s", issueID, err, output) + debugCmd := exec.Command("bd", "--no-daemon", "--json", "slot", "show", issueID) + debugCmd.Dir = townRoot + combined, _ := debugCmd.CombinedOutput() + t.Fatalf("bd slot show %s failed: %v\nOutput: %s", issueID, err, combined) } var parsed struct {