feat(FN-4742): complete Step 3 — migrate merger removals

Fusion-Task-Id: FN-4742
Fusion-Task-Lineage: 59bca56e-c9d9-4066-9f5a-6d8ee252a100
This commit is contained in:
Fusion (runfusion.ai)
2026-05-16 09:18:23 -07:00
committed by gsxdsm
parent d76e73f512
commit 5104553cfc

View File

@@ -68,7 +68,7 @@ import { accumulateSessionTokenUsage } from "./session-token-usage.js";
import { createResolvedAgentSession, extractRuntimeHint, resolveMergerSessionModel } from "./agent-session-helpers.js";
import { createFallbackModelObserver } from "./fallback-model-observer.js";
import { buildSessionSkillContext } from "./session-skill-context.js";
import type { WorktreePool } from "./worktree-pool.js";
import { removeWorktree, type WorktreePool } from "./worktree-pool.js";
import { AgentLogger } from "./agent-logger.js";
import { mergerLog } from "./logger.js";
import { isUsageLimitError, checkSessionError, type UsageLimitPauser } from "./usage-limit-detector.js";
@@ -5808,9 +5808,15 @@ async function removePostMergeWorktree(
rootDir: string,
postMergeWorktree: string,
taskId: string,
settings: Partial<Settings>,
): Promise<void> {
try {
await execAsync(`git worktree remove --force ${quoteArg(postMergeWorktree)}`, { cwd: rootDir });
await removeWorktree({
rootDir,
worktreePath: postMergeWorktree,
settings,
taskId,
});
} catch (err: unknown) {
mergerLog.warn(`${taskId}: failed to remove post-merge worktree ${postMergeWorktree}: ${getCommandErrorMessage(err)}`);
}
@@ -7582,7 +7588,7 @@ export async function aiMergeTask(
// Non-fatal — task still moves to done
} finally {
if (postMergeWorktree) {
await removePostMergeWorktree(rootDir, postMergeWorktree, taskId);
await removePostMergeWorktree(rootDir, postMergeWorktree, taskId, settings);
}
}
}
@@ -7607,11 +7613,13 @@ export async function aiMergeTask(
}
} else {
try {
await execAsync(`git worktree remove "${worktreePath}" --force`, {
cwd: rootDir,
await removeWorktree({
rootDir,
worktreePath,
settings,
taskId,
audit,
});
// Audit trail: record worktree removal (FN-1404)
await audit.git({ type: "worktree:remove", target: worktreePath });
result.worktreeRemoved = true;
try {
await store.updateTask(taskId, { worktree: null, branch: null });