feat(costs): add verbose logging for silent failures

Add --verbose/-v flag to gt costs command that outputs debug information
when silent failures occur during cost tracking operations:

- wisp list failures in querySessionCostWisps and deleteSessionCostWisps
- bd show failures when querying wisp details
- JSON unmarshal failures when parsing wisp/event data
- payload unmarshal failures when parsing session payloads

This makes debugging cost tracking issues much easier as these error
paths previously continued silently without any indication of failure.

Closes: bd-qv8f9

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
furiosa
2026-01-09 00:35:15 -08:00
committed by beads/crew/giles
parent 64b58b31ab
commit f19ddc5400
+25 -5
View File
@@ -18,11 +18,12 @@ import (
) )
var ( var (
costsJSON bool costsJSON bool
costsToday bool costsToday bool
costsWeek bool costsWeek bool
costsByRole bool costsByRole bool
costsByRig bool costsByRig bool
costsVerbose bool
// Record subcommand flags // Record subcommand flags
recordSession string recordSession string
@@ -127,6 +128,7 @@ func init() {
costsCmd.Flags().BoolVar(&costsWeek, "week", false, "Show this week's total from session events") costsCmd.Flags().BoolVar(&costsWeek, "week", false, "Show this week's total from session events")
costsCmd.Flags().BoolVar(&costsByRole, "by-role", false, "Show breakdown by role") costsCmd.Flags().BoolVar(&costsByRole, "by-role", false, "Show breakdown by role")
costsCmd.Flags().BoolVar(&costsByRig, "by-rig", false, "Show breakdown by rig") costsCmd.Flags().BoolVar(&costsByRig, "by-rig", false, "Show breakdown by rig")
costsCmd.Flags().BoolVarP(&costsVerbose, "verbose", "v", false, "Show debug output for failures")
// Add record subcommand // Add record subcommand
costsCmd.AddCommand(costsRecordCmd) costsCmd.AddCommand(costsRecordCmd)
@@ -991,6 +993,9 @@ func querySessionCostWisps(targetDate time.Time) ([]CostEntry, error) {
listOutput, err := listCmd.Output() listOutput, err := listCmd.Output()
if err != nil { if err != nil {
// No wisps database or command failed // No wisps database or command failed
if costsVerbose {
fmt.Fprintf(os.Stderr, "[costs] wisp list failed: %v\n", err)
}
return nil, nil return nil, nil
} }
@@ -1033,6 +1038,9 @@ func querySessionCostWisps(targetDate time.Time) ([]CostEntry, error) {
var payload SessionPayload var payload SessionPayload
if event.Payload != "" { if event.Payload != "" {
if err := json.Unmarshal([]byte(event.Payload), &payload); err != nil { if err := json.Unmarshal([]byte(event.Payload), &payload); err != nil {
if costsVerbose {
fmt.Fprintf(os.Stderr, "[costs] payload unmarshal failed for event %s: %v\n", event.ID, err)
}
continue continue
} }
} }
@@ -1137,6 +1145,9 @@ func deleteSessionCostWisps(targetDate time.Time) (int, error) {
listCmd := exec.Command("bd", "mol", "wisp", "list", "--all", "--json") listCmd := exec.Command("bd", "mol", "wisp", "list", "--all", "--json")
listOutput, err := listCmd.Output() listOutput, err := listCmd.Output()
if err != nil { if err != nil {
if costsVerbose {
fmt.Fprintf(os.Stderr, "[costs] wisp list failed in deletion: %v\n", err)
}
return 0, nil return 0, nil
} }
@@ -1155,11 +1166,17 @@ func deleteSessionCostWisps(targetDate time.Time) (int, error) {
showCmd := exec.Command("bd", "show", wisp.ID, "--json") showCmd := exec.Command("bd", "show", wisp.ID, "--json")
showOutput, err := showCmd.Output() showOutput, err := showCmd.Output()
if err != nil { if err != nil {
if costsVerbose {
fmt.Fprintf(os.Stderr, "[costs] bd show failed for wisp %s: %v\n", wisp.ID, err)
}
continue continue
} }
var events []SessionEvent var events []SessionEvent
if err := json.Unmarshal(showOutput, &events); err != nil { if err := json.Unmarshal(showOutput, &events); err != nil {
if costsVerbose {
fmt.Fprintf(os.Stderr, "[costs] JSON unmarshal failed for wisp %s: %v\n", wisp.ID, err)
}
continue continue
} }
@@ -1178,6 +1195,9 @@ func deleteSessionCostWisps(targetDate time.Time) (int, error) {
var payload SessionPayload var payload SessionPayload
if event.Payload != "" { if event.Payload != "" {
if err := json.Unmarshal([]byte(event.Payload), &payload); err != nil { if err := json.Unmarshal([]byte(event.Payload), &payload); err != nil {
if costsVerbose {
fmt.Fprintf(os.Stderr, "[costs] payload unmarshal failed for wisp %s: %v\n", wisp.ID, err)
}
continue continue
} }
} }