Add database fingerprinting and validation (bd-166)
- Add fingerprint.go with robust URL canonicalization - Handles git@, ssh://, https://, http://, file://, and local paths - Normalizes URLs to produce consistent repo_id across formats - Clone ID uses git repo root for stability - Update init.go to store repo_id and clone_id metadata - repo_id: SHA256 hash of canonical git remote URL - clone_id: SHA256 hash of hostname + repo root path - Add daemon validation to prevent database mismatches - Validates repo_id on daemon start - Fails on legacy databases (requires explicit migration) - Clear error messages with actionable solutions - Add migrate --update-repo-id command - Updates repo_id after remote URL changes - Confirmation prompt (can bypass with --yes) - Supports --dry-run Prevents accidental database mixing across repos and provides migration path for remote URL changes or bd upgrades. Closes bd-166 Amp-Thread-ID: https://ampcode.com/threads/T-a9d9dab1-5808-4f62-93ea-75a16cca978b Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
@@ -131,9 +131,9 @@ bd.db
|
||||
// Set the issue prefix in config
|
||||
ctx := context.Background()
|
||||
if err := store.SetConfig(ctx, "issue_prefix", prefix); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error: failed to set issue prefix: %v\n", err)
|
||||
_ = store.Close()
|
||||
os.Exit(1)
|
||||
fmt.Fprintf(os.Stderr, "Error: failed to set issue prefix: %v\n", err)
|
||||
_ = store.Close()
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Store the bd version in metadata (for version mismatch detection)
|
||||
@@ -142,6 +142,34 @@ bd.db
|
||||
// Non-fatal - continue anyway
|
||||
}
|
||||
|
||||
// Compute and store repository fingerprint
|
||||
repoID, err := beads.ComputeRepoID()
|
||||
if err != nil {
|
||||
if !quiet {
|
||||
fmt.Fprintf(os.Stderr, "Warning: could not compute repository ID: %v\n", err)
|
||||
}
|
||||
} else {
|
||||
if err := store.SetMetadata(ctx, "repo_id", repoID); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Warning: failed to set repo_id: %v\n", err)
|
||||
} else if !quiet {
|
||||
fmt.Printf(" Repository ID: %s\n", repoID[:8])
|
||||
}
|
||||
}
|
||||
|
||||
// Store clone-specific ID
|
||||
cloneID, err := beads.GetCloneID()
|
||||
if err != nil {
|
||||
if !quiet {
|
||||
fmt.Fprintf(os.Stderr, "Warning: could not compute clone ID: %v\n", err)
|
||||
}
|
||||
} else {
|
||||
if err := store.SetMetadata(ctx, "clone_id", cloneID); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Warning: failed to set clone_id: %v\n", err)
|
||||
} else if !quiet {
|
||||
fmt.Printf(" Clone ID: %s\n", cloneID)
|
||||
}
|
||||
}
|
||||
|
||||
// Create config.json for explicit configuration
|
||||
if useLocalBeads {
|
||||
cfg := configfile.DefaultConfig(Version)
|
||||
|
||||
Reference in New Issue
Block a user