SKILL.md 6.74 KB

name: erp-db-init description: A3 验证 MySQL 连接 + 导出当前 schema 为 sql/migrations/V1__initial_schema.sql(Flyway 初始 migration,DDL only)+ 导出当前数据为 sql/seed-data.sql(INSERT only)。不执行任何 DDL。 user-invocable: false

allowed-tools: Read Write Edit Glob Skill Bash(mkdir ) Bash(mysql *) Bash(mysqldump *) Bash(source *) Bash(sed *) Bash(cat *) Bash(rm sql/migrations/.raw) Bash(rm sql/*.raw) Bash(grep *)

所有输出必须使用中文。

erp-db-init

执行步骤

步骤 0:打印当前位置流程图

向用户展示当前在 A 阶段流程中的位置(A-only, 标在 A3):

┌──────────────────────────────────────────────────────┐
│ 📋 阶段 A:规划(一次性)                               │
│                                                       │
│   A0 初始化项目 → A1 锁范围(REQ 卡片)                 │
│                          ↓                            │
│     ⏸ 等你审阅 REQ,重新运行 /erp-plan-start 继续      │
│                          ↓                            │
│   A2 生成骨架 → ▶ A3 初始化 DB → A4 生成 DB 设计 → A5 生成下游文档│
│                                  ↓                    │
│                    规划阶段到此结束                     │
└──────────────────────────────────────────────────────┘

A. 防御性检查 .env.local

Glob 检查 .env.local 是否存在。

  • 存在 → 进入步骤 B。
  • 不存在 → 向用户输出:
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   [erp-db-init] ⚠️ .env.local 缺失

   可能是被误删。请先重新运行 erp-skeleton-gen 重建,
   或手动从 .env.local.example 复制并填写 DB_HOST / DB_PORT / DB_USER / DB_PASSWORD / DB_SCHEMA。
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

B. 验证 MySQL 连接

Bash 执行(先 source .env.local 加载变量):

source .env.local && mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "USE \`$DB_SCHEMA\`; SHOW TABLES;"
  • 成功 → 记录表列表,继续步骤 C。
  • 失败 → 向用户输出具体错误(认证失败 / schema 不存在 / 主机不可达等),提示检查 .env.local停下

C. 导出当前 schema 为 V1 initial migration

Bash 执行 mysqldump(仅 DDL,不含数据):

mkdir -p sql/migrations && source .env.local && mysqldump --no-data --skip-comments -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_SCHEMA" > sql/migrations/V1__initial_schema.sql.raw

如果 mysqldump 命令不存在,向用户输出具体错误(提示安装 mysql-client / brew install mysql-client 等)并停下(mysql 和 mysqldump 是 A0 erp-project-init 的前置依赖,正常情况下应已就绪)。

D. 加头部写入 V1 最终 migration 文件

严禁Read 读取 .sql.raw(dump 可能有几千行,会撑爆上下文)。用纯 shell 拼接:

PROJECT="<从 CLAUDE.md 读到的项目名称>"
TS="$(date -u +%FT%TZ)"
source .env.local
{
  sed -e "s|{{project_name}}|$PROJECT|g" \
      -e "s|{{timestamp}}|$TS|g" \
      -e "s|{{schema_name}}|$DB_SCHEMA|g" \
      "${CLAUDE_SKILL_DIR}/templates/migration-v1-header-template.sql"
  cat sql/migrations/V1__initial_schema.sql.raw
} > sql/migrations/V1__initial_schema.sql
rm sql/migrations/V1__initial_schema.sql.raw

说明:

  • sed 替换 header 模板里的 3 个槽位
  • cat 追加 dump 内容
  • 全程不经过 LLM 上下文

E. 导出当前数据为 seed-data.sql

Bash 执行 mysqldump(仅数据,INSERT only):

source .env.local && mysqldump --no-create-info --complete-insert --skip-comments --skip-extended-insert \
  -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_SCHEMA" > sql/seed-data.sql.raw

拼接 header 模板 + raw:

PROJECT="<从 CLAUDE.md 读到的项目名称>"
TS="$(date -u +%FT%TZ)"
source .env.local
{
  sed -e "s|{{project_name}}|$PROJECT|g" \
      -e "s|{{timestamp}}|$TS|g" \
      -e "s|{{schema_name}}|$DB_SCHEMA|g" \
      "${CLAUDE_SKILL_DIR}/templates/seed-data-sql-template.sql"
  echo ""
  echo "SET FOREIGN_KEY_CHECKS = 0;"
  echo ""
  cat sql/seed-data.sql.raw
  echo ""
  echo "SET FOREIGN_KEY_CHECKS = 1;"
} > sql/seed-data.sql
rm sql/seed-data.sql.raw

说明:

  • 本地 MySQL 里已有的数据就是测试数据集,直接 dump 下来
  • --complete-insert 让 INSERT 含列名,schema 演化后仍可读
  • --skip-extended-insert 让每行一条 INSERT,diff 友好
  • 全程不经过 LLM 上下文

F. 验证 + 勾选 docs/08 进度 + 进入 A4

  1. Bash 执行 grep -c "CREATE TABLE" sql/migrations/V1__initial_schema.sql 统计表数量,与步骤 B 记录的表数对比。不一致 → 报错停下。

  2. Bash 执行 grep -c "INSERT INTO" sql/seed-data.sql 统计数据行数:

    • > 0:正常
    • = 0:提示"本地 DB 无数据,seed-data.sql 为空(只有 header 注释);如需测试数据,请在本地 MySQL 插入后重新运行 A3",允许继续
  3. Editdocs/08-模块任务管理.md 勾选 5 个 checkbox(A3 的 4 个子项 + A3 父项):

    • - [ ] .env.local 凭据验证通过[x]
    • - [ ] MySQL 连接验证通过[x]
    • - [ ] V1 initial migration 已生成(sql/migrations/V1__initial_schema.sql,DDL only)[x]
    • - [ ] sql/seed-data.sql 已导出(本地数据快照,INSERT only)[x]
    • - [ ] A3 DB 初始化 — erp-db-init[x]
  4. 输出 db-init: 完成(schema=<名称>, tables=<T>, V1 migration ✓, seed rows=<R>)

  5. 立即调用 Skill(erp-db-design-gen) 进入 A4,不等用户手动输入。

不变量

  • 密码通过 .env.localsource 注入,不硬编码在命令里。
  • 本 skill 产生 V1 initial migration 和 seed-data.sql 快照;后续 V2/V3 及业务数据变化由 B 阶段 erp-feature-tdd 在 REQ 实现时写入。

参考

  • ${CLAUDE_SKILL_DIR}/templates/migration-v1-header-template.sql
  • ${CLAUDE_SKILL_DIR}/templates/seed-data-sql-template.sql
  • 产物 1:sql/migrations/V1__initial_schema.sql(由 Flyway 在 Spring Boot 启动时自动 apply)
  • 产物 2:sql/seed-data.sql(由开发者选一种方式装载:@Sql / R__seed / data.sql)