Commit 2ef891d4192449b76447788b09259223e182c159

Authored by zichun
1 parent 9508a552

feat(lite): merge project-init + scope-lock into lite-init, lite docs/08 checklist + CLAUDE template

skills/plan/lite-init/SKILL.md 0 → 100644
  1 +---
  2 +name: lite-init
  3 +description: 计划第 1 段——项目初始化 + 范围锁定。复制 CLAUDE.md/docs(01/04/08) 模板、依赖检查、git init,引导项目概述+技术栈+需求索引,生成 REQ 卡片骨架,停下等人工审阅 REQ。
  4 +user-invocable: false
  5 +allowed-tools: Glob Read Edit Grep Skill AskUserQuestion Bash(mkdir *) Bash(cp *) Bash(sed *) Bash(bash *) Bash(cat *) Bash(git init) Bash(command -v *) Bash(uname *) Bash(brew *) Bash(apt *) Bash(apt-get *) Bash(yum *) Bash(apk *) Bash(export PATH=*) Bash(echo *)
  6 +---
  7 +
  8 +**所有输出必须使用中文。**
  9 +
  10 +你负责完成计划第 ① 段:项目初始化 + 范围锁定。合并了原 project-init + scope-lock 的全部逻辑。
  11 +
  12 +## 执行步骤
  13 +
  14 +### 步骤 0:打印计划流程图
  15 +
  16 +用 `Bash` 向用户展示 lite 流程图(▶ 位于"计划 ①"):
  17 +
  18 +```bash
  19 +cat "${CLAUDE_PLUGIN_ROOT}/skills/crosscut/plan-start/banners/flow-lite.txt" 2>/dev/null || true
  20 +```
  21 +
  22 +> 注:`flow-lite.txt` 由 Task 7 创建,当前若文件不存在,命令静默忽略,不影响后续执行。
  23 +
  24 +打印分发横幅:
  25 +
  26 +```
  27 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  28 + [lite-init] 计划 ① 初始化 + 范围锁定
  29 + ▶ 当前位置:计划 ① / 共 ③
  30 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  31 +```
  32 +
  33 +### A. 幂等复制模板文件
  34 +
  35 +用 `Bash` 一次性完成。`cp -n` 表示"不覆盖已存在的文件":
  36 +
  37 +```bash
  38 +mkdir -p docs/01-需求清单
  39 +cp -n "${CLAUDE_SKILL_DIR}/templates/CLAUDE-template.md" CLAUDE.md
  40 +cp -n "${CLAUDE_SKILL_DIR}/templates/docs-01-index-template.md" docs/01-需求清单/index.md
  41 +cp -n "${CLAUDE_SKILL_DIR}/templates/docs-04-stack-template.md" docs/04-技术规范.md
  42 +cp -n "${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md" docs/08-模块任务管理.md
  43 +```
  44 +
  45 +完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
  46 +- ` - [ ] 项目文件骨架已创建(CLAUDE.md + docs/01 index + docs/04 + docs/08)`
  47 +
  48 +### B. 依赖检查 + 自动安装(命令行工具)
  49 +
  50 +对 **git、mysql** 两个工具依次执行以下流程:
  51 + 1. 如果缺失,尝试自动安装。
  52 + 2. 如果检测到不在 PATH,尝试添加进 PATH,并加载。
  53 +
  54 +全部通过后打印单行汇总再进入步骤 C:
  55 +
  56 +```
  57 +[lite-init] 依赖检查: git ✓ mysql ✓
  58 +```
  59 +
  60 +完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
  61 +- ` - [ ] 依赖检查通过(git / mysql)`
  62 +
  63 +### C. 初始化 Git(如尚未初始化)
  64 +
  65 +用 `Glob` 检查 `.git/` 目录是否存在。
  66 +- 不存在 → 用 `Bash` 执行 `git init`。
  67 +- 已存在 → 跳过。
  68 +
  69 +完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
  70 +- ` - [ ] Git 已初始化`
  71 +
  72 +打印完成横幅:
  73 +
  74 +```
  75 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  76 + [lite-init] 项目初始化完成
  77 +
  78 + 已创建:
  79 + ✓ CLAUDE.md(从插件模板复制)
  80 + ✓ docs/01-需求清单/index.md(待人工填写模块索引)
  81 + ✓ docs/04-技术规范.md(默认技术栈,步骤 E 让用户确认)
  82 + ✓ docs/08-模块任务管理.md(全流程进度跟踪)
  83 + 已勾选:初始化子项 3 项
  84 +
  85 + 下一步:引导项目概述 + 技术栈 + 需求索引 + 生成 REQ 卡片
  86 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  87 +```
  88 +
  89 +### D. 提示用户填写项目概述并等待
  90 +
  91 +向用户输出:
  92 +
  93 +```
  94 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  95 + [lite-init] 请填写项目概述
  96 +
  97 + 📄 文件位置: ./CLAUDE.md
  98 + 📌 编辑位置: § 🎯 项目概述
  99 +
  100 + 请将以下占位符替换为实际值:
  101 + - 项目名称
  102 + - 项目简述
  103 + - 目标用户
  104 + - 部署方式
  105 + 改完后回来选择「继续」。
  106 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  107 +```
  108 +
  109 +用 `AskUserQuestion` 询问:
  110 +- **question**: `项目概述填写完毕了吗?`
  111 + - 用户选择「继续」→ 用 `Grep` 在 `CLAUDE.md` 搜索 `【人工填写:`(限定 § 🎯 项目概述 节)。命中 → 打印残留行 + 路径,重新弹出同样的 AskUserQuestion;0 命中 → 勾选并进入步骤 E。
  112 + - 用户选择「有疑问想先沟通」→ 回答用户问题后,再次弹出同样的 QA。
  113 +
  114 +0 命中后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
  115 +- ` - [ ] 项目概述已填写(CLAUDE.md § 🎯 项目概述)`
  116 +
  117 +### E. 提示用户检查默认技术栈并等待
  118 +
  119 +`docs/04-技术规范.md` 已由步骤 A 用模板复制(默认技术栈)。本步骤让用户检查 / 调整 § 零。
  120 +
  121 +向用户输出:
  122 +
  123 +```
  124 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  125 + [lite-init] 技术栈已保存
  126 +
  127 + 📄 文件位置: ./docs/04-技术规范.md(由模板生成)
  128 + 📌 编辑位置: § 零、技术栈总览
  129 +
  130 + 请检查技术栈表:
  131 + - 不需要的行直接删除(如纯后端项目删前端行)
  132 + - 需要替换的技术直接改
  133 + - 需要新增的条目直接加行
  134 + 改完后回来选择「继续」。
  135 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  136 +```
  137 +
  138 +用 `AskUserQuestion` 询问:
  139 +- **question**: `技术栈检查完毕了吗?`
  140 + - 用户选择「继续」→ 进入步骤 F。
  141 + - 用户选择「有疑问想先沟通」→ 回答用户问题后,再次弹出同样的 QA。
  142 +
  143 +完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
  144 +- ` - [ ] 技术栈已确认(docs/04 § 零)`
  145 +
  146 +### F. 提示用户填写需求清单并等待
  147 +
  148 +`docs/01-需求清单/index.md` 已由步骤 A 写入占位符模板,这里让用户补齐模块清单。
  149 +
  150 +向用户输出:
  151 +
  152 +```
  153 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  154 + [lite-init] 请填写需求清单模块索引
  155 +
  156 + 📄 文件位置: ./docs/01-需求清单/index.md
  157 + 📌 编辑位置: § 模块索引(表格)
  158 +
  159 + 请按业务列出所有模块:
  160 + - 每行一个模块(如 SYS 系统管理 / PUR 采购 / SAL 销售)
  161 + - 「核心功能点」只需关键词,CC 会拆分为 REQ 卡片
  162 + 改完后回来选择「继续」。
  163 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  164 +```
  165 +
  166 +用 `AskUserQuestion` 询问:
  167 +- **question**: `需求清单模块索引填写完毕了吗?`
  168 + - 用户选择「继续」→ 进入步骤 G。
  169 + - 用户选择「有疑问想先沟通」→ 回答用户问题后,再次弹出同样的 QA。
  170 +
  171 +完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
  172 +- ` - [ ] 需求清单索引已填写(docs/01-需求清单/index.md)`
  173 +
  174 +### G. 生成 REQ 卡片骨架并停下等人工审阅
  175 +
  176 +1. 用 `Grep` 校验 `docs/01-需求清单/index.md` 无 `【人工填写:` 残留;有则回步骤 F。
  177 +2. 用 `Read` 读 `index.md` 解析模块索引。
  178 +3. **单次 Bash 写入所有文件**(替代 N×9 次 Edit):
  179 +
  180 + - **每模块推断**:三元组 `{module_code, module_name, module_brief}` + N 个 REQ 的六元组 `{req_id, title, goal, rules, constraints, acceptance}`。`req_id`/`title` 从核心功能点拆分;`goal` 展开 `title`;`rules`/`constraints`/`acceptance` 起草业务语义。**不推断**输入 / 输出(模板原样保留示例)。
  181 + - **单次 Bash**:调 `${CLAUDE_SKILL_DIR}/scripts/render.sh` 落盘所有文件(脚本内部完成模板读取 + 占位符替换 + HTML 注释剥离)。下面是**调用形态**示例,`<MOD>` / `<模块名>` / `<REQ-MOD-NNN>` 等尖括号位置 CC 按 `index.md` 实际值替换:
  182 +
  183 + ```bash
  184 + R="${CLAUDE_SKILL_DIR}/scripts/render.sh"
  185 + # 每个模块:mkdir + 1 个 render module + N 个 render req(每 REQ 一行)
  186 + mkdir -p "docs/01-需求清单/<MOD>-<模块名>"
  187 + bash "$R" module "docs/01-需求清单/<MOD>-<模块名>/_module.md" "<MOD>" "<模块名>" "<module_brief>"
  188 + bash "$R" req "docs/01-需求清单/<MOD>-<模块名>/<REQ-MOD-NNN>.md" "<REQ-MOD-NNN>" "<title>" "<goal>" "<rules>" "<constraints>" "<acceptance>"
  189 + ```
  190 +
  191 + - **兜底**:值含字面 `$xxx` 或 `}}` 的 REQ 单独走 cp + Edit。
  192 +
  193 +4. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选(计划 ① 子项 + ① 顶层):
  194 + - ` - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md)`
  195 + - `- [ ] 计划 ① 初始化 + 范围锁定 — lite-init`
  196 +
  197 +5. 打印停下横幅并**停止**,不自动派发 lite-design:
  198 +
  199 +```
  200 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  201 + [lite-init] ✅ 计划 ① 完成
  202 +
  203 + 产出:
  204 + ✓ CLAUDE.md § 🎯 项目概述
  205 + ✓ docs/04 § 零 技术栈
  206 + ✓ docs/01-需求清单/index.md 模块索引
  207 + ✓ docs/01-需求清单/<module>/_module.md 模块头
  208 + ✓ docs/01-需求清单/<module>/REQ-*.md REQ 卡片骨架
  209 +
  210 + ⏸ 现在请你逐张打开 REQ 卡片:
  211 + - **必改**:输入 / 输出 两段
  212 + · `表1` / `表2` 是模板示例,按本 REQ 业务**改字段 / 增删行 / 增删整张表**
  213 + - **审阅**:目标 / 跨字段规则 / 边界 / 验收(已起草,对照业务校正)
  214 + - **保留**:`TBD` 不要改,由之后流程自动回填
  215 +
  216 + 审阅完成后,运行以下命令进入计划 ②:
  217 + /erp-workflow:plan-start
  218 +
  219 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  220 +```
  221 +
  222 +> **STOP**:此处是人工审阅 REQ 的闸门。停止执行,等待用户运行 `/erp-workflow:plan-start` 后由 plan-start 派发 lite-design。
  223 +
  224 +## 参考
  225 +
  226 +- `${CLAUDE_SKILL_DIR}/templates/CLAUDE-template.md`(项目级 CLAUDE.md 模板)
  227 +- `${CLAUDE_SKILL_DIR}/templates/docs-01-index-template.md`(需求索引初稿)
  228 +- `${CLAUDE_SKILL_DIR}/templates/docs-04-stack-template.md`(默认技术栈)
  229 +- `${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md`(计划阶段进度初始化)
  230 +- `${CLAUDE_SKILL_DIR}/templates/req-card-template.md`(REQ 卡片模板)
  231 +- `${CLAUDE_SKILL_DIR}/templates/_module-template.md`(模块头模板)
  232 +- `${CLAUDE_SKILL_DIR}/scripts/render.sh`(步骤 G 渲染助手,dispatch `module` / `req` 两种模式)
  233 +- 下游:人工审阅 REQ 后运行 `/erp-workflow:plan-start`,由 plan-start 派发 `lite-design`(计划 ②)
... ...
skills/plan/scope-lock/scripts/render.sh renamed to skills/plan/lite-init/scripts/render.sh
skills/plan/lite-init/templates/CLAUDE-template.md 0 → 100644
  1 +# CLAUDE.md — ERP项目 Claude Code 主指令文件
  2 +
  3 +> 本文件是 Claude Code 的"操作手册"。Claude Code 启动时会自动读取此文件。
  4 +
  5 +---
  6 +
  7 +## 🎯 项目概述
  8 +
  9 +- **项目名称**: 【人工填写:公司 + 项目名,例如"XX 公司 ERP 管理系统"】
  10 +- **项目简述**: 【人工填写:一句话描述项目目标,例如"面向中小制造企业的全流程 ERP,涵盖采购/库存/生产/销售/财务"】
  11 +- **目标用户**: 【人工填写:谁会用,例如"企业内部管理人员(采购员、仓管员、生产主管、销售员、财务人员、管理层)"】
  12 +- **部署方式**: 【人工填写:私有化部署 / 云部署 / Docker 容器化 等】
  13 +
  14 +---
  15 +
  16 +## 🔄 编码开发流程(统一循环)
  17 +
  18 +编码阶段入口:`/erp-workflow:coding-start`。所有模块统一走同一个 phase-driver 循环,无前后端分段。
  19 +
  20 +### 阶段路由(coding-start 内,只做分发)
  21 +
  22 +`coding-start` 每次入口扫描 `docs/08 § 二` 的 `里程碑:` 字段 + 本地 `git tag -l 'milestone/<id>'`,找第一个未打里程碑的模块分发到 `phase-driver`;所有模块里程碑均已打 → 输出"全部完成"。
  23 +
  24 +### 统一功能循环
  25 +
  26 +**模块循环(外)**:`phase-driver` → feature 循环 → `milestone`(本地 merge 进默认分支 + 打 `milestone/<id>` tag)→ 自动回调 `coding-start` 路由下一模块(无人工介入)。
  27 +
  28 +**功能循环(内,每个 REQ-XXX-NNN 一遍)**:`feature-spec` → `feature-tdd` → `feature-review`。
  29 +- `feature-review` verdict=approve → 勾选 docs/08 § 二 对应功能子项,继续下一 feature;
  30 +- 模块所有 feature 完成 → 调用 `milestone` 打里程碑 tag + 回调 `coding-start`。
  31 +
  32 +### 里程碑前守门
  33 +
  34 +- `milestone` 在打 tag 前内置测试闸门(后端:`scripts/test.sh`);红色不得跳过。
  35 +- 测试 / 验证统一派发到 Agent 子会话执行,主会话只接收结构化结论。
  36 +
  37 +---
  38 +
  39 +## ✅ 阶段完成判定规则
  40 +
  41 +`docs/08-模块任务管理.md` 分两段:
  42 +- `§ 一`:计划阶段三段(①②③)进度勾选
  43 +- `§ 二`:编码模块元数据表(每个模块一行 bullet,记录依赖 / 路径 / 里程碑 tag / 功能子项)
  44 +
  45 +**阶段完成判定**统一以 `里程碑:` 字段 + 本地 `git tag -l 'milestone/<id>'` 判定;子项勾选只作可视化进度,不参与完成判定。
  46 +
  47 +### 后端模块格式
  48 +
  49 +每个后端模块在 docs/08 § 二 中长这样:
  50 +
  51 +```markdown
  52 +- module_0 系统管理
  53 + - 依赖: —
  54 + - 路径: backend/module/sys/
  55 + - 里程碑: —
  56 + - 功能:
  57 + - [ ] REQ-SYS-001 用户登录
  58 + - [ ] REQ-SYS-002 用户注册
  59 +```
  60 +
  61 +- `里程碑:` 字段由 `milestone` 在打里程碑 tag 时从 `—` 改为 `milestone/<module_id>`。
  62 +- 每个 `REQ-*` 子项由 `feature-review` 在 verdict=approve 时自动勾选为 `[x]`。
  63 +
  64 +### 状态语义
  65 +
  66 +| `里程碑:` 字段 | `git tag -l` | 含义 | 你(Claude Code)的行为 |
  67 +|---|---|---|---|
  68 +| `—` | tag 不存在 | 该阶段未开始 / 进行中(未打里程碑) | ✅ 开始 / 继续该阶段开发 |
  69 +| `milestone/<id>` | tag 存在 | 阶段**已完成** | 🟢 进入下一未完成模块;全部完成 → 输出完成信息 |
  70 +
  71 +### 模块完成报告
  72 +
  73 +由 `milestone` skill 产出,模板由 milestone skill 持有。CC 不手写模块报告,仅填模板。
  74 +
  75 +---
  76 +
  77 +## 🏷️ 占位符统一约定
  78 +
  79 +项目文档里有 **2 种填写占位** + **1 种提示占位**:
  80 +
  81 +| 格式 | 谁填 | 使用阶段 | 说明 |
  82 +|------|-----|---------|------|
  83 +| `【人工填写:<简短说明>】` | 人 | 仅计划阶段文档 | 密钥 / 账密 / 包名 / 命名约定 / 小版本号等人工才能决定的值;编码阶段 plan/spec 禁止出现,查不到真值时用 `AskUserQuestion` 问用户 |
  84 +| `TBD(<责任人>)` | CC 自动 | 计划或编码 | 后缀附带责任方(如 `TBD(lite-design 自动补)` / `TBD(lite-build-db 自动补)`);由对应 skill 就地补填 |
  85 +
  86 +**HTML 注释 `<!-- ... -->`**:提示占位,是**插件内部大纲模板**里给 LLM 的**填空提示 / 章节引导**,指引 LLM 按结构填实际内容。skill 生成时会**剥除**这些注释,最终产物里注释不会保留。
  87 +
  88 +---
  89 +
  90 +## 📐 编码行为约束
  91 +
  92 +### 你必须做的 ✅
  93 +
  94 +1. **严格遵循** `docs/04-技术规范.md`——命名 / 编码 / 统一响应 / 异常处理 / 数据访问 / 配置与安全 / 环境配置(含 .env.local 字段说明)等项目专属技术规约全部在此
  95 +2. **每个后端接口** 必须先在 `docs/05-API接口契约.md` 定义,再编码实现
  96 +3. **每个功能可追溯到 `REQ-XXX-NNN`**——commit tag + 代码注释(如 `// REQ-SYS-001: 用户登录`)+ plan/spec 文件名均用此 tag
  97 +4. **遇到跨模块改动**(动到非当前模块的代码)——按 § 🟡 软规则 **S2** 执行(允许改,但必须留痕)
  98 +5. **遇到技术栈外组件引入**(`docs/04 § 零` 技术栈表外的框架 / 中间件 / 关键库),按 § 🟡 软规则 **S1** 执行(允许引入,但必须先 AskUserQuestion)
  99 +
  100 +### 你禁止做的 🚫
  101 +
  102 +1. **主会话直接 `mysql -e` 跑业务 DDL**(只读查询 / 临时本地调试除外)——业务 schema 必须走 `sql/migrations/V_n__*.sql`,详见下方 Schema 演化规约
  103 +2. **手动 Edit `docs/08 § 二` 的 `里程碑:` 字段**,必须由 `milestone` 自动回写
  104 +
  105 +### Schema 演化规约(Flyway migration)
  106 +
  107 +1. **文件命名**:`sql/migrations/V<n>__<snake_case_desc>.sql`,例:`V5__add_user_email_unique_index.sql`
  108 +2. **版本号分配**:建文件前 `ls sql/migrations/V*.sql` 查当前最大 n,新文件 `n_max + 1`
  109 +3. **Apply 方式**:Spring Boot 启动 / 测试启动时 Flyway 自动 apply(项目必须在 `pom.xml` 声明 `flyway-core` + `flyway-mysql` 依赖)。`scripts/setup-test-db.sh` 只负责清空库,不做 apply
  110 +4. **已合并的 migration 永不修改**:发现错了写一个补救 migration(如 `V7__fix_V5_index_name.sql`),旧 `V_n.sql` 不动
  111 +5. **临时调试 DDL**:临时在本地试字段/索引可手动 `mysql -e`,但不写 migration;下次 `setup-test-db.sh` 会 drop+create 清掉
  112 +6. **计划 ③ 生成的 V1**:`V1__initial_schema.sql` 是计划阶段由 `lite-build-db` 从 `docs/03-数据库设计文档.md`(lite-design 正向设计的 schema SSoT)翻译生成的初始版本;后续 V2/V3/... 由编码阶段每个 REQ 按需写入,**同时**反向同步更新 docs/03 对应表小节以保持 SSoT 一致
  113 +
  114 +---
  115 +
  116 +## 🗂️ Git 提交规范
  117 +
  118 +每次提交必须遵循以下格式:
  119 +
  120 +```
  121 +<type>(<scope>): <subject>
  122 +```
  123 +
  124 +- `scope`: 模块名,如 `user` / `inventory` / `order`
  125 +- `subject`: 简短描述;业务类(feat / fix / test)必须带 `REQ-XXX-NNN` 后缀
  126 +
  127 +`type` 含义:
  128 +
  129 +| type | 看到它意味着 |
  130 +|-----|-------------|
  131 +| `feat` | **新能力上线**——用户多了一个功能、接口、页面或业务规则 |
  132 +| `fix` | **修 bug**——原来行为错了,这次改对 |
  133 +| `refactor` | **重构**——外部行为不变,只改代码结构 / 命名 / 抽象 |
  134 +| `docs` | **文档改动**——只动 Markdown / 代码注释,不动实现 |
  135 +| `style` | **格式调整**——空白 / 缩进 / import 顺序,逻辑 0 变化 |
  136 +| `test` | **只动测试代码**——补用例 / 修 fixture,不碰实现 |
  137 +| `chore` | **流程维护**——构建 / 依赖 / 工具 / 证据档案 / 里程碑元数据等非业务动作 |
  138 +
  139 +---
  140 +
  141 +## 🚩 中断机制
  142 +
  143 +功能循环(每个功能 REQ-XXX 的 feature-spec → feature-tdd → feature-review)默认 **静默编程**,但触发以下任何一条必须**立刻停下、记录原因、等人决策**,不得自行绕过:
  144 +
  145 +| # | 中断 | 例子 |
  146 +| - | --- | --- |
  147 +| 1 | **测试反复失败** | 同一测试同一功能内连续 **10 次**修复失败 |
  148 +| 2 | **要改密钥 / 账密 / 包名** | 涉及 .env.local / docs/04 §零环境 中的密钥/账密字段 |
  149 +| 3 | **外部接口不可达** | 第三方 API 无法连接、证书失效等环境问题,并无法自行解决 |
  150 +
  151 +> 其余需要人类判断的场景一律走普通 `AskUserQuestion` Q&A,不中断、不写 Blocker 文件。
  152 +
  153 +**触发中断时的固定动作:**
  154 +
  155 +1. 在当前功能的 spec 文件里追加一节 `## 🚩 Blocker`(报告格式由 `interrupt-check` 的 `interrupt-block-template.md` 持有)
  156 +2. 停止后续所有功能的静默执行
  157 +3. 在主会话输出一句话摘要 + 指向 blocker 文件的路径,等人回复
  158 +
  159 +---
  160 +
  161 +## 🟡 软规则(允许继续,但有强制后续动作)
  162 +
  163 +以下情况 **不触发中断**,CC 可自行继续推进,但必须在约定位置留痕,模块完成时统一审计。
  164 +
  165 +| # | 软规则 | 允许动作 | 强制后续 |
  166 +| - | ----- | ------- | ------- |
  167 +| S1 | **技术栈外组件引入** | 用 `AskUserQuestion` 给用户三选一:接受引入 / 换方案 / 拒绝 | ① **接受** → 同会话直接在 `docs/04 § 零` 追加一行 → 继续流程 ② **换方案 / 拒绝** → 视为常规歧义澄清,继续 Q&A 收敛 ③ 不写 Blocker、不中断流程 |
  168 +| S2 | **跨模块改动** | **默认不改**,仅为当前模块实现所必需时允许修改 | ① hook `log-cross-module.sh` 自动落存根 ② `milestone` 在打里程碑前调用 `interrupt-check` skill 批量补齐「原因 / 影响评估」节 |
  169 +
  170 +---
  171 +
  172 +## 🧭 通用工作准则(General Principles)
  173 +
  174 +### 1. Think Before Coding
  175 +
  176 +**Don't assume. Don't hide confusion. Surface tradeoffs.**
  177 +
  178 +Before implementing:
  179 +- State your assumptions explicitly. If uncertain, ask.
  180 +- If multiple interpretations exist, present them - don't pick silently.
  181 +- If a simpler approach exists, say so. Push back when warranted.
  182 +- If something is unclear, stop. Name what's confusing. Ask.
  183 +
  184 +### 2. Simplicity First
  185 +
  186 +**Minimum code that solves the problem. Nothing speculative.**
  187 +
  188 +- No features beyond what was asked.
  189 +- No abstractions for single-use code.
  190 +- No "flexibility" or "configurability" that wasn't requested.
  191 +- No error handling for impossible scenarios.
  192 +- If you write 200 lines and it could be 50, rewrite it.
  193 +
  194 +Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
  195 +
  196 +### 3. Surgical Changes
  197 +
  198 +**Touch only what you must. Clean up only your own mess.**
  199 +
  200 +When editing existing code:
  201 +- Don't "improve" adjacent code, comments, or formatting.
  202 +- Don't refactor things that aren't broken.
  203 +- Match existing style, even if you'd do it differently.
  204 +- If you notice unrelated dead code, mention it - don't delete it.
  205 +
  206 +When your changes create orphans:
  207 +- Remove imports/variables/functions that YOUR changes made unused.
  208 +- Don't remove pre-existing dead code unless asked.
  209 +
  210 +The test: Every changed line should trace directly to the user's request.
  211 +
  212 +### 4. Goal-Driven Execution
  213 +
  214 +**Define success criteria. Loop until verified.**
  215 +
  216 +Transform tasks into verifiable goals:
  217 +- "Add validation" → "Write tests for invalid inputs, then make them pass"
  218 +- "Fix the bug" → "Write a test that reproduces it, then make it pass"
  219 +- "Refactor X" → "Ensure tests pass before and after"
  220 +
  221 +For multi-step tasks, state a brief plan:
  222 +```
  223 +1. [Step] → verify: [check]
  224 +2. [Step] → verify: [check]
  225 +3. [Step] → verify: [check]
  226 +```
  227 +
  228 +Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
  229 +
  230 +---
  231 +
  232 +## 🗺️ Skill 索引(erp-workflow-lite,共 11 个)
  233 +
  234 +### 入口
  235 +
  236 +| Skill | 描述 |
  237 +|-------|------|
  238 +| `plan-start` | 计划阶段入口——扫 docs/08 § 一找第一个未完成计划段(①②③)并派发 |
  239 +| `coding-start` | 编码阶段入口——扫 docs/08 § 二找第一个未打里程碑模块并派发 phase-driver |
  240 +
  241 +### 计划阶段
  242 +
  243 +| Skill | 描述 |
  244 +|-------|------|
  245 +| `lite-init` | 计划 ①——项目初始化 + 范围锁定(模板复制、依赖检查、git init、项目概述+技术栈+需求索引、REQ 卡片生成,停下等人工审阅) |
  246 +| `lite-design` | 计划 ②——脚手架 + 数据库设计(docs/04 § 一+、scripts、.env.local、docs/03 DB 设计,停下等人工审阅) |
  247 +| `lite-build-db` | 计划 ③——DB 初始化 + 下游文档(V1 migration apply、docs/05 API 契约、docs/08 § 二模块清单,计划阶段结束) |
  248 +
  249 +### 编码阶段
  250 +
  251 +| Skill | 描述 |
  252 +|-------|------|
  253 +| `phase-driver` | 模块驱动——加载当前模块 REQ 清单,逐个派发 feature 循环 |
  254 +| `feature-spec` | 功能规格——为 REQ 生成 spec 文档(API 签名、数据变更、边界) |
  255 +| `feature-tdd` | TDD 实现——按 spec 写测试先行,再实现,Agent 子会话跑测试 |
  256 +| `feature-review` | AI 代码审查——审查当前 REQ 实现,verdict approve/reject,approve 时勾选进度 |
  257 +| `milestone` | 里程碑——内置测试闸门(Agent 子会话),green 则本地 merge + 打 tag,生成模块完成报告 |
  258 +
  259 +### 守门
  260 +
  261 +| Skill | 描述 |
  262 +|-------|------|
  263 +| `interrupt-check` | 中断检查——触发中断条件时由功能循环 skill 调用,追加 Blocker 节并停止执行 |
  264 +
  265 +### 文档套件(5 文档)
  266 +
  267 +| 文档 | 职责 |
  268 +|------|------|
  269 +| `docs/01-需求清单/` | REQ 卡片目录(模块子目录 + index.md) |
  270 +| `docs/03-数据库设计文档.md` | 表/字段/索引/外键 SSoT(lite-design 生成,编码阶段同步更新) |
  271 +| `docs/04-技术规范.md` | 技术栈总览(§ 零)+ 架构规范 + 环境变量说明(含 .env.local 密钥字段) |
  272 +| `docs/05-API接口契约.md` | 所有后端接口契约(lite-build-db 生成,feature-spec 按需追加) |
  273 +| `docs/08-模块任务管理.md` | 全流程进度跟踪(§ 一计划 / § 二编码) |
... ...
skills/plan/scope-lock/templates/_module-template.md renamed to skills/plan/lite-init/templates/_module-template.md
skills/plan/project-init/templates/docs-01-index-template.md renamed to skills/plan/lite-init/templates/docs-01-index-template.md
skills/plan/project-init/templates/docs-04-stack-template.md renamed to skills/plan/lite-init/templates/docs-04-stack-template.md
skills/plan/lite-init/templates/docs-08-initial-template.md 0 → 100644
  1 +# 08-工作流进度
  2 +
  3 +> 全流程进度跟踪。CC 每完成一项产出就勾选一项。
  4 +> - **§ 一 计划阶段**:`plan-start` 找第一个未勾的计划段(①②③)分发到对应 skill
  5 +> - **§ 二 Coding(模块)**:`coding-start` 扫描 docs/08 § 二 的 `里程碑:` 字段 + 本地 `git tag -l 'milestone/<id>'`,找第一个未打里程碑模块分发。本 § 二 行序无语义,仅作模块元数据表
  6 +
  7 +## 一、计划阶段进度
  8 +
  9 +- [ ] 计划 ① 初始化 + 范围锁定 — lite-init
  10 + - [ ] 项目文件骨架已创建(CLAUDE.md + docs/01 index + docs/04 + docs/08)
  11 + - [ ] 依赖检查通过(git / mysql)
  12 + - [ ] Git 已初始化
  13 + - [ ] 项目概述已填写(CLAUDE.md § 🎯 项目概述)
  14 + - [ ] 技术栈已确认(docs/04 § 零)
  15 + - [ ] 需求清单索引已填写(docs/01-需求清单/index.md)
  16 + - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md)
  17 +- [ ] 计划 ② 脚手架 + 数据库设计 — lite-design
  18 + - [ ] 架构文档已生成(docs/04 § 一+ | scripts/*.sh | .env.local | sql/migrations/)
  19 + - [ ] docs/03 数据库设计已生成(REQ → 表/字段/索引/外键,回填 REQ 依赖表)
  20 +- [ ] 计划 ③ DB 初始化 + 下游文档 — lite-build-db
  21 + - [ ] V1 migration 已生成并校验 + apply 到本地 MySQL
  22 + - [ ] docs/05 API 契约已生成 + 回填 REQ 依赖接口
  23 + - [ ] docs/08 § 二 模块清单(含 REQ 顺序)已生成
  24 +
  25 +## 二、Coding 阶段(模块循环)
  26 +
  27 +(lite-build-db 填入后,每行一个后端模块。每个模块的 `里程碑:` 字段在 `—` 和 `milestone/<id>` 之间变化,完成由本地 `git tag -l` 判定。`coding-start` 每次扫每模块的里程碑 tag 决定派发。所有模块打里程碑后整体完成。)
  28 +
  29 +<!-- 模块格式示例(由 lite-build-db 追加;功能子项由 feature-review 在 approve 时勾选):
  30 +- module_0 系统管理
  31 + - 依赖: —
  32 + - 路径: backend/module/sys/
  33 + - 里程碑: —
  34 + - 功能:
  35 + - [ ] REQ-SYS-001 用户登录
  36 + - [ ] REQ-SYS-002 用户注册
  37 +-->
... ...
skills/plan/scope-lock/templates/req-card-template.md renamed to skills/plan/lite-init/templates/req-card-template.md
skills/plan/project-init/SKILL.md deleted
1   ----
2   -name: project-init
3   -description: A0 项目初始化——从插件模板幂等地复制 CLAUDE.md / docs/01-需求清单/index.md / docs/04-技术规范.md / docs/08-模块任务管理.md(已存在则跳过),并初始化 Git(如未初始化)。session-start 在 docs/08 缺失时派发本 skill。
4   -user-invocable: false
5   -allowed-tools: Glob Edit Skill Bash(mkdir *) Bash(cp -n *) Bash(git init) Bash(command -v *) Bash(uname *) Bash(brew *) Bash(apt *) Bash(apt-get *) Bash(yum *) Bash(apk *) Bash(export PATH=*) Bash(echo *) Bash(cat *)
6   ----
7   -
8   -**所有输出必须使用中文。**
9   -
10   -你负责在项目目录中创建初始文件结构,已存在的文件不覆盖。
11   -
12   -## 执行步骤
13   -
14   -### 步骤 0:打印当前位置流程图
15   -
16   -用 `Bash` 执行 `cat` 命令向用户展示当前位置流程图(stdout 即 ASCII 框图):
17   -
18   -```bash
19   -cat "${CLAUDE_PLUGIN_ROOT}/skills/plan/project-init/banners/flow.txt"
20   -```
21   -
22   -### A. 幂等复制模板文件
23   -
24   -用 `Bash` 一次性完成。`cp -n` 表示"不覆盖已存在的文件":
25   -
26   -```bash
27   -mkdir -p docs/01-需求清单
28   -cp -n "${CLAUDE_SKILL_DIR}/templates/CLAUDE-template.md" CLAUDE.md
29   -cp -n "${CLAUDE_SKILL_DIR}/templates/docs-01-index-template.md" docs/01-需求清单/index.md
30   -cp -n "${CLAUDE_SKILL_DIR}/templates/docs-04-stack-template.md" docs/04-技术规范.md
31   -cp -n "${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md" docs/08-模块任务管理.md
32   -```
33   -
34   -完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
35   -- ` - [ ] 项目文件骨架已创建(CLAUDE.md + docs/01-需求清单/index.md + docs/04-技术规范.md)`
36   -
37   -### B. 依赖检查 + 自动安装(命令行工具)
38   -
39   -对 **git、mysql** 两个工具依次执行以下流程。
40   - 1. 如果缺失,尝试自动安装。
41   - 2. 如果检测到不在 PATH,尝试添加进 PATH,并加载。
42   -
43   -全部通过后打印单行汇总再进入步骤 C:
44   -
45   -```
46   -[project-init] 依赖检查: git ✓ mysql ✓
47   -```
48   -
49   -完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
50   -- ` - [ ] 依赖检查通过`
51   -
52   -### C. 初始化 Git(如尚未初始化)
53   -
54   -用 `Glob` 检查 `.git/` 目录是否存在。
55   -- 不存在 → 用 `Bash` 执行 `git init`。
56   -- 已存在 → 跳过。
57   -
58   -完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选(A0 子项 + A0 顶层):
59   -- ` - [ ] Git 已初始化`
60   -- `- [ ] A0 项目初始化 — project-init`
61   -
62   -### D. 打印完成横幅并进入 A1
63   -
64   -向用户输出:
65   -
66   -```
67   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
68   - [project-init] 项目初始化完成
69   -
70   - 已创建:
71   - ✓ CLAUDE.md(从插件模板复制)
72   - ✓ docs/01-需求清单/index.md(待人工填写模块索引)
73   - ✓ docs/04-技术规范.md(默认技术栈,A1 让用户确认)
74   - ✓ docs/08-模块任务管理.md(全流程进度跟踪)
75   - 已勾选:A0 项目初始化
76   -
77   - 下一步:A1 scope-lock(填写项目概述 + 技术栈 + 需求索引 + REQ 卡片)
78   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
79   -```
80   -
81   -立即调用 `Skill(scope-lock)` 进入 A1,不等用户手动输入。
82   -
83   -## 参考
84   -
85   -- `${CLAUDE_SKILL_DIR}/templates/CLAUDE-template.md`(项目级 CLAUDE.md 模板)
86   -- `${CLAUDE_SKILL_DIR}/templates/docs-01-index-template.md`(需求索引初稿)
87   -- `${CLAUDE_SKILL_DIR}/templates/docs-04-stack-template.md`(默认技术栈)
88   -- `${CLAUDE_SKILL_DIR}/templates/docs-08-initial-template.md`(A 阶段进度初始化)
89   -- 下游:`scope-lock`(A1,自动派发)
skills/plan/project-init/banners/flow.txt deleted
1   -┌────────────────────────────────────────────────────────┐
2   -│ 📋 阶段 A:规划(一次性) │
3   -│ │
4   -│ ▶ A0 初始化项目 │
5   -│ ↓ │
6   -│ A1 锁范围(生成 REQ 卡片) → 人工审核 │
7   -│ ↓ │
8   -│ A2 生成骨架 │
9   -│ ↓ │
10   -│ A3 生成 DB 设计 → 人工审核 │
11   -│ ↓ │
12   -│ A4 初始化 DB │
13   -│ ↓ │
14   -│ A5 生成下游文档 │
15   -│ │
16   -│ 规划阶段到此结束 │
17   -└────────────────────────────────────────────────────────┘
skills/plan/project-init/templates/CLAUDE-template.md deleted
1   -# CLAUDE.md — ERP项目 Claude Code 主指令文件
2   -
3   -> 本文件是 Claude Code 的"操作手册"。Claude Code 启动时会自动读取此文件。
4   -
5   ----
6   -
7   -## 🎯 项目概述
8   -
9   -- **项目名称**: 【人工填写:公司 + 项目名,例如"XX 公司 ERP 管理系统"】
10   -- **项目简述**: 【人工填写:一句话描述项目目标,例如"面向中小制造企业的全流程 ERP,涵盖采购/库存/生产/销售/财务"】
11   -- **目标用户**: 【人工填写:谁会用,例如"企业内部管理人员(采购员、仓管员、生产主管、销售员、财务人员、管理层)"】
12   -- **部署方式**: 【人工填写:私有化部署 / 云部署 / Docker 容器化 等】
13   -
14   ----
15   -
16   -## 🔄 B 阶段开发流程(后端模块循环 → 前端整体阶段)
17   -
18   -B 阶段分两段,**全部固化到 skills**。入口:`/erp-workflow:coding-start`。
19   -
20   -### 阶段路由(coding-start 内,只做分发)
21   -
22   -`coding-start` 每次入口做两段完成性检查后真值表派发:
23   -
24   -- 后端完成性检查 → `backend_done`(扫 docs/08 § 二 里程碑字段 + `git tag -l`)
25   -- 前端完成性检查 → `frontend_done`(扫 docs/08 § 三 整体里程碑 + `git tag -l`)
26   -
27   -| `backend_done` | `frontend_done` | 派发 |
28   -|---|---|---|
29   -| `false` | 任意 | `module-start`(写后端) |
30   -| `true` | `false` | `frontend-start`(写前端) |
31   -| `true` | `true` | "所有阶段已完成" |
32   -
33   -前端阶段前置(prototype/ 门禁)由 `frontend-start` 自带,不在 coding-start。`module-start` 与 `frontend-start` **互不感知对方**。
34   -
35   -### 后端阶段(每模块一个里程碑 tag)
36   -
37   -- **模块循环(外)**:`module-start` → `test-gate(phase=backend)` → `module-report` → `milestone-tag`(本地 merge 进默认分支 + 打 `milestone/<id>` tag)→ 自动回调 coding-start 路由下一阶段(无人工介入)
38   -- **功能循环(内,每 REQ-XXX-NNN 一遍)**:`feature-brainstorm` → `feature-plan` → `feature-tdd` → `feature-verify` → `feature-review`
39   -- 后端阶段任务严格落在 `backend/` 路径下;docs/01 REQ 卡片的 UI 描述在此阶段忽略,UI 推迟到前端阶段。
40   -
41   -### 前端阶段(整体一个里程碑 tag,所有后端模块打里程碑后启动)
42   -
43   -- **FE 清单(AI 自主推导,无审阅断点)**:`frontend-start` 进入时扫 prototype + docs/01 + docs/05 → AI 自主推导 FE 业务功能清单写入 `docs/08 § 三`(已有则加载)。**FE 是业务功能粒度,与 prototype HTML 文件数无关**——一个 HTML 可拆多个 FE,多个 HTML 也可合成一个 FE。FE 清单的合理性由 fe-feature-review / milestone-tag 在整体里程碑标记时一并校核(全程无人工介入)。
44   -- **FE 循环(外)**:`frontend-start` → fe-feature 循环 → `test-gate(phase=frontend)` → `module-report(phase=frontend)` → `milestone-tag`(分支 `frontend-phase`,docs/08 § 三 整体里程碑)。
45   -- **FE 功能循环(内,每个 FE-NN 一遍)**:`fe-feature-brainstorm` → `fe-feature-plan` → `fe-feature-tdd` → `fe-feature-verify` → `fe-feature-review`(专用 `fe-code-reviewer` agent,硬编码 7 维 review checklist)
46   -- 前端阶段任务严格落在 `frontend/` 路径下;布局以 `prototype/` 为权威。
47   -
48   -### 里程碑前测试闸门
49   -
50   -- `test-gate`:后端阶段子会话跑 `scripts/test.sh`(含本模块新增 + 已合并模块回归);前端阶段子会话跑 vitest + playwright。
51   -- `test-gate` 是打里程碑 tag 前唯一的硬测试门;红色不得跳过进入 `module-report` / `milestone-tag`。
52   -
53   ----
54   -
55   -## ✅ 阶段完成判定规则
56   -
57   -`docs/08-模块任务管理.md` 分两段:
58   -- `§ 二`:后端模块元数据表(每个模块一行 bullet,记录依赖 / 路径 / 里程碑 tag / 功能子项)
59   -- `§ 三`:前端阶段元数据(整体里程碑 + FE 子项清单,由 `frontend-start` 在所有后端模块打里程碑后填入)
60   -
61   -**阶段完成判定**统一以 `里程碑:` 字段(§ 二 各模块) / `整体里程碑:` 字段(§ 三)+ 本地 `git tag -l 'milestone/<id>'` 判定;子项勾选只作可视化进度,不参与完成判定。
62   -
63   -### 后端模块格式
64   -
65   -每个后端模块在 docs/08 § 二 中长这样:
66   -
67   -```markdown
68   -- module_0 系统管理
69   - - 依赖: —
70   - - 路径: backend/module/sys/
71   - - 里程碑: —
72   - - 功能:
73   - - [ ] REQ-SYS-001 用户登录
74   - - [ ] REQ-SYS-002 用户注册
75   -```
76   -
77   -- `里程碑:` 字段由 `milestone-tag` 在打里程碑 tag 时从 `—` 改为 `milestone/<module_id>`。
78   -- 每个 `REQ-*` 子项由 `feature-review` 在 `verdict=approve` 时自动勾选为 `[x]`。
79   -- 路径限定为后端目录(如 `backend/module/sys/`);前端代码不在此阶段产生。
80   -
81   -### 前端阶段格式(§ 三)
82   -
83   -```markdown
84   -- 整体里程碑: —
85   -- 功能:
86   - - [ ] FE-01 用户登录与注册 | 关联 REQ:REQ-SYS-001, REQ-SYS-002 | 关联原型:prototype/auth.html
87   - - [ ] FE-02 仪表盘总览 | 关联 REQ:REQ-DASH-001 | 关联原型:prototype/dashboard.html
88   -```
89   -
90   -- `整体里程碑:` 字段由 `milestone-tag` 在打前端里程碑 tag 时从 `—` 改为 `milestone/frontend-phase`。
91   -- "功能:" 列表由 `frontend-start` 进入时由 AI 自主推导写入(无人工审阅断点)。FE 是业务功能粒度,与 prototype HTML 文件数无关;合理性由 fe-feature-review / 整体里程碑标记时统一校核。
92   -- 每个 `FE-NN` 子项由 `fe-feature-review` 在 `verdict=approve` 时自动勾选为 `[x]`。
93   -- 进入前端阶段前 `frontend-start` 步骤 1 自带 prototype/ 门禁,强制检查项目根 `prototype/` 至少含 1 个 `*.html` mockup。
94   -
95   -### 状态语义(后端模块 + 前端阶段共用)
96   -
97   -| `里程碑:` 字段 | `git tag -l` | 含义 | 你(Claude Code)的行为 |
98   -|---|---|---|---|
99   -| `—` | tag 不存在 | 该阶段未开始 / 进行中(未打里程碑) | ✅ 开始 / 继续该阶段开发 |
100   -| `milestone/<id>` | tag 存在 | 阶段**已完成** | 🟢 后端:进入下一未完成模块;后端全完 → 前端阶段;前端已打里程碑 → 全部完成 |
101   -
102   -### 模块完成报告
103   -
104   -由 `module-report` skill 产出,模板位于 由 module-report skill 持有(12 节标准化,含跨模块改动等 CLAUDE.md 软规则映射节)。CC 不手写模块报告,仅填模板。
105   -
106   ----
107   -
108   -## 🏷️ 占位符统一约定
109   -
110   -项目文档里有 **2 种填写占位** + **1 种提示占位**:
111   -
112   -| 格式 | 谁填 | 使用阶段 | 说明 |
113   -|------|-----|---------|------|
114   -| `【人工填写:<简短说明>】` | 人 | 仅 A 阶段文档 | 密钥 / 账密 / 包名 / 命名约定 / 小版本号等人工才能决定的值;B 阶段 plan/spec 禁止出现,查不到真值时用 `AskUserQuestion` 问用户 |
115   -| `TBD(<责任人>)` | CC 自动 | A 或 B | 后缀附带责任方(如 `TBD(A3 自动补)` / `TBD(A5 自动补)`);由对应 skill 就地补填,`module-report` § ⑦ 检查 `TBD(CC 补)` 残留 |
116   -
117   -**HTML 注释 `<!-- ... -->`**:提示占位,是**插件内部大纲模板**里给 LLM 的**填空提示 / 章节引导**,指引 LLM 按结构填实际内容。skill 生成时会**剥除**这些注释,最终产物里注释不会保留。
118   -
119   ----
120   -
121   -## 📐 编码行为约束
122   -
123   -### 你必须做的 ✅
124   -
125   -1. **严格遵循** `docs/04-技术规范.md`——命名 / 编码 / 统一响应 / 异常处理 / 数据访问 / 配置与安全 等项目专属技术规约全部在此
126   -2. **严格遵循** `docs/09-项目目录结构.md`——文件放对位置
127   -3. **每个后端接口** 必须先在 `docs/05-API接口契约.md` 定义,再编码实现
128   -4. **每个功能可追溯到 `REQ-XXX-NNN`**——commit tag + 代码注释(如 `// REQ-SYS-001: 用户登录`)+ plan/spec 文件名均用此 tag
129   -5. **遇到跨模块改动**(动到非当前模块的代码)——按 § 🟡 软规则 **S2** 执行(允许改,但必须留痕)
130   -6. **遇到技术栈外组件引入**(`docs/04 § 零` 技术栈表外的框架 / 中间件 / 关键库),按 § 🟡 软规则 **S1** 执行(允许引入,但必须先 AskUserQuestion)
131   -
132   -### 你禁止做的 🚫
133   -
134   -1. **主会话直接 `mysql -e` 跑业务 DDL**(只读查询 / 临时本地调试除外)——业务 schema 必须走 `sql/migrations/V_n__*.sql`,详见下方 Schema 演化规约
135   -2. **手动 Edit `docs/08 § 二/§ 三` 的 `里程碑:` / `整体里程碑:` 字段**,必须要由 `milestone-tag` 自动回写
136   -
137   -### Schema 演化规约(Flyway migration)
138   -
139   -1. **文件命名**:`sql/migrations/V<n>__<snake_case_desc>.sql`,例:`V5__add_user_email_unique_index.sql`
140   -2. **版本号分配**:建文件前 `ls sql/migrations/V*.sql` 查当前最大 n,新文件 `n_max + 1`
141   -3. **Apply 方式**:Spring Boot 启动 / 测试启动时 Flyway 自动 apply(项目必须在 `pom.xml` 声明 `flyway-core` + `flyway-mysql` 依赖)。`scripts/setup-test-db.sh` 只负责清空库,不做 apply
142   -4. **已合并的 migration 永不修改**:发现错了写一个补救 migration(如 `V7__fix_V5_index_name.sql`),旧 `V_n.sql`
143   -5. **临时调试 DDL**:临时在本地试字段/索引可手动 `mysql -e`,但不写 migration;下次 `setup-test-db.sh` 会 drop+create 清掉
144   -6. **A4 生成的 V1**:`V1__initial_schema.sql` 是 A 阶段由 `db-init` 从 `docs/03-数据库设计文档.md`(A3 正向设计的 schema SSoT)翻译生成的初始版本;后续 V2/V3/... 由 B 阶段每个 REQ 按需写入,**同时**反向同步更新 docs/03 对应表小节以保持 SSoT 一致
145   -
146   ----
147   -
148   -## 🗂️ Git 提交规范
149   -
150   -每次提交必须遵循以下格式:
151   -
152   -```
153   -<type>(<scope>): <subject>
154   -```
155   -
156   -- `scope`: 模块名,如 `user` / `inventory` / `order`
157   -- `subject`: 简短描述;业务类(feat / fix / test)必须带 `REQ-XXX-NNN` 后缀
158   -
159   -`type` 含义:
160   -
161   -| type | 看到它意味着 |
162   -|-----|-------------|
163   -| `feat` | **新能力上线**——用户多了一个功能、接口、页面或业务规则 |
164   -| `fix` | **修 bug**——原来行为错了,这次改对 |
165   -| `refactor` | **重构**——外部行为不变,只改代码结构 / 命名 / 抽象 |
166   -| `docs` | **文档改动**——只动 Markdown / 代码注释,不动实现 |
167   -| `style` | **格式调整**——空白 / 缩进 / import 顺序,逻辑 0 变化 |
168   -| `test` | **只动测试代码**——补用例 / 修 fixture,不碰实现 |
169   -| `chore` | **流程维护**——构建 / 依赖 / 工具 / 证据档案 / 里程碑元数据等非业务动作 |
170   -
171   ----
172   -
173   -## 🚩 中断机制
174   -
175   -功能循环(每个功能 REQ-XXX 的 Brainstorm → Plan → TDD → Verify → AI 自审)默认 **静默编程**,但触发以下任何一条必须**立刻停下、记录原因、等人决策**,不得自行绕过:
176   -
177   -| # | 中断 | 例子 |
178   -| - | --- | --- |
179   -| 1 | **测试反复失败** | 同一测试同一功能内连续 **10 次**修复失败 |
180   -| 2 | **要改密钥 / 账密 / 包名** | `docs/07-环境配置.md` 里由人工标注必须填的字段 |
181   -| 3 | **外部接口不可达** | 第三方 API 无法连接、证书失效等环境问题,并无法自行解决 |
182   -
183   -> 其余需要人类判断的场景一律走普通 `AskUserQuestion` Q&A,不中断、不写 Blocker 文件。
184   -
185   -**触发中断时的固定动作:**
186   -
187   -1. 在当前功能的 plan 文件里追加一节 `## 🚩 Blocker`(报告格式由 `interrupt-check` 的 `interrupt-block-template.md` 持有)
188   -2. 停止后续所有功能的静默执行
189   -3. 在主会话输出一句话摘要 + 指向 blocker 文件的路径,等人回复
190   -
191   ----
192   -
193   -## 🟡 软规则(允许继续,但有强制后续动作)
194   -
195   -以下情况 **不触发中断**,CC 可自行继续推进,但必须在约定位置留痕,模块完成时统一审计。
196   -
197   -| # | 软规则 | 允许动作 | 强制后续 |
198   -| - | ----- | ------- | ------- |
199   -| S1 | **技术栈外组件引入** | 用 `AskUserQuestion` 给用户三选一:接受引入 / 换方案 / 拒绝 | ① **接受** → 同会话直接在 `docs/04 § 零` 追加一行 → 继续流程 ② **换方案 / 拒绝** → 视为常规歧义澄清,继续 Q&A 收敛 ③ 不写 Blocker、不中断流程 |
200   -| S2 | **跨模块改动** | **默认不改**,仅为当前模块实现所必需时允许修改 | ① hook `log-cross-module.sh` 自动落存根 ② `module-report` 一次性调用 `cross-module-log` skill 批量补齐「原因 / 影响评估」+ 「跨模块改动」节完整贴入《模块完成报告》 |
201   -
202   ----
203   -
204   -## 🧭 通用工作准则(General Principles)
205   -
206   -### 1. Think Before Coding
207   -
208   -**Don't assume. Don't hide confusion. Surface tradeoffs.**
209   -
210   -Before implementing:
211   -- State your assumptions explicitly. If uncertain, ask.
212   -- If multiple interpretations exist, present them - don't pick silently.
213   -- If a simpler approach exists, say so. Push back when warranted.
214   -- If something is unclear, stop. Name what's confusing. Ask.
215   -
216   -### 2. Simplicity First
217   -
218   -**Minimum code that solves the problem. Nothing speculative.**
219   -
220   -- No features beyond what was asked.
221   -- No abstractions for single-use code.
222   -- No "flexibility" or "configurability" that wasn't requested.
223   -- No error handling for impossible scenarios.
224   -- If you write 200 lines and it could be 50, rewrite it.
225   -
226   -Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
227   -
228   -### 3. Surgical Changes
229   -
230   -**Touch only what you must. Clean up only your own mess.**
231   -
232   -When editing existing code:
233   -- Don't "improve" adjacent code, comments, or formatting.
234   -- Don't refactor things that aren't broken.
235   -- Match existing style, even if you'd do it differently.
236   -- If you notice unrelated dead code, mention it - don't delete it.
237   -
238   -When your changes create orphans:
239   -- Remove imports/variables/functions that YOUR changes made unused.
240   -- Don't remove pre-existing dead code unless asked.
241   -
242   -The test: Every changed line should trace directly to the user's request.
243   -
244   -### 4. Goal-Driven Execution
245   -
246   -**Define success criteria. Loop until verified.**
247   -
248   -Transform tasks into verifiable goals:
249   -- "Add validation" → "Write tests for invalid inputs, then make them pass"
250   -- "Fix the bug" → "Write a test that reproduces it, then make it pass"
251   -- "Refactor X" → "Ensure tests pass before and after"
252   -
253   -For multi-step tasks, state a brief plan:
254   -```
255   -1. [Step] → verify: [check]
256   -2. [Step] → verify: [check]
257   -3. [Step] → verify: [check]
258   -```
259   -
260   -Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
skills/plan/project-init/templates/docs-08-initial-template.md deleted
1   -# 08-工作流进度
2   -
3   -> 全流程进度跟踪。CC 每完成一项产出就勾选一项。
4   -> - **§ 一 Plan(A0~A5)**:`plan-start` 找第一个未勾 A 子项分发到对应 skill
5   -> - **§ 二 Coding(模块)**:分发以 `docs/02-开发计划.md § 二 开发顺序清单` 为准;`coding-start` 按 docs/02 顺序扫描,对每个 REQ 所属模块查询本 § 二的 `里程碑:` 字段 + 本地 `git tag -l 'milestone/<id>'`,找第一个未打里程碑模块分发。本 § 二 行序无语义,仅作模块元数据表
6   -
7   -## 一、Plan 阶段(一次性)
8   -
9   -- [ ] A0 项目初始化 — project-init
10   - - [ ] 依赖检查通过
11   - - [ ] 项目文件骨架已创建(CLAUDE.md + docs/01-需求清单/index.md + docs/04-技术规范.md)
12   - - [ ] Git 已初始化
13   -
14   -- [ ] A1 范围锁定 — scope-lock
15   - - [ ] 项目概述已填写(CLAUDE.md § 🎯 项目概述)
16   - - [ ] 技术栈已确认(docs/04 § 零)
17   - - [ ] 需求清单索引已填写(docs/01-需求清单/index.md)
18   - - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写)
19   -
20   -- [ ] A2 骨架生成 — skeleton-gen
21   - - [ ] 架构文档已生成(docs/04 § 一+、docs/06、docs/07、docs/09)
22   - - [ ] 工具脚本已生成(scripts/*.sh、.env.local)
23   - - [ ] .gitignore 已配置
24   -
25   -- [ ] A3 DB 设计 + REQ 回填 — db-design-gen
26   - - [ ] docs/03-数据库设计文档.md 已生成
27   - - [ ] docs/01 各 REQ 卡片"依赖表" + 模块头"涉及表" 已回填
28   -
29   -- [ ] A4 DB 初始化 — db-init
30   - - [ ] sql/migrations/V1__initial_schema.sql 已生成
31   - - [ ] DDL 与 docs/03 全量一致
32   - - [ ] .env.local 凭据已验证(mysql -e "SELECT 1" OK)
33   - - [ ] setup-test-db.sh 防护通过 + DROP+CREATE + apply V1 已执行
34   - - [ ] SHOW TABLES 行数 == docs/03 表数量
35   -
36   -- [ ] A5 下游文档生成 — downstream-gen
37   - - [ ] docs/02 开发计划已生成
38   - - [ ] docs/05 API 契约已生成
39   - - [ ] docs/06 § 三 页面清单已填入
40   - - [ ] docs/10 验收清单已生成
41   - - [ ] 下方模块列表已填入
42   - - [ ] REQ 卡片依赖接口已回填
43   -
44   -## 二、Coding 阶段(后端模块循环)
45   -
46   -(A5 填入后,每行一个后端模块。每个模块的 `里程碑:` 字段在 `—` 和 `milestone/<id>` 之间变化,完成由本地 `git tag -l` 判定。`coding-start` 每次按 docs/02 REQ 序扫每模块的里程碑 tag 决定派发。后端模块全部打里程碑后自动进入 § 三 前端阶段。)
47   -
48   -<!-- 模块格式示例(由 A5 downstream-gen 追加;功能子项由 feature-review 在 approve 时勾选):
49   -- module_0 系统管理
50   - - 依赖: —
51   - - 路径: backend/module/sys/
52   - - 里程碑: —
53   - - 功能:
54   - - [ ] REQ-SYS-001 用户登录
55   - - [ ] REQ-SYS-002 用户注册
56   --->
57   -
58   -## 三、Coding 阶段(前端整体)
59   -
60   -(`frontend-start` 进入时扫 prototype/ + docs/01 + docs/05 → AI 自主推导 FE 业务功能清单写到下方"功能:"项(无人工审阅断点;合理性由整体里程碑标记时统一校核)。已有清单则直接加载。整个前端阶段 1 个里程碑 tag,分支 `frontend-phase`。)
61   -
62   -- 整体里程碑: —
63   -- 功能:
64   - <!-- AI 进入时按以下行格式写入(每行 1 个 FE,可关联多个 REQ / 多份原型):
65   - - [ ] FE-NN 功能名 | 关联 REQ:REQ-A, REQ-B | 关联原型:prototype/<file>.html, prototype/<other>.html
66   -
67   - 示例:
68   - - [ ] FE-01 用户登录与注册 | 关联 REQ:REQ-SYS-001, REQ-SYS-002 | 关联原型:prototype/auth.html
69   - - [ ] FE-02 仪表盘总览 | 关联 REQ:REQ-DASH-001 | 关联原型:prototype/dashboard.html
70   - -->
skills/plan/scope-lock/SKILL.md deleted
1   ----
2   -name: scope-lock
3   -description: A1 计划范围锁定——引导用户填写项目概述 + 技术栈 + 需求索引,并按模块子目录生成 REQ 卡片骨架(CC 推断 req_id/title/goal/rules/constraints/acceptance;输入/输出 各含一句简述 + N 张示例字段表全部原样复制由人工编辑;依赖表/依赖接口模板写死 `TBD(A3/A5 自动补)` 由后续 skill 回填)。
4   -user-invocable: false
5   -allowed-tools: Read Edit Grep Skill AskUserQuestion Bash(mkdir *) Bash(cp *) Bash(sed *) Bash(bash *) Bash(cat *)
6   ----
7   -
8   -**所有输出必须使用中文。**
9   -
10   -# scope-lock
11   -
12   -## 执行步骤
13   -
14   -### 步骤 0:打印当前位置流程图
15   -
16   -用 `Bash` 执行 `cat` 命令向用户展示当前位置流程图(stdout 即 ASCII 框图):
17   -
18   -```bash
19   -cat "${CLAUDE_PLUGIN_ROOT}/skills/plan/scope-lock/banners/flow.txt"
20   -```
21   -
22   -### A. 提示用户填写项目概述并等待
23   -
24   -向用户输出:
25   -
26   -```
27   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
28   - [scope-lock] 请填写项目概述
29   -
30   - 📄 文件位置: ./CLAUDE.md
31   - 📌 编辑位置: § 🎯 项目概述
32   -
33   - 请将以下占位符替换为实际值:
34   - - 项目名称
35   - - 项目简述
36   - - 目标用户
37   - - 部署方式
38   - 改完后回来选择「继续」。
39   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
40   -```
41   -
42   -用 `AskUserQuestion` 询问:
43   -- **question**: `项目概述填写完毕了吗?`
44   - - 用户选择「继续」→ 用 `Grep` 在 `CLAUDE.md` 搜索 `【人工填写:`(限定 § 🎯 项目概述 节)。命中 → 打印残留行 + 路径,重新弹出同样的 AskUserQuestion;0 命中 → 勾选并进入步骤 B。
45   - - 用户选择「有疑问想先沟通」→ 回答用户问题后,再次弹出同样的 QA。
46   -
47   -0 命中后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
48   -- ` - [ ] 项目概述已填写(CLAUDE.md § 🎯 项目概述)`
49   -
50   -### B. 提示用户检查默认技术栈并等待
51   -
52   -`docs/04-技术规范.md` 已由 A0 `project-init` 用模板复制(默认技术栈,见 `project-init/templates/docs-04-stack-template.md`)。本步骤让用户检查 / 调整 § 零。
53   -
54   -向用户输出:
55   -
56   -```
57   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
58   - [scope-lock] 技术栈已保存
59   -
60   - 📄 文件位置: ./docs/04-技术规范.md(由 A0 模板生成)
61   - 📌 编辑位置: § 零、技术栈总览
62   -
63   - 请检查技术栈表:
64   - - 不需要的行直接删除(如纯后端项目删前端行)
65   - - 需要替换的技术直接改
66   - - 需要新增的条目直接加行
67   - 改完后回来选择「继续」。
68   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
69   -```
70   -
71   -用 `AskUserQuestion` 询问:
72   -- **question**: `技术栈检查完毕了吗?`
73   - - 用户选择「继续」→ 进入步骤 C。
74   - - 用户选择「有疑问想先沟通」→ 回答用户问题后,再次弹出同样的 QA。
75   -
76   -完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
77   -- ` - [ ] 技术栈已确认(docs/04 § 零)`
78   -
79   -### C. 提示用户填写需求清单并等待
80   -
81   -`docs/01-需求清单/index.md` 已由 `project-init` 写入占位符模板,这里让用户补齐模块清单。
82   -
83   -向用户输出:
84   -
85   -```
86   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
87   - [scope-lock] 请填写需求清单模块索引
88   -
89   - 📄 文件位置: ./docs/01-需求清单/index.md
90   - 📌 编辑位置: § 模块索引(表格)
91   -
92   - 请按业务列出所有模块:
93   - - 每行一个模块(如 SYS 系统管理 / PUR 采购 / SAL 销售)
94   - - 「核心功能点」只需关键词,CC 会拆分为 REQ 卡片
95   - 改完后回来选择「继续」。
96   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
97   -```
98   -
99   -用 `AskUserQuestion` 询问:
100   -- **question**: `需求清单模块索引填写完毕了吗?`
101   - - 用户选择「继续」→ 进入步骤 D。
102   - - 用户选择「有疑问想先沟通」→ 回答用户问题后,再次弹出同样的 QA。
103   -
104   -完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选:
105   -- ` - [ ] 需求清单索引已填写(docs/01-需求清单/index.md)`
106   -
107   -### D. 生成 REQ 卡片骨架并停下等人工审阅
108   -
109   -1. 用 `Grep` 校验 `docs/01-需求清单/index.md` 无 `【人工填写:` 残留;有则回步骤 C。
110   -2. 用 `Read` 读 `index.md` 解析模块索引。
111   -3. **单次 Bash 写入所有文件**(替代 N×9 次 Edit):
112   -
113   - - **每模块推断**:三元组 `{module_code, module_name, module_brief}` + N 个 REQ 的六元组 `{req_id, title, goal, rules, constraints, acceptance}`。`req_id`/`title` 从核心功能点拆分;`goal` 展开 `title`;`rules`/`constraints`/`acceptance` 起草业务语义。**不推断**输入 / 输出(模板原样保留示例)。
114   - - **单次 Bash**:调 `${CLAUDE_SKILL_DIR}/scripts/render.sh` 落盘所有文件(脚本内部完成模板读取 + 占位符替换 + HTML 注释剥离)。下面是**调用形态**示例,`<MOD>` / `<模块名>` / `<REQ-MOD-NNN>` 等尖括号位置 CC 按 `index.md` 实际值替换:
115   -
116   - ```bash
117   - R="${CLAUDE_SKILL_DIR}/scripts/render.sh"
118   - # 每个模块:mkdir + 1 个 render module + N 个 render req(每 REQ 一行)
119   - mkdir -p "docs/01-需求清单/<MOD>-<模块名>"
120   - bash "$R" module "docs/01-需求清单/<MOD>-<模块名>/_module.md" "<MOD>" "<模块名>" "<module_brief>"
121   - bash "$R" req "docs/01-需求清单/<MOD>-<模块名>/<REQ-MOD-NNN>.md" "<REQ-MOD-NNN>" "<title>" "<goal>" "<rules>" "<constraints>" "<acceptance>"
122   - ```
123   -
124   - - **兜底**:值含字面 `$xxx` 或 `}}` 的 REQ 单独走 cp + Edit。
125   -4. 用 `Edit` 在 `docs/08-模块任务管理.md` 勾选(A1 子项 + A1 顶层):
126   - - ` - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写)`
127   - - `- [ ] A1 范围锁定 — scope-lock`
128   -5. 打印停下横幅并**停止**:
129   -
130   -```
131   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
132   - [scope-lock] ✅ A1 范围锁定完成
133   -
134   - 产出:
135   - ✓ CLAUDE.md § 🎯 项目概述
136   - ✓ docs/04 § 零 技术栈
137   - ✓ docs/01-需求清单/index.md 模块索引
138   - ✓ docs/01-需求清单/<module>/_module.md 模块头
139   - ✓ docs/01-需求清单/<module>/REQ-*.md REQ 卡片骨架
140   -
141   - ⏸ 现在请你逐张打开 REQ 卡片:
142   - - **必改**:输入 / 输出 两段
143   - · `表1` / `表2` 是模板示例,按本 REQ 业务**改字段 / 增删行 / 增删整张表**
144   - - **审阅**:目标 / 跨字段规则 / 边界 / 验收(已起草,对照业务校正)
145   - - **保留**:`TBD` 不要改,由之后流程自动回填
146   -
147   - 审阅完成后,运行以下命令继续进入 A2:
148   - /erp-workflow:plan-start
149   -
150   -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
151   -```
152   -
153   -## 参考
154   -
155   -- `CLAUDE.md` § 🎯 项目概述(写入目标)
156   -- `docs/04-技术规范.md`(技术栈输出,供 skeleton-gen 读取使用)
157   -- `docs/01-需求清单/index.md`(模块索引输入)
158   -- `docs/01-需求清单/<module>/_module.md`(模块头输出)
159   -- `docs/01-需求清单/<module>/REQ-*.md`(REQ 卡片骨架输出,A3 db-design-gen / A5 downstream-gen 会回填 TBD 字段)
160   -- `${CLAUDE_SKILL_DIR}/templates/req-card-template.md`
161   -- `${CLAUDE_SKILL_DIR}/templates/_module-template.md`
162   -- `${CLAUDE_SKILL_DIR}/scripts/render.sh`(步骤 D 渲染助手,dispatch `module` / `req` 两种模式)
skills/plan/scope-lock/banners/flow.txt deleted
1   -┌────────────────────────────────────────────────────────┐
2   -│ 📋 阶段 A:规划(一次性) │
3   -│ │
4   -│ A0 初始化项目 │
5   -│ ↓ │
6   -│ ▶ A1 锁范围(生成 REQ 卡片) → 人工审核 │
7   -│ ↓ │
8   -│ A2 生成骨架 │
9   -│ ↓ │
10   -│ A3 生成 DB 设计 → 人工审核 │
11   -│ ↓ │
12   -│ A4 初始化 DB │
13   -│ ↓ │
14   -│ A5 生成下游文档 │
15   -│ │
16   -│ 规划阶段到此结束 │
17   -└────────────────────────────────────────────────────────┘