fix(engine/merger): autostash unrelated rootDir changes around aiMergeTask
The merger issues several `git reset --hard` / `git reset --merge` and forced-checkout calls against `rootDir` during merge attempts. When `rootDir` is the developer's primary checkout (common for solo / single-host setups), those resets silently discard any unrelated unstaged or untracked changes — we burned dev work this way during FN-3329 (dashboard-tui edits wiped mid-flight by an unrelated merge run). Snapshot dirty paths at entry to `aiMergeTask`, stash them under a recognizable label including the taskId (`-u` to capture untracked), and pop them in a finally block on every exit path. On pop conflict we leave the stash intact and log a recovery hint rather than dropping it. Best- effort: a stash failure logs and proceeds with the old behavior so the merge itself is never blocked. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
11
.changeset/merger-autostash-rootdir.md
Normal file
11
.changeset/merger-autostash-rootdir.md
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
"@runfusion/fusion": patch
|
||||
---
|
||||
|
||||
Stop the merger from wiping concurrent dev edits in `rootDir`.
|
||||
|
||||
`aiMergeTask` issues several `git reset --hard` / `git reset --merge` / forced-checkout calls against `rootDir` during merge attempts. When `rootDir` is the developer's primary checkout (the common case for solo / single-host setups), those resets silently discard any unrelated unstaged or untracked changes in the working tree. We've burned developer work this way (FN-3329 retro: dashboard-tui edits were wiped mid-flight by an unrelated merge run).
|
||||
|
||||
`aiMergeTask` now snapshots dirty paths at entry and, if any are present, stashes them under a labeled autostash (`fusion-merger-autostash:<taskId>:<ts>`, includes untracked files via `git stash push -u`). A try/finally around the merge body restores the stash on every exit path — success, error, or abort. If the pop conflicts (e.g. the merge committed an overlapping change), the stash is left intact and the operator gets a recovery hint in the merger log; we never silently `git stash drop`.
|
||||
|
||||
Best-effort throughout: a stash failure logs and proceeds with the old behavior rather than blocking the merge — strictly worse regressions are off the table.
|
||||
Reference in New Issue
Block a user