Commit 3ead762cd9a94fc0b1f6bc0d6d864ca8fd688947
1 parent
58804e22
feat(skills): 全链路静默连跑 + 根包名固定 com.xly.erp
- 所有 skill handoff 加防桥接叙述指引:同一 turn 内立即调用下游 skill,不输出"已完成/接下来/请检查/等你确认"等收尾过渡话 (会被解读为 turn 结束信号,害用户手敲 continue)。补齐 plan-start 派发器最后一处。 - 根包名固定 com.xly.erp,覆盖三路径:生成端 skeleton-gen (步骤 B 写死 + E.2 兜底静默补齐)、校验闸门 interrupt-check (移出中断项)、全局 CLAUDE-template(占位表 + 中断表注明不在 人工填写之列)。 - skeleton-gen:.env.local 改 cp -n 防覆盖用户改过的凭据;E.4 合并为唯一收尾停顿,含 DB 连接核对(敏感值不回显)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Showing
18 changed files
with
46 additions
and
32 deletions
skills/coding/fe-feature-review/SKILL.md
| ... | ... | @@ -21,12 +21,12 @@ allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *) |
| 21 | 21 | |
| 22 | 22 | **approve** |
| 23 | 23 | - `Edit docs/08-模块任务管理.md § 三`,把本 FE 下 `- [ ] <fe_id> ...` 改为 `- [x] <fe_id> ...`(仅 FE 级可视化;前端阶段完成仍以 `整体里程碑:` 字段 + 本地 `git tag -l` 为准) |
| 24 | - - 输出 `fe-feature-review: <fe_id> round <N> 通过`,调用 `Skill(frontend-start)` 推进下一 FE 或进入 test-gate(phase=frontend) | |
| 24 | + - 输出 `fe-feature-review: <fe_id> round <N> 通过`,**同一 turn 内立即**调用 `Skill(frontend-start)` 推进下一 FE 或进入 test-gate(phase=frontend)(**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue) | |
| 25 | 25 | |
| 26 | 26 | **request-changes(round < 5)** |
| 27 | 27 | - 逐项编辑 `must_fix[]` 指向的代码文件 |
| 28 | 28 | - 按 `${CLAUDE_SKILL_DIR}/templates/commit-message-template.md` 格式 commit:`fix(<scope>): 修复 review round <N> must-fix REQ_ID: <fe_id>` |
| 29 | - - 调用 `Skill(fe-feature-verify)` 重新验证;verify 通过后会再次链回本 skill,round `<N+1>` 重审 | |
| 29 | + - **同一 turn 内立即**调用 `Skill(fe-feature-verify)` 重新验证(不先输出桥接叙述,避免 turn 提前结束、害用户手敲 continue);verify 通过后会再次链回本 skill,round `<N+1>` 重审 | |
| 30 | 30 | |
| 31 | 31 | **request-changes(round == 5)** |
| 32 | 32 | - 停止并打印摘要,升级给用户手工介入;不再自动修复,不回调 frontend-start | ... | ... |
skills/coding/fe-feature-tdd/SKILL.md
| ... | ... | @@ -26,7 +26,10 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) |
| 26 | 26 | - `frontend.e2e_runner`:playwright(默认 playwright) |
| 27 | 27 | - `frontend.test_command` / `frontend.e2e_command`:执行命令(缺失则用 `pnpm test:ci` / `pnpm e2e:ci`) |
| 28 | 28 | |
| 29 | -3. 按顺序处理每个任务: | |
| 29 | +3. 按顺序处理每个任务。**全程自主连续执行(静默编程)**:每个 task 跑完 a~f 立刻进入下一个 task,直到全部任务完成才进步骤 4。 | |
| 30 | + | |
| 31 | + > **不要输出桥接叙述**(同 `feature-plan` 步骤 7):task 之间、子会话验证返回后、commit 之后,都**不要**输出 "Task N 完成 / 接下来 / 下一步 / 准备继续 / 请检查 / 等你确认" 之类的收尾过渡话——那些会被解读为 **turn 结束信号**,导致你被迫手敲 `continue`。完成一步就直接动手做下一步,不旁白、不停顿。 | |
| 32 | + > 唯一允许的停点:3.e 的中断 与「路径护栏」的硬停。 | |
| 30 | 33 | |
| 31 | 34 | a. 在 `test_file::test_name` 处写**失败**测试: |
| 32 | 35 | - `测试先行类型 = jsdom`:在 jsdom 环境下用 vitest/jest 写组件单测(render + 断言 DOM / 交互后状态变化) |
| ... | ... | @@ -48,7 +51,7 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) |
| 48 | 51 | - `subject` ≤ 50 字符 |
| 49 | 52 | - 必含 trailer `REQ_ID: <fe_id>`(如 `REQ_ID: FE-01`) |
| 50 | 53 | |
| 51 | -4. 全部任务完成 → 调用 `Skill(fe-feature-verify)`。 | |
| 54 | +4. 全部任务完成 → **同一 turn 内立即** `Skill(fe-feature-verify)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 52 | 55 | |
| 53 | 56 | ## 护栏 |
| 54 | 57 | ... | ... |
skills/coding/fe-feature-verify/SKILL.md
| ... | ... | @@ -46,7 +46,7 @@ allowed-tools: Skill Read Agent |
| 46 | 46 | |
| 47 | 47 | 4. **任一目标 `exit_code != 0` 或 `failed > 0`** → 停止,不进入 review。 |
| 48 | 48 | |
| 49 | -5. 全部通过 → 调用 `Skill(fe-feature-review)`。 | |
| 49 | +5. 全部通过 → **同一 turn 内立即** `Skill(fe-feature-review)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 50 | 50 | |
| 51 | 51 | ## 护栏 |
| 52 | 52 | ... | ... |
skills/coding/feature-review/SKILL.md
| ... | ... | @@ -19,12 +19,12 @@ allowed-tools: Read Write Edit Skill Agent Bash(git add *) Bash(git commit *) |
| 19 | 19 | |
| 20 | 20 | **approve** |
| 21 | 21 | - `Edit docs/08-模块任务管理.md § 二`,把本模块下 `- [ ] <REQ-id> ...` 改为 `- [x] <REQ-id> ...`(仅功能级可视化;模块完成仍以 `里程碑:` 字段 + 本地 `git tag -l` 为准,不依赖此勾选) |
| 22 | - - 输出 `feature-review: <REQ> round <N> 通过`,调用 `Skill(module-start)` | |
| 22 | + - 输出 `feature-review: <REQ> round <N> 通过`,**同一 turn 内立即**调用 `Skill(module-start)`(**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue) | |
| 23 | 23 | |
| 24 | 24 | **request-changes(round < 5)** |
| 25 | 25 | - 逐项编辑 `must_fix[]` 指向的代码文件 |
| 26 | 26 | - 按 `feature-tdd/templates/commit-message-template.md` 格式 commit:`fix(<module_id>): 修复 review round <N> must-fix <REQ-id>` |
| 27 | - - 调用 `Skill(feature-verify)` 重新验证;verify 通过后会再次链回本 skill,round `<N+1>` 重审 | |
| 27 | + - **同一 turn 内立即**调用 `Skill(feature-verify)` 重新验证(不先输出桥接叙述,避免 turn 提前结束、害用户手敲 continue);verify 通过后会再次链回本 skill,round `<N+1>` 重审 | |
| 28 | 28 | |
| 29 | 29 | **request-changes(round == 5)** |
| 30 | 30 | - 停止并打印摘要,升级给用户手工介入;不再自动修复,不回调 module-start | ... | ... |
skills/coding/feature-tdd/SKILL.md
| ... | ... | @@ -19,14 +19,16 @@ allowed-tools: Read Write Edit Agent Skill Bash(git add *) Bash(git commit *) |
| 19 | 19 | - **同步**把新 CREATE / ALTER 反向更新到 `docs/03-数据库设计文档.md` 对应表小节,保持 docs/03 是 schema 的 SSoT;新增表按表小节模板追加 |
| 20 | 20 | - migration + docs/03 改动**同一 commit**,避免 SSoT 与 migration 分裂 |
| 21 | 21 | - 测试运行时 Spring Boot 启动 Flyway 会自动 apply 这个新 migration;`scripts/setup-test-db.sh` 只负责清库 |
| 22 | -3. 按顺序处理每个代码类任务: | |
| 22 | +3. 按顺序处理每个代码类任务。**全程自主连续执行(静默编程)**:每个 task 跑完 a~f 立刻进入下一个 task,直到全部任务完成才进步骤 4。 | |
| 23 | + > **不要输出桥接叙述**(同 `feature-plan` 步骤 7):task 之间、子会话验证返回后、commit 之后,都**不要**输出 "Task N 完成 / 接下来 / 下一步 / 准备继续 / 请检查 / 等你确认" 之类的收尾过渡话——那些会被解读为 **turn 结束信号**,导致你被迫手敲 `continue`。完成一步就直接动手做下一步,不旁白、不停顿。 | |
| 24 | + > 唯一允许的停点:3.e 的中断 与「护栏」节的硬停。 | |
| 23 | 25 | a. 在 `test_file::test_name` 处写**失败**测试 |
| 24 | 26 | b. 派发 Agent 子会话(general-purpose)运行测试确认失败,子会话只返回 `{command, exit_code, failing_assertion}` JSON |
| 25 | 27 | c. 在 `impl_file` 处写**最小**实现使测试通过 |
| 26 | 28 | d. 再次派发子会话确认通过 |
| 27 | 29 | e. 同一测试 >10 次修复仍失败 → 调用 `interrupt-check`(中断 #1:测试反复失败) |
| 28 | 30 | f. 按 `${CLAUDE_SKILL_DIR}/templates/commit-message-template.md` 格式 commit(`scope` = 任务模块;`subject` ≤ 50 字符;`req_id` 必填) |
| 29 | -4. 全部任务完成 → 调用 `Skill(feature-verify)`。 | |
| 31 | +4. 全部任务完成 → **同一 turn 内立即** `Skill(feature-verify)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 30 | 32 | |
| 31 | 33 | ## 护栏 |
| 32 | 34 | ... | ... |
skills/coding/feature-verify/SKILL.md
| ... | ... | @@ -27,7 +27,7 @@ allowed-tools: Skill Read Agent |
| 27 | 27 | ``` |
| 28 | 28 | 3. 按 `${CLAUDE_SKILL_DIR}/templates/feature-verify-evidence-template.md` 渲染证据并打印到会话。 |
| 29 | 29 | 4. **`exit_code != 0` 或 `failed > 0`** → 停止,不进入 review。 |
| 30 | -5. 通过 → 调用 `Skill(feature-review)`。 | |
| 30 | +5. 通过 → **同一 turn 内立即** `Skill(feature-review)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 31 | 31 | |
| 32 | 32 | ## 护栏 |
| 33 | 33 | ... | ... |
skills/coding/frontend-start/SKILL.md
| ... | ... | @@ -52,8 +52,8 @@ allowed-tools: Read Write Edit Skill Glob Grep AskUserQuestion Bash(git branch * |
| 52 | 52 | |
| 53 | 53 | ### 步骤 7:进入下一环节 |
| 54 | 54 | |
| 55 | -- 存在未完成 FE → `Skill(fe-feature-brainstorm)`,参数 `{ fe_id, name, associated_reqs[], associated_prototypes[] }` | |
| 56 | -- 全 FE 完成 → `Skill(test-gate)` 带 `phase=frontend` | |
| 55 | +- 存在未完成 FE → **同一 turn 内立即** `Skill(fe-feature-brainstorm)`,参数 `{ fe_id, name, associated_reqs[], associated_prototypes[] }`(**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue) | |
| 56 | +- 全 FE 完成 → **同一 turn 内立即** `Skill(test-gate)` 带 `phase=frontend`(**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue) | |
| 57 | 57 | |
| 58 | 58 | ## 参考 |
| 59 | 59 | ... | ... |
skills/coding/milestone-tag/SKILL.md
| ... | ... | @@ -89,7 +89,7 @@ git commit -m "docs(<phase_id>): record milestone/<phase_id> in completion repor |
| 89 | 89 | |
| 90 | 90 | ### 步骤 8:自动回调 coding-start 推进下一阶段 |
| 91 | 91 | |
| 92 | -本阶段已集成 + 打 tag,**不停下等人工**。立即用 Skill 工具调用 `coding-start`: | |
| 92 | +本阶段已集成 + 打 tag,**不停下等人工**。立即用 Skill 工具调用 `coding-start`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue): | |
| 93 | 93 | |
| 94 | 94 | - coding-start 重新做后端 / 前端完成性检查(按 `里程碑:` 字段 + `git tag -l`),未完则推进下一模块 / 前端阶段,全部完成则打印"所有阶段已完成"。 |
| 95 | 95 | ... | ... |
skills/coding/module-report/SKILL.md
| ... | ... | @@ -61,7 +61,7 @@ allowed-tools: Read Write Glob Grep Skill Bash(git diff *) Bash(git log *) Bash( |
| 61 | 61 | ``` |
| 62 | 62 | commit 是必需的——`milestone-tag` 的 worktree-clean 前置条件依赖此步。 |
| 63 | 63 | |
| 64 | -6. 调用 `Skill(milestone-tag)` 本地集成并打里程碑 tag。 | |
| 64 | +6. **同一 turn 内立即** `Skill(milestone-tag)` 本地集成并打里程碑 tag(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 65 | 65 | |
| 66 | 66 | ## 参考 |
| 67 | 67 | ... | ... |
skills/coding/module-start/SKILL.md
| ... | ... | @@ -57,8 +57,8 @@ allowed-tools: Read Write Skill Glob Grep Bash(git branch *) Bash(git checkout * |
| 57 | 57 | |
| 58 | 58 | ### 步骤 6:派发 |
| 59 | 59 | |
| 60 | -- 还有未完成 REQ → 调用 `Skill(feature-brainstorm)` 启动该 REQ 的功能循环 | |
| 61 | -- 本模块 REQ 全部完成 → 调用 `Skill(test-gate)` 进入模块测试闸门 | |
| 60 | +- 还有未完成 REQ → **同一 turn 内立即**调用 `Skill(feature-brainstorm)` 启动该 REQ 的功能循环(**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue) | |
| 61 | +- 本模块 REQ 全部完成 → **同一 turn 内立即**调用 `Skill(test-gate)` 进入模块测试闸门(**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue) | |
| 62 | 62 | |
| 63 | 63 | ## 参考 |
| 64 | 64 | ... | ... |
skills/coding/test-gate/SKILL.md
| ... | ... | @@ -42,7 +42,7 @@ allowed-tools: Read Write Skill Agent Bash(git add *) Bash(git commit *) Bash(gi |
| 42 | 42 | git add docs/superpowers/module-reports/<phase_id>-test-gate.md |
| 43 | 43 | git commit -m "chore(<phase_id>): add local test-gate evidence" |
| 44 | 44 | ``` |
| 45 | -4. **`exit_code = 0`** → 调用 `Skill(module-report)`。 | |
| 45 | +4. **`exit_code = 0`** → **同一 turn 内立即** `Skill(module-report)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 46 | 46 | 5. **失败** → 打印以下横幅并停止,不调用下游 skill;不自动重试、不自动修复(失败分类需人工判断): |
| 47 | 47 | |
| 48 | 48 | ``` | ... | ... |
skills/crosscut/coding-start/SKILL.md
| ... | ... | @@ -35,7 +35,7 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/crosscut/coding-start/banners/flow-overview.tx |
| 35 | 35 | |
| 36 | 36 | 读 `docs/08 § 二`,对每个后端模块的 `里程碑:` 字段(并用 `git tag -l 'milestone/<module_id>'` 校验 tag 真实存在): |
| 37 | 37 | |
| 38 | -- **任一模块 `里程碑: —` 或对应 `milestone/<module_id>` tag 不存在** → 后端未完成,打印 `[coding-start] 后端未完成 → 派发 module-start(写后端)`,立即用 Skill 工具调用 module-start,本 skill 结束,不进入步骤 4。 | |
| 38 | +- **任一模块 `里程碑: —` 或对应 `milestone/<module_id>` tag 不存在** → 后端未完成,打印 `[coding-start] 后端未完成 → 派发 module-start(写后端)`,立即用 Skill 工具调用 module-start(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue),本 skill 结束,不进入步骤 4。 | |
| 39 | 39 | |
| 40 | 40 | - **所有模块 `里程碑: milestone/<module_id>` 且 tag 存在** → 后端已完成,进入步骤 4。 |
| 41 | 41 | |
| ... | ... | @@ -45,7 +45,7 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/crosscut/coding-start/banners/flow-overview.tx |
| 45 | 45 | |
| 46 | 46 | - **`整体里程碑: milestone/frontend-phase` 且 tag 存在** → 前端已完成,打印 `所有阶段已完成(后端模块 + 前端阶段里程碑均已标记)`,结束本 skill。 |
| 47 | 47 | |
| 48 | -- **`整体里程碑: —` 或 tag 不存在** → 前端未完成,打印 `[coding-start] 后端已完成、前端未完成 → 派发 frontend-start(写前端)`,立即用 Skill 工具调用 frontend-start,本 skill 结束。 | |
| 48 | +- **`整体里程碑: —` 或 tag 不存在** → 前端未完成,打印 `[coding-start] 后端已完成、前端未完成 → 派发 frontend-start(写前端)`,立即用 Skill 工具调用 frontend-start(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue),本 skill 结束。 | |
| 49 | 49 | |
| 50 | 50 | ## 参考 |
| 51 | 51 | ... | ... |
skills/crosscut/interrupt-check/SKILL.md
| ... | ... | @@ -23,7 +23,7 @@ allowed-tools: Read Write Bash(mysql *) |
| 23 | 23 | ## 检查清单(权威来源:`CLAUDE.md § 🚩 中断机制`) |
| 24 | 24 | |
| 25 | 25 | 1. **测试反复失败** — 同一功能中同一测试连续 10 次修复失败 |
| 26 | -2. **要改密钥/账密/包名** — 涉及 `docs/07-环境配置.md` 中的人工填写字段 | |
| 26 | +2. **要改密钥/账密** — 涉及 `docs/07-环境配置.md` 中的人工填写字段(根包名固定 `com.xly.erp`,不属此项) | |
| 27 | 27 | 3. **外部接口不可达** — 第三方 API / 证书 / 网络问题 |
| 28 | 28 | |
| 29 | 29 | ## 执行步骤 | ... | ... |
skills/crosscut/plan-start/SKILL.md
| ... | ... | @@ -81,7 +81,7 @@ cat "${CLAUDE_PLUGIN_ROOT}/skills/crosscut/plan-start/banners/flow-overview.txt" |
| 81 | 81 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 82 | 82 | ``` |
| 83 | 83 | |
| 84 | -立即用 `Skill` 工具调用 `后续`。 | |
| 84 | +立即用 `Skill` 工具调用 `后续`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 85 | 85 | |
| 86 | 86 | ## 参考 |
| 87 | 87 | ... | ... |
skills/plan/db-init/SKILL.md
| ... | ... | @@ -144,7 +144,7 @@ EXPECTED=$(grep -c '^## `' docs/03-数据库设计文档.md) |
| 144 | 144 | - ` - [ ] SHOW TABLES 行数 == docs/03 表数量` |
| 145 | 145 | - `- [ ] A4 DB 初始化 — db-init` |
| 146 | 146 | |
| 147 | -2. 立即调用 `Skill(downstream-gen)` 进入 A5,不等用户手动输入。 | |
| 147 | +2. 立即调用 `Skill(downstream-gen)` 进入 A5,不等用户手动输入(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 148 | 148 | |
| 149 | 149 | ## 参考 |
| 150 | 150 | ... | ... |
skills/plan/project-init/SKILL.md
| ... | ... | @@ -78,7 +78,7 @@ cp -n "${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md" docs/08-模块 |
| 78 | 78 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 79 | 79 | ``` |
| 80 | 80 | |
| 81 | -立即调用 `Skill(scope-lock)` 进入 A1,不等用户手动输入。 | |
| 81 | +立即调用 `Skill(scope-lock)` 进入 A1,不等用户手动输入(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 82 | 82 | |
| 83 | 83 | ## 参考 |
| 84 | 84 | ... | ... |
skills/plan/project-init/templates/CLAUDE-template.md
| ... | ... | @@ -111,7 +111,7 @@ B 阶段分两段,**全部固化到 skills**。入口:`/erp-workflow:coding- |
| 111 | 111 | |
| 112 | 112 | | 格式 | 谁填 | 使用阶段 | 说明 | |
| 113 | 113 | |------|-----|---------|------| |
| 114 | -| `【人工填写:<简短说明>】` | 人 | 仅 A 阶段文档 | 密钥 / 账密 / 包名 / 命名约定 / 小版本号等人工才能决定的值;B 阶段 plan/spec 禁止出现,查不到真值时用 `AskUserQuestion` 问用户 | | |
| 114 | +| `【人工填写:<简短说明>】` | 人 | 仅 A 阶段文档 | 仅 A 阶段文档中**人工才能决定**的值;B 阶段 plan/spec 禁止出现,查不到真值时用 `AskUserQuestion` 问用户。**后端根包名不在此列——固定为 `com.xly.erp`,禁止占位、禁止弹问。** | | |
| 115 | 115 | | `TBD(<责任人>)` | CC 自动 | A 或 B | 后缀附带责任方(如 `TBD(A3 自动补)` / `TBD(A5 自动补)`);由对应 skill 就地补填,`module-report` § ⑦ 检查 `TBD(CC 补)` 残留 | |
| 116 | 116 | |
| 117 | 117 | **HTML 注释 `<!-- ... -->`**:提示占位,是**插件内部大纲模板**里给 LLM 的**填空提示 / 章节引导**,指引 LLM 按结构填实际内容。skill 生成时会**剥除**这些注释,最终产物里注释不会保留。 |
| ... | ... | @@ -177,7 +177,7 @@ B 阶段分两段,**全部固化到 skills**。入口:`/erp-workflow:coding- |
| 177 | 177 | | # | 中断 | 例子 | |
| 178 | 178 | | - | --- | --- | |
| 179 | 179 | | 1 | **测试反复失败** | 同一测试同一功能内连续 **10 次**修复失败 | |
| 180 | -| 2 | **要改密钥 / 账密 / 包名** | `docs/07-环境配置.md` 里由人工标注必须填的字段 | | |
| 180 | +| 2 | **要改密钥 / 账密** | `docs/07-环境配置.md` 里由人工标注必须填的字段(根包名固定 `com.xly.erp`,不在此列、不触发中断) | | |
| 181 | 181 | | 3 | **外部接口不可达** | 第三方 API 无法连接、证书失效等环境问题,并无法自行解决 | |
| 182 | 182 | |
| 183 | 183 | > 其余需要人类判断的场景一律走普通 `AskUserQuestion` Q&A,不中断、不写 Blocker 文件。 | ... | ... |
skills/plan/skeleton-gen/SKILL.md
| ... | ... | @@ -63,13 +63,13 @@ docs/04 已由 scope-lock 写入 § 零。本步骤追加 § 一 ~ 三。 |
| 63 | 63 | ```bash |
| 64 | 64 | mkdir -p scripts sql/migrations src/styles src/main/java/com/xly/erp/config |
| 65 | 65 | touch sql/migrations/.gitkeep |
| 66 | -cp "${CLAUDE_SKILL_DIR}/templates/env-local-template" .env.local | |
| 66 | +cp -n "${CLAUDE_SKILL_DIR}/templates/env-local-template" .env.local | |
| 67 | 67 | cp "${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.sh" scripts/setup-test-db.sh |
| 68 | 68 | cp "${CLAUDE_SKILL_DIR}/templates/styles-tokens-template.css" src/styles/tokens.css |
| 69 | 69 | cp -n "${CLAUDE_SKILL_DIR}/templates/CorsConfig.java.template" src/main/java/com/xly/erp/config/CorsConfig.java |
| 70 | 70 | ``` |
| 71 | 71 | |
| 72 | -> `cp -n` 保证 `CorsConfig.java` 不会覆盖已有文件(B 阶段可能对它做收紧;幂等可重跑)。 | |
| 72 | +> `cp -n` 保证 `.env.local` / `CorsConfig.java` 不会覆盖已有文件——用户在 E.3 核对时改过的凭据、B 阶段对 CORS 的收紧都不会被重跑冲掉(幂等可重跑)。 | |
| 73 | 73 | |
| 74 | 74 | #### C.2 渲染 scripts/test.sh |
| 75 | 75 | |
| ... | ... | @@ -121,18 +121,23 @@ bash "${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh" "${CLAUDE_SKILL_DIR}/templ |
| 121 | 121 | - **敏感组**:`.env.local` 路径命中(凭据 / 密钥)。**不弹 QA**(凭据不进会话),E.3 提示用户自填。 |
| 122 | 122 | - **非敏感组**:其余文件。按说明文字聚合为「根占位」(相同说明 = 同一值,多处共用)或「派生占位」(说明表达派生关系,如"后端 java 根包路径"派生自"根包名")。 |
| 123 | 123 | |
| 124 | -无命中 → 跳 E.4。 | |
| 124 | +非敏感组无命中 → 跳过 E.2/E.3,直接进 E.4(E.4 是收尾必停步,含 `.env.local` 连接核对,不可跳)。 | |
| 125 | 125 | |
| 126 | 126 | #### E.2 问根占位 + 推派生 + 批量 Edit |
| 127 | 127 | |
| 128 | -- 每个根占位用 `AskUserQuestion` 问(给合理默认值 + 自由输入),用 `Edit` 批量替换所有命中位置 | |
| 128 | +- **根包名例外(不问,静默补齐)**:凡说明涉及「根包名 / Java 包路径 / 包路径」的占位**一律不弹问**,CC 直接用固定值 `com.xly.erp`(派生目录路径 `com/xly/erp`)`Edit` 替换。这是兜底——正常情况下步骤 B 已写死、不该出现此类占位;若因旧项目残留或生成遗漏而出现,此处静默补齐,**绝不** `AskUserQuestion`。 | |
| 129 | +- 其余每个根占位用 `AskUserQuestion` 问(给合理默认值 + 自由输入),用 `Edit` 批量替换所有命中位置 | |
| 129 | 130 | - 派生占位**不问**,CC 基于根占位值推断后 `Edit`;不能可靠推断则回退当独立根占位问 |
| 130 | 131 | |
| 131 | 132 | #### E.3 敏感占位提示(不弹 QA) |
| 132 | 133 | |
| 133 | 134 | 若敏感组非空:打印提示横幅,列出 `.env.local` 待填字段名 + 告诉用户"直接编辑文件,凭据不进会话"。 |
| 134 | 135 | |
| 135 | -#### E.4 验证 + QA 闸门 | |
| 136 | +> `.env.local` 的 DB 连接核对**不在此处停**,统一放到 E.4 最终闸门——等所有产出(docs / scripts / .env.local / .gitignore)都初始化完成后再停一次,避免「一生成就停」。 | |
| 137 | + | |
| 138 | +#### E.4 验证 + QA 闸门(含 .env.local 连接核对) | |
| 139 | + | |
| 140 | +**这是 skeleton-gen 唯一的收尾停顿——所有产出(docs / scripts / .env.local / .gitignore)全部初始化完成后才在此停一次**,**严禁**在 `.env.local` 一生成(C.1)时就提前停。 | |
| 136 | 141 | |
| 137 | 142 | 循环直到两条件**同时**满足: |
| 138 | 143 | (a) `Grep` 重新扫 8 路径,0 命中 |
| ... | ... | @@ -140,14 +145,18 @@ bash "${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh" "${CLAUDE_SKILL_DIR}/templ |
| 140 | 145 | |
| 141 | 146 | 每次弹 QA 前重扫;有残留则打印残留位置清单(文件:行号 — 说明)+ 再弹 QA。 |
| 142 | 147 | |
| 143 | -QA 横幅涵盖:产出文件清单(docs/04 / 06 / 07 / 09 + scripts/*.sh + .env.local + .gitignore)、占位状态(N=0 或待填清单)、「继续」/「有疑问先沟通」两选项。 | |
| 148 | +QA 横幅涵盖: | |
| 149 | +- 产出文件清单(docs/04 / 06 / 07 / 09 + scripts/*.sh + .env.local + .gitignore) | |
| 150 | +- 占位状态(N=0 或待填清单) | |
| 151 | +- **`.env.local` DB 连接核对**:用 `Bash`(`set -a; . .env.local; set +a`)读出后列出当前 `DB_HOST` / `DB_PORT` / `DB_USER` / `DB_SCHEMA` 的**值**;`DB_PASSWORD` / `JWT_SECRET` **只列字段名、不回显值**(凭据不进会话)。提示「默认连接开箱即用;若与本地 MySQL 不符,**现在直接编辑 `.env.local`** 再选『继续』(`cp -n` 不会覆盖你的修改,下一步 A4 db-init 会真正连库验证)」。 | |
| 152 | +- 两选项:「继续」/「有疑问先沟通」 | |
| 144 | 153 | |
| 145 | 154 | 通过后(N=0 且用户选「继续」),用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选: |
| 146 | 155 | - `- [ ] A2 骨架生成 — skeleton-gen` |
| 147 | 156 | |
| 148 | 157 | ### F. 进入 A3 |
| 149 | 158 | |
| 150 | -输出 `skeleton-gen: 完成`,立即调用 `Skill(db-design-gen)`。 | |
| 159 | +输出 `skeleton-gen: 完成`,立即调用 `Skill(db-design-gen)`(直接调用,**不要**先输出"已完成 / 接下来 / 请检查 / 等你确认"之类桥接叙述——会被解读为 turn 结束信号、害用户手敲 continue)。 | |
| 151 | 160 | |
| 152 | 161 | ## 参考 |
| 153 | 162 | ... | ... |