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.sqlsql/seed-data.sql 都已生成。
  • erp-scope-lock 已完成:docs/01-需求清单/<module>-*.md REQ 卡片存在,含 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

  1. Read 读取 ${CLAUDE_SKILL_DIR}/templates/docs-03-header-template.md,填充 schema_nameer_overviewtables[]
  2. 对每张表,用 Read 读取 ${CLAUDE_SKILL_DIR}/templates/docs-03-table-template.md,填充并追加。
  3. 每个字段的业务含义:
    • 如果 column_comment 非空,直接用
    • 否则从 A1 生成的 REQ 卡片上下文推断
  4. Write 写入 docs/03-数据库设计文档.md

C. 回填 REQ 卡片的 TBD 字段

  1. Glob 列出 docs/01-需求清单/*.md(排除 README.md)。
  2. Grep 在这些文件中搜索 TBD(A4 自动补)行号(不读全文)。
  3. 对每个命中的 REQ:
    • Read 仅读取该 REQ 卡片所在的片段(REQ 标题行前后 20 行)
    • 根据 goal / input / output 推断引用的表
    • Edit依赖表: TBD(A4 自动补)依赖表: <table1>, <table2>(具体表名)
    • 不动 依赖接口: TBD(A5 自动补)——那行由 A5 erp-downstream-gen 生成 docs/05 后回填
  4. 打印回填统计:A4 回填 N 处 schema_refs

D. 一致性检查

  1. Grepdocs/01-需求清单/*.md 搜索 依赖表:,抽取所有表名。
  2. Grepdocs/03-数据库设计文档.md 搜索表标题(每张表一行 ### table_name)。
  3. 比对:
    • REQ 提到但 docs/03 没有的表 → 报错停下(schema 与需求不一致;请确认是 REQ 理解错误还是需要新增 migration)
    • docs/03 有但没 REQ 引用 → 警告但不停下(可能是未使用表)
  4. Grepdocs/01-需求清单/*.md 中搜索 TBD(A4 自动补):应 0 命中(A4 已把所有 schema_refs 回填完);若仍有,打印残留 REQ 清单并停下。

E. 勾选 docs/08 进度 + 进入 A5

Editdocs/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(回填目标)