SKILL.md
5.64 KB
name: erp-db-design-gen description: A4 DB 设计生成 + REQ 回填——用 mysql CLI 反查 schema 生成 docs/03-数据库设计文档.md;然后用 Grep 在 docs/01-需求清单/*.md 定位 TBD(A4 自动补) 替换为实际表/字段引用。 user-invocable: false
allowed-tools: Read Write Edit Grep Glob Skill Bash(mysql *) Bash(source *)
所有输出必须使用中文。
erp-db-design-gen
前置条件
-
erp-db-init已完成:.env.local凭据已填,sql/migrations/V1__initial_schema.sql和sql/seed-data.sql都已生成。 -
erp-scope-lock已完成:docs/01-需求清单/<module>-*.mdREQ 卡片存在,含TBD(A4 自动补)占位。
执行步骤
步骤 0:打印当前位置流程图
向用户展示当前在 A 阶段流程中的位置(A-only,▶ 标在 A4):
┌──────────────────────────────────────────────────────┐
│ 📋 阶段 A:规划(一次性) │
│ │
│ A0 初始化项目 → A1 锁范围(REQ 卡片) │
│ ↓ │
│ ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续 │
│ ↓ │
│ A2 生成骨架 → A3 初始化 DB → ▶ A4 生成 DB 设计 → A5 生成下游文档│
│ ↓ │
│ 规划阶段到此结束 │
└──────────────────────────────────────────────────────┘
A. 查询实时 schema
用 Bash source .env.local 后查询:
source .env.local
MYSQL_CMD="mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWORD} -N -B"
# 表列表 + 注释
$MYSQL_CMD -e "SELECT table_name, table_comment FROM information_schema.tables WHERE table_schema='${DB_SCHEMA}' AND table_type='BASE TABLE' ORDER BY table_name;"
# 字段详情
$MYSQL_CMD -e "SELECT table_name, column_name, column_type, is_nullable, column_default, column_comment FROM information_schema.columns WHERE table_schema='${DB_SCHEMA}' ORDER BY table_name, ordinal_position;"
# 外键
$MYSQL_CMD -e "SELECT table_name, column_name, referenced_table_name, referenced_column_name FROM information_schema.key_column_usage WHERE table_schema='${DB_SCHEMA}' AND referenced_table_name IS NOT NULL;"
# 索引
$MYSQL_CMD -e "SELECT table_name, index_name, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols, non_unique FROM information_schema.statistics WHERE table_schema='${DB_SCHEMA}' GROUP BY table_name, index_name, non_unique;"
在内存中将结果解析为结构化列表,只保留表名、字段名与关键元信息,不把查询结果完整写入会话上下文。
B. 生成 docs/03
- 用
Read读取${CLAUDE_SKILL_DIR}/templates/docs-03-header-template.md,填充schema_name、er_overview、tables[]。 - 对每张表,用
Read读取${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md,填充并追加。 - 每个字段的业务含义:
- 如果
column_comment非空,直接用 - 否则从 A1 生成的 REQ 卡片上下文推断
- 如果
- 用
Write写入docs/03-数据库设计文档.md。
C. 回填 REQ 卡片的 TBD 字段
- 用
Glob列出docs/01-需求清单/*.md(排除README.md)。 - 用
Grep在这些文件中搜索TBD(A4 自动补)的行号(不读全文)。 - 对每个命中的 REQ:
- 用
Read仅读取该 REQ 卡片所在的片段(REQ 标题行前后 20 行) - 根据
goal/input/output推断引用的表 - 用
Edit:依赖表: TBD(A4 自动补)→依赖表: <table1>, <table2>(具体表名) -
不动
依赖接口: TBD(A5 自动补)——那行由 A5erp-downstream-gen生成 docs/05 后回填
- 用
- 打印回填统计:
A4 回填 N 处 schema_refs。
D. 一致性检查
- 用
Grep在docs/01-需求清单/*.md搜索依赖表:,抽取所有表名。 - 用
Grep在docs/03-数据库设计文档.md搜索表标题(每张表一行### table_name)。 - 比对:
- REQ 提到但 docs/03 没有的表 → 报错停下(schema 与需求不一致;请确认是 REQ 理解错误还是需要新增 migration)
- docs/03 有但没 REQ 引用 → 警告但不停下(可能是未使用表)
- 用
Grep在docs/01-需求清单/*.md中搜索TBD(A4 自动补):应 0 命中(A4 已把所有 schema_refs 回填完);若仍有,打印残留 REQ 清单并停下。
E. 勾选 docs/08 进度 + 进入 A5
用 Edit 在 docs/08-模块任务管理.md 勾选 4 个 checkbox(A4 的 3 个子项 + A4 父项):
-
- [ ] docs/03 数据库设计已生成→[x] -
- [ ] REQ 卡片依赖表已回填→[x] -
- [ ] schema 一致性检查通过→[x] -
- [ ] A4 DB 设计 + REQ 回填 — erp-db-design-gen→[x]
输出 db-design-gen: 完成(<T> 张表, <R> 个 REQ 已回填依赖表;依赖接口留给 A5)。
立即调用 Skill(erp-downstream-gen) 进入 A5,不等用户手动输入。
不变量
- REQ 卡片的
依赖接口字段不在此处填充,留给 A5 的erp-downstream-gen先生成 docs/05 API 契约后按TBD(A5 自动补)回填。
参考
${CLAUDE_SKILL_DIR}/templates/docs-03-header-template.md${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md-
.env.local(DB 凭据) -
docs/01-需求清单/*.md(回填目标)