From 62d2fb9e50440ed5a52ca435a6eef91331d66239 Mon Sep 17 00:00:00 2001 From: zichun Date: Fri, 29 May 2026 15:51:42 +0800 Subject: [PATCH] db-init: drop step-B connectivity probe; converge duplicate A4 checkboxes --- skills/plan/db-init/SKILL.md | 54 +++++++----------------------------------------------- skills/plan/project-init/templates/docs-08-initial-template.md | 5 ++--- 2 files changed, 9 insertions(+), 50 deletions(-) diff --git a/skills/plan/db-init/SKILL.md b/skills/plan/db-init/SKILL.md index f0df304..a7fddb3 100644 --- a/skills/plan/db-init/SKILL.md +++ b/skills/plan/db-init/SKILL.md @@ -1,8 +1,8 @@ --- name: db-init -description: A4 DB 初始化——LLM 解析 docs/03-数据库设计文档.md → 生成 sql/migrations/V1__initial_schema.sql(DDL only,Flyway 初始 migration)→ 用 lib/validate-ddl.mjs 全量校验 DDL ↔ docs/03 一致性 → 验证 MySQL 连接 → 调 scripts/setup-test-db.mjs DROP+CREATE 空库 → 用 lib/apply-ddl.mjs apply V1。 +description: A4 DB 初始化——LLM 解析 docs/03-数据库设计文档.md → 生成 sql/migrations/V1__initial_schema.sql(DDL only,Flyway 初始 migration)→ 用 lib/validate-ddl.mjs 全量校验 DDL ↔ docs/03 一致性 → 校验 config-vars.yaml DB 凭据 5 项非空 → 调 scripts/setup-test-db.mjs DROP+CREATE 空库(连不上即失败)→ 用 lib/apply-ddl.mjs apply V1。 user-invocable: false -allowed-tools: Read Write Edit Glob Skill Bash(node *) +allowed-tools: Read Write Edit Skill Bash(node *) --- **所有输出必须使用中文。** @@ -52,54 +52,15 @@ node "${CLAUDE_PLUGIN_ROOT}/lib/validate-ddl.mjs" \ 完成后(V1 写入并通过 `validate-ddl.mjs` 校验),勾选: - ` - [ ] sql/migrations/V1__initial_schema.sql 已生成` -- ` - [ ] DDL 与 docs/03 全量一致` +- ` - [ ] DDL ↔ docs/03 5 维一致(validate-ddl.mjs)` ### B. 数据库环境检查 -用 `Glob` 确认 `config-vars.yaml` 存在(不存在 → 提示重跑 A1 `scope-lock` 并停下)。用 `Read` 读其 `database:` 段,校验 `host` / `port` / `user` / `password` / `schema` 5 项均非空且非 `【人工填写` 占位——任一缺失 → 打印缺失字段并停下。 +用 `Read` 读 `config-vars.yaml` 的 `database:` 段(文件缺失 → 提示重跑 A1 `scope-lock` 并停下),校验 `host` / `port` / `user` / `password` / `schema` 5 项均非空且非 `【人工填写` 占位——任一缺失 → 打印缺失字段并停下。 -用解析出的值跑连通性自检。必须用 Node `spawnSync('mysql', args, {shell:false})`,不要把密码拼进 shell 命令;空密码也要传 `--password=`,避免 `mysql -p` 进入交互式等待。下面的 `node -e` 内联了与 `lib/yaml-config.mjs` 同规则的极简 YAML 读取(2 层 map + 标量),仅读 `database:` 段: +连通性无需在此单独探测:步骤 C.1 的 `setup-test-db.mjs` 会用同一份凭据连同一个 MySQL 跑 `DROP+CREATE`,连不上即报错(认证 / 主机不可达 / 端口拒接);且 `DROP DATABASE IF EXISTS` 在连不上时不破坏任何东西,由 C.1 失败即可。 -```bash -node -e ' -const { spawnSync } = require("node:child_process"); -const { readFileSync } = require("node:fs"); -const SQ = String.fromCharCode(39), DQ = String.fromCharCode(34); -function parseScalar(raw) { - let s = String(raw).trim(); - if (s === "" || s[0] === "#") return ""; - const q = s[0]; - if (q === SQ || q === DQ) { const e = s.indexOf(q, 1); if (e !== -1) return s.slice(1, e); } - const h = s.indexOf(" #"); if (h !== -1) s = s.slice(0, h).trim(); - return s; -} -const cfg = {}; let sec = null; -for (const raw of readFileSync("config-vars.yaml", "utf8").split(/\r?\n/)) { - const t = raw.trim(); if (!t || t[0] === "#") continue; - const c = raw.indexOf(":"); if (c < 0) continue; - const k = raw.slice(0, c).trim(); if (!k) continue; - const ind = raw.length - raw.replace(/^\s+/, "").length; - const v = parseScalar(raw.slice(c + 1)); - if (ind === 0) { if (v === "") { sec = {}; cfg[k] = sec; } else { cfg[k] = v; sec = null; } } - else if (sec) { sec[k] = v; } -} -const db = cfg.database || {}; -const args = [ - `--host=${db.host}`, - `--port=${db.port || "3306"}`, - `--user=${db.user}`, - `--password=${db.password || ""}`, - "-e", - "SELECT 1;" -]; -const r = spawnSync("mysql", args, { stdio: "inherit" }); -process.exit(r.status === null ? 1 : r.status); -' -``` - -成功 → 进入步骤 C;失败 → 打印具体错误(认证 / 主机不可达 / 端口拒接)并停下。 - -勾选:` - [ ] config-vars.yaml DB 凭据已验证(mysql -e "SELECT 1" OK)` +勾选:` - [ ] config-vars.yaml DB 凭据 5 项非空校验通过` ### C. 自动导入 MySQL @@ -126,8 +87,7 @@ node "${CLAUDE_PLUGIN_ROOT}/lib/apply-ddl.mjs" config-vars.yaml sql/migrations/V ### D. 勾选 docs/08 进度 + 进入 A5 -1. 勾选(A4 子项 + A4 顶层;DDL ↔ docs/03 5 维一致已由 A.3 校验过,V1 文件自此未变): - - ` - [ ] DDL ↔ docs/03 apply 后 5 维一致(validate-ddl.mjs)` +1. 勾选 A4 顶层(5 维一致已由 A.3 的 `validate-ddl.mjs` 校验过,apply 不改 V1,无需复校): - `- [ ] A4 DB 初始化 — db-init` 2. 立即调用 `Skill(downstream-gen)` 进入 A5,不等用户手动输入。 diff --git a/skills/plan/project-init/templates/docs-08-initial-template.md b/skills/plan/project-init/templates/docs-08-initial-template.md index 56c5b16..c97a4d4 100644 --- a/skills/plan/project-init/templates/docs-08-initial-template.md +++ b/skills/plan/project-init/templates/docs-08-initial-template.md @@ -27,10 +27,9 @@ - [ ] A4 DB 初始化 — db-init - [ ] sql/migrations/V1__initial_schema.sql 已生成 - - [ ] DDL 与 docs/03 全量一致 - - [ ] config-vars.yaml DB 凭据已验证(mysql -e "SELECT 1" OK) + - [ ] DDL ↔ docs/03 5 维一致(validate-ddl.mjs) + - [ ] config-vars.yaml DB 凭据 5 项非空校验通过 - [ ] setup-test-db.mjs DROP+CREATE + apply V1 已执行 - - [ ] DDL ↔ docs/03 apply 后 5 维一致(validate-ddl.mjs) - [ ] A5 下游文档生成 — downstream-gen - [ ] docs/02 开发计划已生成 -- libgit2 0.22.2