feat: 合并失败→补救→完成 全程事件轨迹与自动收口 [tsk_BagzbKZNAHXV]
不新增顶层状态,用 events + result 字段记录完整轨迹: - 新增 merge.failed / merge.remediated 两类事件 - merge 失败时在原任务时间线记 merge.failed 节点(结构化冲突文件 + 补救任务链接) - 补救任务成功合并后,findMergeOriginTask 反查原任务,remediateOrigin 自动把原任务标 done 并记 merge.remediated 节点,无需人工 merge:false - 看板:归档时间线渲染失败/补救节点;结果评审闸显示「合并失败 → 补救任务」横幅 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@ export interface MergeResult {
|
||||
ok: boolean;
|
||||
mergeCommit?: string; // 成功时为合并后 defaultBranch 的 HEAD(重复合并时为当前 HEAD,不新建提交)
|
||||
error?: string;
|
||||
conflictFiles?: string[]; // 失败为冲突时的冲突文件列表(结构化,供事件/时间线展示)
|
||||
}
|
||||
|
||||
/** 临时合并 worktree 目录(确定性):<dataDir>/worktrees/_merge/<taskId>/ */
|
||||
@@ -57,8 +58,9 @@ async function mergeInPrimaryCheckout(
|
||||
let conflicted = '';
|
||||
try { conflicted = (await git(repoPath, ['diff', '--name-only', '--diff-filter=U'])).trim(); } catch { /* ignore */ }
|
||||
await git(repoPath, ['merge', '--abort']).catch(() => undefined);
|
||||
const files = conflicted ? `;冲突文件:${conflicted.split('\n').join('、')}` : '';
|
||||
return { ok: false, error: `${(e as Error).message}${files}` };
|
||||
const conflictFiles = conflicted ? conflicted.split('\n') : [];
|
||||
const files = conflictFiles.length ? `;冲突文件:${conflictFiles.join('、')}` : '';
|
||||
return { ok: false, error: `${(e as Error).message}${files}`, conflictFiles };
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,8 +118,9 @@ export async function mergeBranch(
|
||||
conflicted = (await git(dir, ['diff', '--name-only', '--diff-filter=U'])).trim();
|
||||
} catch { /* 收集失败不影响报错 */ }
|
||||
await git(dir, ['merge', '--abort']).catch(() => undefined);
|
||||
const files = conflicted ? `;冲突文件:${conflicted.split('\n').join('、')}` : '';
|
||||
return { ok: false, error: `${(e as Error).message}${files}` };
|
||||
const conflictFiles = conflicted ? conflicted.split('\n') : [];
|
||||
const files = conflictFiles.length ? `;冲突文件:${conflictFiles.join('、')}` : '';
|
||||
return { ok: false, error: `${(e as Error).message}${files}`, conflictFiles };
|
||||
} finally {
|
||||
// 4) 无论成败都清理临时 worktree
|
||||
await git(repoPath, ['worktree', 'remove', '--force', dir]).catch(() => undefined);
|
||||
|
||||
Reference in New Issue
Block a user