Commit 9b8f6a2d7f49c37266bea53a4069ff122e37d366
1 parent
54356b2b
remove docs/07 — env config folded into config-vars.yaml + docs/04
- delete docs-07-env-template.md (§一 依赖↔docs/04 §零; §二 端口↔config-vars.yaml; §四 命令↔docs/04 §零 build/lint/unit/e2e; §三 规则折入 config-vars.yaml 头) - skeleton-gen: B.1 (gen docs/07) removed → B = just append docs/04 §一+; add 'A2 不再单独出 docs/06/07/09 — 各内容归属' note; frontmatter/checkbox/E.1-scan/参考 drop docs/07 - config-vars.yaml header: + 2 guardrails (配置值不散落; base_package 锁定后复用) - plan-start drop 'docs/07 仅承载规则' note; docs-08 checkbox; README A2 row + template table
Showing
6 changed files
with
15 additions
and
37 deletions
README.md
| @@ -120,7 +120,7 @@ erp-workflow-plugin/ | @@ -120,7 +120,7 @@ erp-workflow-plugin/ | ||
| 120 | |---|---|---|---| | 120 | |---|---|---|---| |
| 121 | | A0 | `project-init` | • **依赖检查**:检测 git / mysql / node 是否在 PATH,缺失则按 OS 自动安装,装不上再停下提示用户<br>• 空目录初始化:用 Read/Write/Glob 工具拷模板创建 CLAUDE.md / docs/01/index.md / docs/08<br>• `git init` | `plan-start` | | 121 | | A0 | `project-init` | • **依赖检查**:检测 git / mysql / node 是否在 PATH,缺失则按 OS 自动安装,装不上再停下提示用户<br>• 空目录初始化:用 Read/Write/Glob 工具拷模板创建 CLAUDE.md / docs/01/index.md / docs/08<br>• `git init` | `plan-start` | |
| 122 | | A1 | `scope-lock` | • 引导填项目概述 / 技术栈 / 需求索引<br>• 按 `docs/01-需求清单/<module>/{_module.md, REQ-*.md}` 子目录结构生成 REQ 卡片(CC 据 index.md 填 `{{req_id/title/goal/rules/constraints/acceptance}}` 6 个占位,模板其余内容含输入/输出示例字段表原样复制)<br>• **A1 终结校验**:REQ 6 个占位均填真实数据、无 `{{` 残留、`config-vars.yaml` **全部配置**(包名 / 端口 / 初始账号 + DB 凭据 / 密钥占位)已锁、各 stack 的 build/lint/unit/e2e 命令写入 docs/04 § 零;缺失则在此(Plan 期)用 `AskUserQuestion` 问清(敏感凭据由用户自填,不进会话)<br>• 据模板直接 `Write` 生成 `_module.md` / `REQ-*.md`<br>• 终结校验通过后**自动**调用 `Skill(skeleton-gen)` 进入 A2(不停下) | A0 | | 122 | | A1 | `scope-lock` | • 引导填项目概述 / 技术栈 / 需求索引<br>• 按 `docs/01-需求清单/<module>/{_module.md, REQ-*.md}` 子目录结构生成 REQ 卡片(CC 据 index.md 填 `{{req_id/title/goal/rules/constraints/acceptance}}` 6 个占位,模板其余内容含输入/输出示例字段表原样复制)<br>• **A1 终结校验**:REQ 6 个占位均填真实数据、无 `{{` 残留、`config-vars.yaml` **全部配置**(包名 / 端口 / 初始账号 + DB 凭据 / 密钥占位)已锁、各 stack 的 build/lint/unit/e2e 命令写入 docs/04 § 零;缺失则在此(Plan 期)用 `AskUserQuestion` 问清(敏感凭据由用户自填,不进会话)<br>• 据模板直接 `Write` 生成 `_module.md` / `REQ-*.md`<br>• 终结校验通过后**自动**调用 `Skill(skeleton-gen)` 进入 A2(不停下) | A0 | |
| 123 | -| A2 | `skeleton-gen` | • 生成架构文档:docs/04 § 一+ / docs/07<br>• 生成跨平台工具脚本:`scripts/*.mjs`(**无 chmod**;凭据 / 配置统一在 A1 产出的 config-vars.yaml)<br>• 据 `gitignore-append-template` 用 Read/Write 并入项目 .gitignore | `plan-start` | | 123 | +| A2 | `skeleton-gen` | • 生成架构文档:docs/04 § 一+<br>• 生成跨平台工具脚本:`scripts/*.mjs`(**无 chmod**;凭据 / 配置统一在 A1 产出的 config-vars.yaml)<br>• 据 `gitignore-append-template` 用 Read/Write 并入项目 .gitignore | `plan-start` | |
| 124 | | A3 | `db-design-gen` | • A3 起始用 `AskUserQuestion` 确认 ERP 约定(主键策略 / 租户列 / 列前缀规则,默认值可覆盖),结果写 docs/04 + CLAUDE.md<br>• 从 docs/01 REQ 卡片正向设计 `docs/03-数据库设计文档.md`(schema SSoT)<br>• 回填 REQ 卡片依赖表(`TBD(A3 自动补)` → 实际表名)<br>• **停下**等人工审阅 docs/03,审阅完毕用 `/plan-start` 续进 A4 | A2 | | 124 | | A3 | `db-design-gen` | • A3 起始用 `AskUserQuestion` 确认 ERP 约定(主键策略 / 租户列 / 列前缀规则,默认值可覆盖),结果写 docs/04 + CLAUDE.md<br>• 从 docs/01 REQ 卡片正向设计 `docs/03-数据库设计文档.md`(schema SSoT)<br>• 回填 REQ 卡片依赖表(`TBD(A3 自动补)` → 实际表名)<br>• **停下**等人工审阅 docs/03,审阅完毕用 `/plan-start` 续进 A4 | A2 | |
| 125 | | A4 | `db-init` | • LLM 解析 docs/03 → `sql/migrations/V1__initial_schema.sql`(DDL only)<br>• `node ${CLAUDE_PLUGIN_ROOT}/lib/validate-ddl.mjs` 校验 DDL ↔ docs/03(5 维:表/列名/列类型/索引/FK),fail-closed<br>• `node ${CLAUDE_PLUGIN_ROOT}/lib/apply-ddl.mjs config-vars.yaml V1.sql`(解析 config-vars.yaml database: 段 + mysql2 apply,**无 shell-source**) | A3 | | 125 | | A4 | `db-init` | • LLM 解析 docs/03 → `sql/migrations/V1__initial_schema.sql`(DDL only)<br>• `node ${CLAUDE_PLUGIN_ROOT}/lib/validate-ddl.mjs` 校验 DDL ↔ docs/03(5 维:表/列名/列类型/索引/FK),fail-closed<br>• `node ${CLAUDE_PLUGIN_ROOT}/lib/apply-ddl.mjs config-vars.yaml V1.sql`(解析 config-vars.yaml database: 段 + mysql2 apply,**无 shell-source**) | A3 | |
| 126 | | A5 | `downstream-gen` | • 一次性生成 docs/02 / docs/05 / docs/10<br>• 回填 REQ 卡片依赖接口(`TBD(A5 自动补)` → 实际 endpoint)<br>• 追加模块清单到 docs/08 § 二<br>• **docs/05 + docs/02 评审闸**:用 `AskUserQuestion` 让用户确认 API 端点/字段无误 + 构建顺序可接受,未确认不勾 A5<br>• **prototype/ 门禁 + 推导 FE 清单写 docs/08 § 三**(原 A6 已并入;无 prototype 则问「无前端」→ § 三 留空)<br>• 最终占位符 + 结构残留扫描 | A4 | | 126 | | A5 | `downstream-gen` | • 一次性生成 docs/02 / docs/05 / docs/10<br>• 回填 REQ 卡片依赖接口(`TBD(A5 自动补)` → 实际 endpoint)<br>• 追加模块清单到 docs/08 § 二<br>• **docs/05 + docs/02 评审闸**:用 `AskUserQuestion` 让用户确认 API 端点/字段无误 + 构建顺序可接受,未确认不勾 A5<br>• **prototype/ 门禁 + 推导 FE 清单写 docs/08 § 三**(原 A6 已并入;无 prototype 则问「无前端」→ § 三 留空)<br>• 最终占位符 + 结构残留扫描 | A4 | |
| @@ -147,7 +147,6 @@ erp-workflow-plugin/ | @@ -147,7 +147,6 @@ erp-workflow-plugin/ | ||
| 147 | | scope-lock | `_module-template.md` | 模块子目录的 `_module.md` 模块头(模块代码-名 / 简述 / 依赖模块 TBD / 涉及表 TBD) | | 147 | | scope-lock | `_module-template.md` | 模块子目录的 `_module.md` 模块头(模块代码-名 / 简述 / 依赖模块 TBD / 涉及表 TBD) | |
| 148 | | scope-lock | `config-vars-template.yaml` | 仓库根 `config-vars.yaml` 骨架(跨栈中立):项目**全部配置**——非敏感(包名/端口/前端包名/初始账号)+ 敏感凭据(database / admin_init.password / secrets);A1 E.2 锁定,随项目提交 | | 148 | | scope-lock | `config-vars-template.yaml` | 仓库根 `config-vars.yaml` 骨架(跨栈中立):项目**全部配置**——非敏感(包名/端口/前端包名/初始账号)+ 敏感凭据(database / admin_init.password / secrets);A1 E.2 锁定,随项目提交 | |
| 149 | | skeleton-gen | `docs-04-skeleton-template.md` | docs/04 § 一+ 编码规范大纲(HTML 注释引导 LLM) | | 149 | | skeleton-gen | `docs-04-skeleton-template.md` | docs/04 § 一+ 编码规范大纲(HTML 注释引导 LLM) | |
| 150 | -| skeleton-gen | `docs-07-env-template.md` | docs/07 环境配置大纲(只记规则/约定,不记具体值;配置值统一指向 config-vars.yaml) | | ||
| 151 | | skeleton-gen | `scripts-setup-test-db-template.mjs` | 跨平台 drop + create 空库脚本(内联极简 YAML 读 config-vars.yaml database: 段,无 shell-source);schema apply 交给 Flyway | | 150 | | skeleton-gen | `scripts-setup-test-db-template.mjs` | 跨平台 drop + create 空库脚本(内联极简 YAML 读 config-vars.yaml database: 段,无 shell-source);schema apply 交给 Flyway | |
| 152 | | skeleton-gen | `scripts-test-template.mjs` | test.mjs 骨架(命令槽位按后端/前端/build/lint/test/e2e 分开,`spawnSync(shell:true)` 跨平台执行) | | 151 | | skeleton-gen | `scripts-test-template.mjs` | test.mjs 骨架(命令槽位按后端/前端/build/lint/test/e2e 分开,`spawnSync(shell:true)` 跨平台执行) | |
| 153 | | skeleton-gen | `gitignore-append-template` | 插件推荐忽略项(`.tmp/`、构建产物等;config-vars.yaml 随项目提交,不忽略) | | 152 | | skeleton-gen | `gitignore-append-template` | 插件推荐忽略项(`.tmp/`、构建产物等;config-vars.yaml 随项目提交,不忽略) | |
skills/plan/plan-start/SKILL.md
| @@ -50,7 +50,7 @@ A 阶段 checkbox 全部 `[x]` 后先跑下面 4 项前移闸门; 全过才放 | @@ -50,7 +50,7 @@ A 阶段 checkbox 全部 `[x]` 后先跑下面 4 项前移闸门; 全过才放 | ||
| 50 | 50 | ||
| 51 | 2. **全部配置全锁**(来自 A1 写入 `config-vars.yaml` 的非敏感配置 + 敏感凭据,单一文件) | 51 | 2. **全部配置全锁**(来自 A1 写入 `config-vars.yaml` 的非敏感配置 + 敏感凭据,单一文件) |
| 52 | - `Read` `config-vars.yaml`(项目全部配置,含敏感凭据,随项目提交):校验所有字段均有真实值,无 `【人工填写`/`TBD`/空值——含非敏感项(`backend`/`frontend` 包名 / 端口、`admin_init.username`、`database.host/port/user/schema`)与敏感项(`database.password`、`admin_init.password`、`secrets.*`)。 | 52 | - `Read` `config-vars.yaml`(项目全部配置,含敏感凭据,随项目提交):校验所有字段均有真实值,无 `【人工填写`/`TBD`/空值——含非敏感项(`backend`/`frontend` 包名 / 端口、`admin_init.username`、`database.host/port/user/schema`)与敏感项(`database.password`、`admin_init.password`、`secrets.*`)。 |
| 53 | - - 任一未填即缺口。(docs/07-环境配置.md 仅承载规则/约定,不参与值校验。) | 53 | + - 任一未填即缺口。 |
| 54 | 54 | ||
| 55 | 3. **docs/04 §零 命令齐**(来自 A1 收集的每栈构建/lint/单测/e2e 命令) | 55 | 3. **docs/04 §零 命令齐**(来自 A1 收集的每栈构建/lint/单测/e2e 命令) |
| 56 | - `Read` `docs/04-技术规范.md`,定位 `§ 零` 命令区。 | 56 | - `Read` `docs/04-技术规范.md`,定位 `§ 零` 命令区。 |
skills/plan/project-init/templates/docs-08-initial-template.md
| @@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
| 16 | - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写) | 16 | - [ ] REQ 卡片骨架已生成(docs/01-需求清单/<module>/REQ-*.md,业务内容留待人工填写) |
| 17 | 17 | ||
| 18 | - [ ] A2 骨架生成 — skeleton-gen | 18 | - [ ] A2 骨架生成 — skeleton-gen |
| 19 | - - [ ] 架构文档已生成(docs/04 § 一+、docs/07) | 19 | + - [ ] 架构文档已生成(docs/04 § 一+) |
| 20 | - [ ] 工具脚本已生成(scripts/*.mjs) | 20 | - [ ] 工具脚本已生成(scripts/*.mjs) |
| 21 | - [ ] 样式 token 骨架已生成(src/styles/tokens.css) | 21 | - [ ] 样式 token 骨架已生成(src/styles/tokens.css) |
| 22 | - [ ] .gitignore 已配置 | 22 | - [ ] .gitignore 已配置 |
skills/plan/scope-lock/templates/config-vars-template.yaml
| 1 | # config-vars.yaml — 项目全部配置(含敏感凭据)。随项目提交,内部 git 传播。 | 1 | # config-vars.yaml — 项目全部配置(含敏感凭据)。随项目提交,内部 git 传播。 |
| 2 | # 工具脚本(apply-ddl / setup-test-db)运行时按 2 层 map 解析此文件。 | 2 | # 工具脚本(apply-ddl / setup-test-db)运行时按 2 层 map 解析此文件。 |
| 3 | # 值含 : / # / 空格 / $ / 引号等特殊字符时,用单引号包裹整个值:password: 'p@ss: w0rd#1' | 3 | # 值含 : / # / 空格 / $ / 引号等特殊字符时,用单引号包裹整个值:password: 'p@ss: w0rd#1' |
| 4 | +# 所有配置值(含敏感值)只在本文件,不得散落到 docs / 源码 / 日志。 | ||
| 5 | +# base_package / 命名空间锁定后全项目复用,不各模块各写。 | ||
| 4 | 6 | ||
| 5 | backend: | 7 | backend: |
| 6 | base_package: com.xly.erp | 8 | base_package: com.xly.erp |
skills/plan/skeleton-gen/SKILL.md
| 1 | --- | 1 | --- |
| 2 | name: skeleton-gen | 2 | name: skeleton-gen |
| 3 | -description: A2 骨架生成——基于 docs/04 § 零 技术栈 + docs/01-需求清单/index.md 模块索引,生成项目专属的架构文档(docs/04 § 一+、docs/07)和工具脚本(.mjs,跨平台)。固定工具文件用 Read/Write 落盘,架构文档由 LLM 按大纲生成。 | 3 | +description: A2 骨架生成——基于 docs/04 § 零 技术栈 + docs/01-需求清单/index.md 模块索引,生成项目专属的架构文档(docs/04 § 一+)和工具脚本(.mjs,跨平台)。固定工具文件用 Read/Write 落盘,架构文档由 LLM 按大纲生成。 |
| 4 | user-invocable: false | 4 | user-invocable: false |
| 5 | allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion | 5 | allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion |
| 6 | --- | 6 | --- |
| @@ -18,24 +18,22 @@ allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion | @@ -18,24 +18,22 @@ allowed-tools: Read Write Edit Skill Grep Glob AskUserQuestion | ||
| 18 | 18 | ||
| 19 | 后续所有内容都基于它们推导。 | 19 | 后续所有内容都基于它们推导。 |
| 20 | 20 | ||
| 21 | -### B.1 生成 docs/07 环境配置 | 21 | +### B. 追加 docs/04 § 一+(架构文档;保留 § 零 不覆盖) |
| 22 | 22 | ||
| 23 | -读取 `${CLAUDE_SKILL_DIR}/templates/docs-07-env-template.md`,基于步骤 A 的输入按大纲生成项目专属内容(剥掉 HTML 注释——注释是给 LLM 的提示,不应出现在最终文档里),`Write` 到 `docs/07-环境配置.md`。 | ||
| 24 | - | ||
| 25 | -> **项目目录布局不单独出文档**(原 docs/09 已并入):后端/前端目录布局写进 **docs/04 § 1.2 分层结构 / § 2.1 目录约定**(见 B.2);跨模块「路径→模块」由 docs/08 § 二 模块行的 `路径:` 字段承担。 | ||
| 26 | -> **前端 UI/交互/布局不出文档**:项目根 `prototype/` 是完整前端 demo(页面 + 布局 + 交互的权威);Design Tokens 在 `src/styles/tokens.css`(**色值冲突时 tokens.css 优先于 prototype**);前端编码规范在 docs/04 § 二。 | ||
| 27 | - | ||
| 28 | -### B.2 追加 docs/04 § 一+(保留 § 零 不覆盖) | ||
| 29 | - | ||
| 30 | -docs/04 已由 scope-lock 写入 § 零。本步骤追加 § 一 ~ 三。 | 23 | +docs/04 已由 scope-lock 写入 § 零。本步骤追加 § 一 ~ 三: |
| 31 | 24 | ||
| 32 | 1. 读取 `docs/04-技术规范.md`(现有 § 零 完整内容)。 | 25 | 1. 读取 `docs/04-技术规范.md`(现有 § 零 完整内容)。 |
| 33 | 2. 读取 `${CLAUDE_SKILL_DIR}/templates/docs-04-skeleton-template.md`。 | 26 | 2. 读取 `${CLAUDE_SKILL_DIR}/templates/docs-04-skeleton-template.md`。 |
| 34 | 3. 基于技术栈,按大纲生成 § 一 ~ 三 的项目专属内容,剥掉 HTML 注释。**§ 1.2 分层结构 / § 2.1 目录约定要写清后端/前端的实际目录布局**(原 docs/09 内容并入此处,供 Coding 阶段落盘 + 跨模块判定参照)。 | 27 | 3. 基于技术栈,按大纲生成 § 一 ~ 三 的项目专属内容,剥掉 HTML 注释。**§ 1.2 分层结构 / § 2.1 目录约定要写清后端/前端的实际目录布局**(原 docs/09 内容并入此处,供 Coding 阶段落盘 + 跨模块判定参照)。 |
| 35 | 4. 拼接原有内容和新生成内容,写回 `docs/04-技术规范.md`。 | 28 | 4. 拼接原有内容和新生成内容,写回 `docs/04-技术规范.md`。 |
| 36 | 29 | ||
| 30 | +> **A2 不再单独出 docs/06 / 07 / 09**——它们的内容各有归属: | ||
| 31 | +> - 环境 / 配置值(含凭据) → `config-vars.yaml`(A1 产出);构建 / 测试命令 → docs/04 § 零。 | ||
| 32 | +> - 项目目录布局 → docs/04 § 1.2 分层结构 / § 2.1 目录约定;跨模块「路径→模块」→ docs/08 § 二 模块行 `路径:`。 | ||
| 33 | +> - 前端 UI / 交互 / 布局 → 项目根 `prototype/`(完整 demo,权威);Design Tokens → `src/styles/tokens.css`(**色值冲突时 tokens.css 优先于 prototype**);前端编码规范 → docs/04 § 二。 | ||
| 34 | + | ||
| 37 | 完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选: | 35 | 完成后,用 `Edit` 在 `docs/08-模块任务管理.md` 中勾选: |
| 38 | -- ` - [ ] 架构文档已生成(docs/04 § 一+、docs/07)` | 36 | +- ` - [ ] 架构文档已生成(docs/04 § 一+)` |
| 39 | 37 | ||
| 40 | ### C. 生成工具脚本 | 38 | ### C. 生成工具脚本 |
| 41 | 39 | ||
| @@ -81,7 +79,7 @@ docs/04 已由 scope-lock 写入 § 零。本步骤追加 § 一 ~ 三。 | @@ -81,7 +79,7 @@ docs/04 已由 scope-lock 写入 § 零。本步骤追加 § 一 ~ 三。 | ||
| 81 | #### E.1 扫描 + 分组 | 79 | #### E.1 扫描 + 分组 |
| 82 | 80 | ||
| 83 | 用 `Grep` 在以下路径扫 `【人工填写:`,记录命中(文件 / 行号 / 说明): | 81 | 用 `Grep` 在以下路径扫 `【人工填写:`,记录命中(文件 / 行号 / 说明): |
| 84 | -- `docs/04-技术规范.md` / `docs/07-环境配置.md` | 82 | +- `docs/04-技术规范.md` |
| 85 | - `config-vars.yaml`(A1 留下的未填字段) | 83 | - `config-vars.yaml`(A1 留下的未填字段) |
| 86 | - `scripts/*.mjs` / `.gitignore` | 84 | - `scripts/*.mjs` / `.gitignore` |
| 87 | 85 | ||
| @@ -122,7 +120,6 @@ QA 横幅涵盖:产出文件清单(docs/04 / 07 + scripts/*.mjs + .gitignore | @@ -122,7 +120,6 @@ QA 横幅涵盖:产出文件清单(docs/04 / 07 + scripts/*.mjs + .gitignore | ||
| 122 | - `docs/04-技术规范.md` § 零 | 120 | - `docs/04-技术规范.md` § 零 |
| 123 | - `docs/01-需求清单/index.md` | 121 | - `docs/01-需求清单/index.md` |
| 124 | - `${CLAUDE_SKILL_DIR}/templates/docs-04-skeleton-template.md` | 122 | - `${CLAUDE_SKILL_DIR}/templates/docs-04-skeleton-template.md` |
| 125 | -- `${CLAUDE_SKILL_DIR}/templates/docs-07-env-template.md` | ||
| 126 | - `${CLAUDE_SKILL_DIR}/templates/scripts-test-template.mjs` | 123 | - `${CLAUDE_SKILL_DIR}/templates/scripts-test-template.mjs` |
| 127 | - `${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.mjs` | 124 | - `${CLAUDE_SKILL_DIR}/templates/scripts-setup-test-db-template.mjs` |
| 128 | - `config-vars.yaml`(A1 产出,含 DB 凭据;setup-test-db.mjs 运行时读取) | 125 | - `config-vars.yaml`(A1 产出,含 DB 凭据;setup-test-db.mjs 运行时读取) |
skills/plan/skeleton-gen/templates/docs-07-env-template.md deleted
| 1 | -# 07-环境配置 | ||
| 2 | - | ||
| 3 | -## 一、依赖清单 | ||
| 4 | - | ||
| 5 | -## 二、端口约定 | ||
| 6 | - | ||
| 7 | -## 三、配置与凭据规则 | ||
| 8 | - | ||
| 9 | -项目**全部配置**(含敏感凭据)统一存放在仓库根 `config-vars.yaml`,结构化 YAML,随项目提交(内部 git 传播)。**本文档只记规则、不记具体值**: | ||
| 10 | - | ||
| 11 | -- **非敏感、项目级配置**(根包名 / 命名空间、应用端口、前端包名、管理员初始账号等)→ `config-vars.yaml` 对应段。 | ||
| 12 | -- **敏感凭据**(数据库密码、JWT / 签名密钥、Redis 密码、第三方 key/secret、管理员初始密码等)→ `config-vars.yaml` 的 `database` / `admin_init.password` / `secrets` 段,直接填真实值。 | ||
| 13 | - | ||
| 14 | -规则: | ||
| 15 | -- 根包名 / 命名空间一经在 `config-vars.yaml` 锁定,全项目复用,不得各模块各写。 | ||
| 16 | -- 端口遵循 § 二 约定;调整时改 `config-vars.yaml`,本文档不写具体端口。 | ||
| 17 | -- 任何配置值(含敏感值)只允许出现在 `config-vars.yaml`,不得散落在 docs、源码或日志中。 | ||
| 18 | -- 工具脚本(apply-ddl / setup-test-db)运行时按 2 层 map 解析 `config-vars.yaml`;值含特殊字符时用单引号包裹。 | ||
| 19 | - | ||
| 20 | -## 四、常用命令 |