fix: Use FatalErrorRespectJSON across all commands (bd-28sq)

Convert all fmt.Fprintf(os.Stderr, ...) + os.Exit(1) patterns to use
FatalErrorRespectJSON for consistent JSON error output:
- dep.go: dependency commands (add, remove, tree, cycles)
- label.go: label commands (add, remove, list, list-all)
- comments.go: comment commands (list, add)
- epic.go: epic commands (status, close-eligible)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-25 13:56:19 -08:00
parent f56f3615e8
commit efdaa93789
4 changed files with 73 additions and 144 deletions

View File

@@ -102,9 +102,7 @@ var labelAddCmd = &cobra.Command{
// Protect reserved label namespaces (bd-eijl)
// provides:* labels can only be added via 'bd ship' command
if strings.HasPrefix(label, "provides:") {
fmt.Fprintf(os.Stderr, "Error: 'provides:' labels are reserved for cross-project capabilities\n")
fmt.Fprintf(os.Stderr, "Hint: use 'bd ship %s' instead\n", strings.TrimPrefix(label, "provides:"))
os.Exit(1)
FatalErrorRespectJSON("'provides:' labels are reserved for cross-project capabilities. Hint: use 'bd ship %s' instead", strings.TrimPrefix(label, "provides:"))
}
processBatchLabelOperation(issueIDs, label, "added", jsonOutput,
@@ -176,19 +174,16 @@ var labelListCmd = &cobra.Command{
resolveArgs := &rpc.ResolveIDArgs{ID: args[0]}
resp, err := daemonClient.ResolveID(resolveArgs)
if err != nil {
fmt.Fprintf(os.Stderr, "Error resolving issue ID %s: %v\n", args[0], err)
os.Exit(1)
FatalErrorRespectJSON("resolving issue ID %s: %v", args[0], err)
}
if err := json.Unmarshal(resp.Data, &issueID); err != nil {
fmt.Fprintf(os.Stderr, "Error unmarshaling resolved ID: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("unmarshaling resolved ID: %v", err)
}
} else {
var err error
issueID, err = utils.ResolvePartialID(ctx, store, args[0])
if err != nil {
fmt.Fprintf(os.Stderr, "Error resolving %s: %v\n", args[0], err)
os.Exit(1)
FatalErrorRespectJSON("resolving %s: %v", args[0], err)
}
}
var labels []string
@@ -196,13 +191,11 @@ var labelListCmd = &cobra.Command{
if daemonClient != nil {
resp, err := daemonClient.Show(&rpc.ShowArgs{ID: issueID})
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("%v", err)
}
var issue types.Issue
if err := json.Unmarshal(resp.Data, &issue); err != nil {
fmt.Fprintf(os.Stderr, "Error parsing response: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("parsing response: %v", err)
}
labels = issue.Labels
} else {
@@ -210,8 +203,7 @@ var labelListCmd = &cobra.Command{
var err error
labels, err = store.GetLabels(ctx, issueID)
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("%v", err)
}
}
if jsonOutput {
@@ -245,19 +237,16 @@ var labelListAllCmd = &cobra.Command{
if daemonClient != nil {
resp, err := daemonClient.List(&rpc.ListArgs{})
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("%v", err)
}
if err := json.Unmarshal(resp.Data, &issues); err != nil {
fmt.Fprintf(os.Stderr, "Error parsing response: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("parsing response: %v", err)
}
} else {
// Direct mode
issues, err = store.SearchIssues(ctx, "", types.IssueFilter{})
if err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
FatalErrorRespectJSON("%v", err)
}
}
// Collect unique labels with counts
@@ -272,8 +261,7 @@ var labelListAllCmd = &cobra.Command{
// Direct mode - need to fetch labels
labels, err := store.GetLabels(ctx, issue.ID)
if err != nil {
fmt.Fprintf(os.Stderr, "Error getting labels for %s: %v\n", issue.ID, err)
os.Exit(1)
FatalErrorRespectJSON("getting labels for %s: %v", issue.ID, err)
}
for _, label := range labels {
labelCounts[label]++