From 1117bb656ebff59c985a737fbd19c551285204b2 Mon Sep 17 00:00:00 2001 From: yanghl Date: Thu, 11 Jun 2026 11:14:08 +0800 Subject: [PATCH] fix: add-req 提交增量产物(P0) + RESUME.md 每模块增量 flush(P1#1) --- skills/plan/add-req/SKILL.md | 28 ++++++++++++++++++++-------- workflows/coding.mjs | 15 +++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/skills/plan/add-req/SKILL.md b/skills/plan/add-req/SKILL.md index 54f8c55..8c49f5f 100644 --- a/skills/plan/add-req/SKILL.md +++ b/skills/plan/add-req/SKILL.md @@ -32,11 +32,13 @@ node ${CLAUDE_PLUGIN_ROOT}/lib/req-ledger.mjs scan 解析输出 JSON 的 `ledgerExists`: -- `false`(项目还没有 `.req-ledger.json`)→ 这是首次启用增量台账。**先建基线**: +- `false`(项目还没有 `.req-ledger.json`)→ 这是首次启用增量台账。**先建基线并提交**: ``` node ${CLAUDE_PLUGIN_ROOT}/lib/req-ledger.mjs commit + git -C add .req-ledger.json + git -C commit -m "chore(req-ledger): 建立需求台账基线" ``` - 然后打印并**停下**: + (`.req-ledger.json` 必须 git 提交——否则它是未提交的脏文件,后续 `coding-start` 起 coding.mjs 时会撞「工作树必须干净」前置。)然后打印并**停下**: ``` [add-req] 已为现有 个需求单元建立台账基线(.req-ledger.json)。 首次基线无法区分存量与新增,故本次不做增量生成。 @@ -101,13 +103,23 @@ node ${CLAUDE_PLUGIN_ROOT}/lib/req-ledger.mjs scan 逐条记录已删的 tag,供步骤 6 横幅汇总。 -## 步骤 6:提交台账 + 完成横幅 +## 步骤 6:更新台账 + git 提交全部增量产物 + 完成横幅 -``` -node ${CLAUDE_PLUGIN_ROOT}/lib/req-ledger.mjs commit -``` +1. 把当前哈希写回 `.req-ledger.json`(new/changed 单元自此成为新基线): + ``` + node ${CLAUDE_PLUGIN_ROOT}/lib/req-ledger.mjs commit + ``` + +2. **git 提交本次全部增量产物**(关键——否则工作树脏,`coding-start` 起 coding.mjs 时会撞 `runBranchSetup`/`runMilestone` 的「工作树必须干净」前置,导致 HALT 或被误并进功能分支)。在**当前分支(默认分支)**提交: + ``` + git -C add docs/01-需求清单 docs/02-开发计划.md docs/03-数据库设计文档.md docs/05-API接口契约.md docs/08-模块任务管理.md sql/migrations .req-ledger.json + git -C commit -m "plan(add-req): 增量需求 <新增/变更 id 摘要>(docs/03+05+02+08 delta + V_n + 台账)" + ``` + - 覆盖范围 = 步骤 2~5 实际改动的全部文件:人工新写的 REQ 卡(docs/01)、新增 migration(sql/migrations/V_n)、同步的 docs/03、补的 docs/05/02 端点与顺序、docs/08 模块行/FE 行与复位的里程碑字段、`.req-ledger.json`。 + - 步骤 5 的 `git tag -d`(删 req-done/milestone)是对 ref 的操作,不产生工作树文件,不需进本 commit;但删 tag 应在本次 commit **之前或之后**都可(与文件提交独立)。 + - commit 后用 `git -C status --porcelain` 复核工作树**干净**(无残留);若仍有未跟踪/未提交项,排查后补提交,确保交给 coding-start 时是干净树。 -把当前哈希写回 `.req-ledger.json`(new/changed 单元自此成为新基线)。然后打印横幅并**停下**(不自动进编码,与「Plan 完不自动进 B」一致): +3. 然后打印横幅并**停下**(不自动进编码,与「Plan 完不自动进 B」一致): ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -119,7 +131,7 @@ node ${CLAUDE_PLUGIN_ROOT}/lib/req-ledger.mjs commit 新增 migration: 作废 tag:<列出已删的 req-done/* 与 milestone/* 或 无> - 台账已更新(.req-ledger.json)。 + 台账已更新并随全部增量产物 git 提交(工作树干净)。 运行 /erp-workflow:coding-start 增量编码(Router 只跑缺 tag 的模块/功能)。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` diff --git a/workflows/coding.mjs b/workflows/coding.mjs index 531f2fc..b5d2a0b 100644 --- a/workflows/coding.mjs +++ b/workflows/coding.mjs @@ -2052,6 +2052,7 @@ log(`coding: ${todo.length}/${routed.modules.length} modules to run`) const results = [] let haltedAtIdx = -1 for (const [idx, module] of todo.entries()) { + const decStart = autonomousDecisions.length // 本模块自主决策水位线(P1#1 增量 flush 用) try { phase('Milestone') await runBranchSetup(module) @@ -2093,6 +2094,20 @@ for (const [idx, module] of todo.entries()) { }) await runMilestone(module) results.push({ module: module.id, status:'done' }) + // P1#1 增量 flush:每个模块里程碑落定即追加 RESUME.md,使**硬中断**(进程被杀,到不了主循环末尾) + // 也能复盘已完成到哪、各模块做过哪些自主假设——不必等 loop-end 才写。best-effort,绝不阻断。 + { + const md = autonomousDecisions.slice(decStart) + const digest = md.length + ? md.map(d => ` - [\`${d.site}\`] ${d.question || '?'} → ${d.choice || '?'}(${d.confidence || '?'})`).join('\n') + : ' - (本模块无自主默认记录)' + await recordResume([ + '## ✅ 模块完成 `' + module.id + '` → milestone/' + module.id + '()', + '', + '- **本模块自主默认决策**(缺值时自动取的解读,可能含错误假设):', + digest, + ].join('\n')) + } } catch (e) { results.push({ module: module.id, status:'halted', reason: String(e.message||e) }) haltedAtIdx = idx -- libgit2 0.22.2