Commit 3ead762cd9a94fc0b1f6bc0d6d864ca8fd688947

Authored by yanghl
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>
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 &quot;docs(&lt;phase_id&gt;): record milestone/&lt;phase_id&gt; 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 &quot;${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 &quot;${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 &quot;${CLAUDE_PLUGIN_ROOT}/skills/crosscut/plan-start/banners/flow-overview.txt&quot;
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 &#39;^## `&#39; 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 &quot;${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md&quot; 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 &quot;${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh&quot; &quot;${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 &quot;${CLAUDE_SKILL_DIR}/scripts/merge-gitignore.sh&quot; &quot;${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  
... ...