From 426f67db41b299fdea76e0e3a81d51ccd5db75d9 Mon Sep 17 00:00:00 2001 From: beads/crew/emma Date: Sun, 4 Jan 2026 11:15:32 -0800 Subject: [PATCH] fix(dep): ensure cycle detection runs in daemon mode for --blocks flag MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The daemon code path was returning early after adding the dependency, skipping the cycle detection that runs for direct mode. Restructure so both paths share the cycle detection and output code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- cmd/bd/dep.go | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/cmd/bd/dep.go b/cmd/bd/dep.go index 00e1cc44..959ed2ba 100644 --- a/cmd/bd/dep.go +++ b/cmd/bd/dep.go @@ -120,7 +120,7 @@ Examples: FatalErrorRespectJSON("cannot add dependency: %s is already a child of %s. Children inherit dependency on parent completion via hierarchy. Adding an explicit dependency would create a deadlock", fromID, toID) } - // If daemon is running, use RPC + // Add the dependency via daemon or direct mode if daemonClient != nil { depArgs := &rpc.DepAddArgs{ FromID: fromID, @@ -128,36 +128,27 @@ Examples: DepType: depType, } - resp, err := daemonClient.AddDependency(depArgs) + _, err := daemonClient.AddDependency(depArgs) if err != nil { FatalErrorRespectJSON("%v", err) } - - if jsonOutput { - fmt.Println(string(resp.Data)) - return + } else { + // Direct mode + dep := &types.Dependency{ + IssueID: fromID, + DependsOnID: toID, + Type: types.DependencyType(depType), } - fmt.Printf("%s Added dependency: %s blocks %s\n", - ui.RenderPass("✓"), blockerID, blocksID) - return + if err := store.AddDependency(ctx, dep, actor); err != nil { + FatalErrorRespectJSON("%v", err) + } + + // Schedule auto-flush + markDirtyAndScheduleFlush() } - // Direct mode - dep := &types.Dependency{ - IssueID: fromID, - DependsOnID: toID, - Type: types.DependencyType(depType), - } - - if err := store.AddDependency(ctx, dep, actor); err != nil { - FatalErrorRespectJSON("%v", err) - } - - // Schedule auto-flush - markDirtyAndScheduleFlush() - - // Check for cycles after adding dependency + // Check for cycles after adding dependency (both daemon and direct mode) cycles, err := store.DetectCycles(ctx) if err != nil { fmt.Fprintf(os.Stderr, "Warning: Failed to check for cycles: %v\n", err) @@ -183,10 +174,10 @@ Examples: if jsonOutput { outputJSON(map[string]interface{}{ - "status": "added", - "blocker_id": toID, - "blocked_id": fromID, - "type": depType, + "status": "added", + "blocker_id": toID, + "blocked_id": fromID, + "type": depType, }) return }