fix(sync): handle redirect + sync-branch incompatibility (bd-wayc3)

When a crew worker's .beads/ is redirected to another repo, bd sync
now detects this and skips all git operations (sync-branch worktree
manipulation). Instead, it just exports to JSONL and lets the target
repo's owner handle the git sync.

Changes:
- sync.go: Detect redirect early, skip git operations when active
- beads.go: Update GetRedirectInfo() to check git repo even when
  BEADS_DIR is pre-set (findLocalBdsDirInRepo helper)
- validation.go: Add doctor check for redirect + sync-branch conflict
- doctor.go: Register new check, remove undefined CheckMisclassifiedWisps

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

Executed-By: beads/crew/dave
Rig: beads
Role: crew
This commit is contained in:
beads/crew/dave
2026-01-14 20:36:30 -08:00
committed by Steve Yegge
parent ff67b88ea9
commit 3298c45e4b
5 changed files with 1416 additions and 1281 deletions

View File

@@ -465,7 +465,12 @@ func runDiagnostics(path string) doctorResult {
result.Checks = append(result.Checks, vestigialWorktreesCheck)
// Don't fail overall check for vestigial worktrees, just warn
// Check 14f: last-touched file tracking (runtime state shouldn't be committed)
// Check 14f: redirect + sync-branch conflict (bd-wayc3)
redirectSyncBranchCheck := convertDoctorCheck(doctor.CheckRedirectSyncBranchConflict(path))
result.Checks = append(result.Checks, redirectSyncBranchCheck)
// Don't fail overall check for redirect+sync-branch conflict, just warn
// Check 14g: last-touched file tracking (runtime state shouldn't be committed)
lastTouchedTrackingCheck := convertWithCategory(doctor.CheckLastTouchedNotTracked(), doctor.CategoryGit)
result.Checks = append(result.Checks, lastTouchedTrackingCheck)
// Don't fail overall check for last-touched tracking, just warn
@@ -577,10 +582,9 @@ func runDiagnostics(path string) doctorResult {
result.Checks = append(result.Checks, staleMQFilesCheck)
// Don't fail overall check for legacy MQ files, just warn
// Check 26d: Misclassified wisps (wisp-patterned IDs without ephemeral flag)
misclassifiedWispsCheck := convertDoctorCheck(doctor.CheckMisclassifiedWisps(path))
result.Checks = append(result.Checks, misclassifiedWispsCheck)
// Don't fail overall check for misclassified wisps, just warn
// Note: Check 26d (misclassified wisps) was referenced but never implemented.
// The commit f703237c added importer-based auto-detection instead.
// Removing the undefined reference to fix build.
// Check 27: Expired tombstones (maintenance)
tombstonesExpiredCheck := convertDoctorCheck(doctor.CheckExpiredTombstones(path))