SKILL.md
8.3 KB
name: db-design-gen description: A3 DB 设计 + REQ 回填——基于 docs/01-需求清单//REQ-*.md 正向设计 docs/03-数据库设计文档.md(业务实体 → 表 + 字段 + 索引 + 外键 + 业务注记),并把回填值写入 REQ 卡片的「依赖表: TBD(A3 自动补)」与模块头的「涉及表: TBD(A3 自动补)」占位。生成完毕停下等人工审阅。 user-invocable: false
allowed-tools: Read Write Edit Grep Glob Skill AskUserQuestion
所有输出必须使用中文。
db-design-gen
前置条件
- A1
scope-lock已完成:docs/01-需求清单/<module>/_module.md+docs/01-需求清单/<module>/REQ-*.md已生成,含TBD(A3 自动补)占位。 - A2
skeleton-gen已完成:docs/04-技术规范.md § 一+命名规范已生成(本 skill 推导表/字段命名时严格遵循)。
执行步骤
步骤 0:打印当前位置流程图
向用户展示当前在 A 阶段流程中的位置(A-only,▶ 标在 A3):
┌──────────────────────────────────────────────────────┐
│ 📋 阶段 A:规划(一次性) │
│ │
│ A0 初始化项目 → A1 锁范围(REQ 卡片) │
│ ↓ │
│ ⏸ 等你审阅 REQ,重新运行 /plan-start 继续 │
│ ↓ │
│ A2 生成骨架 → ▶ A3 生成 DB 设计 → A4 初始化 DB → A5 生成下游文档│
│ ↓ │
│ ⏸ 等你审阅 docs/03,重新运行 /plan-start 继续 │
└──────────────────────────────────────────────────────┘
A. 读取设计输入
用 Read / Glob 读取:
-
docs/04-技术规范.md§ 一+ 命名规范(表名 / 字段名 / 索引名 / 外键名约定,及主键 / 时间戳 / 软删等审计列约定) -
docs/01-需求清单/index.md模块索引(模块代码 ↔ 中文名) -
docs/01-需求清单/*/REQ-*.md所有 REQ 卡片,提取req_id/goal/输入(主表+从表的字段清单)/输出(主表+从表的字段清单)/跨字段规则/边界/验收
B. LLM 推导 schema
基于步骤 A 读到的 REQ + 命名规范,正向推导业务实体 → 表 + 字段 + 索引 + 外键。要求:
-
表名 / 列名 / 索引名 / 外键名 严格套用
docs/04 § 一+的命名规范 -
审计列:除明确不需要的辅助表外,每张业务表至少含
created_at/updated_at;如docs/04 § 一+约定了created_by/updated_by/ 软删deleted_at,一并补全 -
主键:默认
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,除非 REQ 明确要求复合主键 / UUID / 业务主键 -
外键:依据 REQ 中的引用关系(如「订单引用客户」),明确列出
ON DELETE/ON UPDATE策略;不能确定时默认RESTRICT - 索引:根据 REQ 的查询模式(如"按时间范围查"、"按状态筛选")推导业务索引;外键列默认建索引
- 业务注记:对每张表用一两句话说明业务用途、关键约束、与其他表的关系
如果某 REQ 表述模糊以致无法推断关键 schema 细节(如:枚举值范围 / 字段长度上限 / 必填性),先按合理默认推导并在该字段「业务含义」列加 [需用户审阅] 标注,待步骤 E 用户审阅时调整;不打断本次推导。
C. 渲染 docs/03
- 用
Read读取${CLAUDE_SKILL_DIR}/templates/docs-03-header-template.md,填充schema_name(从.env.local读DB_SCHEMA,无则填【人工填写:DB_SCHEMA】)、er_overview(基于步骤 B 表关系生成的纯文本 ER 概览)。 - 渲染「表清单」:每行
- \` — <一句话用途>`。 - 对每张表:用
Read读取${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md,填充字段 / 索引 / 外键 / 业务注记。 - 用
Write写入docs/03-数据库设计文档.md。
D. 回填模块头 + REQ 卡片的 TBD 字段
- 用
Glob列出docs/01-需求清单/*/_module.md(模块头)和docs/01-需求清单/*/REQ-*.md(REQ 卡片)。 - 用
Grep在这些文件中搜索TBD(A3 自动补)的行号(不读全文)。两种行命中:-
涉及表: TBD(A3 自动补)→ 模块级(仅在_module.md,每文件一次) -
依赖表: TBD(A3 自动补)→ REQ 级(仅在REQ-*.md,每文件一次)
-
- 对每个命中行按类型回填:
-
模块级
涉及表(_module.md):用Read取该文件module_code+module_name,聚合步骤 B 中所有归属该模块的表(多表用,分隔);Edit替换为涉及表: <table1>, <table2>, ... -
REQ 级
依赖表(REQ-*.md):从文件名直接得req_id(REQ-USR-001.md→REQ-USR-001);根据步骤 B 推导结果定位该 REQ 关联的表;Edit替换为依赖表: <table1>, <table2> -
不动
TBD(A5 自动补)的两种行(依赖接口REQ 级 /依赖模块模块级)—— 由 A5downstream-gen生成 docs/05 + 完成模块 DAG 后回填
-
模块级
- 用
Grep再次扫TBD(A3 自动补)应 0 命中;仍有残留则打印残留位置清单并停下。 - 打印回填统计:
A3 回填 <M> 处模块涉及表 + <N> 处 REQ schema_refs。
E. 勾选 docs/08 自动项 + 停下等人工审阅
-
用
Edit在docs/08-模块任务管理.md勾选 2 个自动项(不勾第 3 个人工闸门,由用户审阅后自己勾):-
- [ ] docs/03-数据库设计文档.md 已生成→[x] -
- [ ] docs/01 各 REQ 卡片"涉及数据表"已回填→[x] -
- [ ] 用户已审阅 docs/03 表结构保持[ ](人工勾) -
- [ ] A3 DB 设计 + REQ 回填 — db-design-gen保持[ ](最后一个子项勾后再勾父项)
-
输出
db-design-gen: docs/03 已生成 + N 处 REQ 已回填依赖表。打印停下横幅并停下(不调
Skill(db-init),A4 由用户审阅后手动恢复):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[db-design-gen] ✅ A3 DB 设计完成
产出:
✓ docs/03-数据库设计文档.md
✓ docs/01-需求清单/<module>/REQ-*.md 依赖表已回填 + _module.md 涉及表已回填
⏸ 现在请你审阅 docs/03(表 / 字段 / 索引 / 外键 / 业务注记)。
重点关注:
- 业务实体覆盖是否完整
- 字段类型 / 长度 / 是否可空 / 默认值是否合理
- 索引是否覆盖主要查询模式
- 外键 ON DELETE / ON UPDATE 策略是否符合业务
- 字段「业务含义」列含 `[需用户审阅]` 标注的位置需逐一确认
审阅完成后,到 docs/08 § 一 把 A3 的「用户已审阅 docs/03 表结构」
手动勾上(`[ ]` → `[x]`),然后再勾父项 `- [ ] A3 DB 设计 + REQ 回填`,
再运行:
/erp-workflow:plan-start
(入口会读取 docs/08 进度,自动派发到 A4 db-init)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
停止,不调用任何下游 skill。
不变量
- 本 skill 不连接任何数据库,纯文档驱动;MySQL 连接验证 / DDL apply 由 A4
db-init负责 - REQ 卡片的
依赖接口字段不在此处填充,留给 A5downstream-gen在生成 docs/05 后按TBD(A5 自动补)回填 - DB 设计与 REQ 卡片同等重要,必须留出人工审阅闸门,避免 LLM 推导的表结构未经把关就被 A4 翻译成 DDL 并 apply 到 MySQL
参考
${CLAUDE_SKILL_DIR}/templates/docs-03-header-template.md${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md-
docs/04-技术规范.md§ 一+(命名规范输入) -
docs/01-需求清单/<module>/_module.md(模块头:回填涉及表) -
docs/01-需求清单/<module>/REQ-*.md(REQ 输入 + 回填依赖表)