fix(worktree): integrate health check into CreateBeadsWorktree to prevent redundant checks

The error message 'path exists but is not a valid git worktree' was appearing
in daemon.log when the daemon attempted to use an existing worktree that was
in the git worktree list but had other issues (broken sparse checkout, etc.).

Root cause:
- CreateBeadsWorktree only checked isValidWorktree (is it in git worktree list)
- CheckWorktreeHealth was called separately and checked additional things
- If the worktree passed isValidWorktree but failed health check, an error
  was logged and repair was attempted

Fix:
- CreateBeadsWorktree now performs a full health check when it finds an
  existing worktree that's in the git worktree list
- If the health check fails, it automatically removes and recreates the
  worktree
- Removed redundant CheckWorktreeHealth calls in daemon_sync_branch.go and
  syncbranch/worktree.go since CreateBeadsWorktree now handles this internally

This eliminates the confusing error message and ensures worktrees are always
in a healthy state after CreateBeadsWorktree returns successfully.
This commit is contained in:
Charles P. Cross
2025-12-22 18:57:43 -05:00
parent 4c38075520
commit 665e5b3a87
3 changed files with 20 additions and 31 deletions

View File

@@ -62,23 +62,13 @@ func syncBranchCommitAndPushWithOptions(ctx context.Context, store storage.Stora
// Initialize worktree manager
wtMgr := git.NewWorktreeManager(repoRoot)
// Ensure worktree exists
// Ensure worktree exists and is healthy
// CreateBeadsWorktree now performs a full health check internally and
// automatically repairs unhealthy worktrees by removing and recreating them
if err := wtMgr.CreateBeadsWorktree(syncBranch, worktreePath); err != nil {
return false, fmt.Errorf("failed to create worktree: %w", err)
}
// Check worktree health and repair if needed
if err := wtMgr.CheckWorktreeHealth(worktreePath); err != nil {
log.log("Worktree health check failed, attempting repair: %v", err)
// Try to recreate worktree
if err := wtMgr.RemoveBeadsWorktree(worktreePath); err != nil {
log.log("Failed to remove unhealthy worktree: %v", err)
}
if err := wtMgr.CreateBeadsWorktree(syncBranch, worktreePath); err != nil {
return false, fmt.Errorf("failed to recreate worktree after health check: %w", err)
}
}
// Sync JSONL file to worktree
// Get the actual JSONL path (could be issues.jsonl, beads.base.jsonl, etc.)
jsonlPath := findJSONLPath()