Fix bd-373c: Surface daemon errors when multiple .db files exist

When daemon detects multiple .db files (after filtering .backup and vc.db),
it now writes detailed error to .beads/daemon-error file before exiting.

The error file is checked and displayed when:
- Daemon discovery fails to connect
- Auto-start fails to yield a running daemon
- User runs 'bd daemons list'

This makes the error immediately visible without requiring users to check
daemon logs.

Changes:
- cmd/bd/daemon.go: Write daemon-error file on multiple .db detection
- internal/daemon/discovery.go: Read and surface daemon-error in DaemonInfo.Error
- cmd/bd/main.go: Display daemon-error when auto-start fails

Amp-Thread-ID: https://ampcode.com/threads/T-1005a8d1-7a5a-4844-ad2d-2b8a6145825f
Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Steve Yegge
2025-10-31 22:01:30 -07:00
parent 31a936a4b4
commit 079effdaeb
3 changed files with 50 additions and 5 deletions

View File

@@ -1371,13 +1371,22 @@ func runDaemonLoop(interval time.Duration, autoCommit, autoPush bool, logPath, p
}
}
if len(validDBs) > 1 {
log.log("Error: Multiple database files found in %s:", beadsDir)
errMsg := fmt.Sprintf("Error: Multiple database files found in %s:\n", beadsDir)
for _, db := range validDBs {
log.log(" - %s", filepath.Base(db))
errMsg += fmt.Sprintf(" - %s\n", filepath.Base(db))
}
log.log("")
log.log("Beads requires a single canonical database: %s", beads.CanonicalDatabaseName)
log.log("Run 'bd init' to migrate legacy databases or manually remove old databases")
errMsg += fmt.Sprintf("\nBeads requires a single canonical database: %s\n", beads.CanonicalDatabaseName)
errMsg += "Run 'bd init' to migrate legacy databases or manually remove old databases\n"
errMsg += "Or run 'bd doctor' for more diagnostics"
log.log(errMsg)
// Write error to file so user can see it without checking logs
errFile := filepath.Join(beadsDir, "daemon-error")
if err := os.WriteFile(errFile, []byte(errMsg), 0644); err != nil {
log.log("Warning: could not write daemon-error file: %v", err)
}
os.Exit(1)
}
}
@@ -1394,6 +1403,12 @@ func runDaemonLoop(interval time.Duration, autoCommit, autoPush bool, logPath, p
log.log("Using database: %s", daemonDBPath)
// Clear any previous daemon-error file on successful startup
errFile := filepath.Join(beadsDir, "daemon-error")
if err := os.Remove(errFile); err != nil && !os.IsNotExist(err) {
log.log("Warning: could not remove daemon-error file: %v", err)
}
store, err := sqlite.New(daemonDBPath)
if err != nil {
log.log("Error: cannot open database: %v", err)