@agile-team/wl-skills-kit 2.3.3 → 2.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +24 -23
  2. package/README.md +15 -146
  3. package/files/.cursor/mcp.json +8 -0
  4. package/files/.github/guides/README.md +13 -13
  5. package/files/.github/guides/architecture.md +555 -555
  6. package/files/.github/guides/mcp-setup.md +109 -0
  7. package/files/.github/guides/usage.md +184 -176
  8. package/files/.github/reports/README.md +65 -65
  9. package/files/.github/reports/SYS_DICT_INFO.md +50 -50
  10. package/files/.github/reports/SYS_MENU_INFO.md +247 -247
  11. package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
  12. package/files/.github/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +33 -33
  13. package/files/.github/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md +44 -44
  14. package/files/.github/skills/_compat/README.md +108 -108
  15. package/files/.github/skills/_compat/editors.json +7 -0
  16. package/files/.github/skills/_compat/headers/agents.txt +8 -8
  17. package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
  18. package/files/.github/skills/_compat/headers/cline.txt +7 -7
  19. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
  20. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
  21. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
  22. package/files/.github/skills/_compat/headers/kiro.txt +10 -10
  23. package/files/.github/skills/_compat/headers/qoder.txt +8 -0
  24. package/files/.github/skills/_compat/headers/trae.txt +11 -11
  25. package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
  26. package/files/.github/skills/_registry.md +81 -81
  27. package/files/.github/skills/core/api-contract/SKILL.md +344 -344
  28. package/files/.github/skills/core/api-contract/USAGE.md +110 -110
  29. package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
  30. package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
  31. package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
  32. package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
  33. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
  34. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
  35. package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
  36. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
  37. package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
  38. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
  39. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -309
  40. package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
  41. package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
  42. package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
  43. package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
  44. package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
  45. package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
  46. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
  47. package/files/.github/skills/core/template-extract/SKILL.md +139 -139
  48. package/files/.github/skills/core/template-extract/USAGE.md +93 -93
  49. package/files/.github/skills/domain/README.md +51 -51
  50. package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
  51. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
  52. package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
  53. package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
  54. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -91
  55. package/files/.github/standards/01-toolchain.md +57 -57
  56. package/files/.github/standards/02-code-structure.md +111 -111
  57. package/files/.github/standards/03-comments.md +53 -53
  58. package/files/.github/standards/04-coding-basics.md +33 -33
  59. package/files/.github/standards/05-logging.md +38 -38
  60. package/files/.github/standards/06-security.md +44 -44
  61. package/files/.github/standards/07-config.md +52 -52
  62. package/files/.github/standards/08-git.md +60 -60
  63. package/files/.github/standards/09-typescript.md +71 -71
  64. package/files/.github/standards/10-pinia.md +57 -57
  65. package/files/.github/standards/11-form-validation.md +81 -81
  66. package/files/.github/standards/12-base-table.md +153 -153
  67. package/files/.github/standards/13-platform-components.md +123 -123
  68. package/files/.github/standards/index.md +89 -89
  69. package/files/.kiro/settings/mcp.json +8 -0
  70. package/files/.mcp.json +8 -0
  71. package/files/.vscode/mcp.json +9 -0
  72. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  73. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  74. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  75. package/files/docs/jh-date-range.md +257 -257
  76. package/files/docs/jh-date.md +222 -222
  77. package/files/docs/jh-dept-picker.md +190 -190
  78. package/files/docs/jh-drag-row.md +590 -590
  79. package/files/docs/jh-file-upload.md +216 -216
  80. package/files/docs/jh-picker.md +218 -218
  81. package/files/docs/jh-select.md +148 -148
  82. package/files/docs/jh-text.md +248 -248
  83. package/files/docs/jh-user-picker.md +197 -197
  84. package/files/src/components/global/C_RightToolbar/data.ts +228 -228
  85. package/files/src/components/global/C_RightToolbar/index.scss +44 -44
  86. package/files/src/components/global/C_Splitter/index.scss +61 -61
  87. package/files/src/components/global/C_SvgIcon/index.scss +15 -15
  88. package/files/src/components/global/C_TagStatus/index.scss +20 -20
  89. package/files/src/components/global/C_Tree/data.ts +61 -61
  90. package/files/src/components/local/c_listModal/index.scss +4 -4
  91. package/package.json +1 -1
@@ -1,555 +1,555 @@
1
- # wl-skills-kit 架构设计与决策记录
2
-
3
- > **读者**:团队技术负责人 / wl-skills-kit 维护者 / 对体系设计感兴趣的团队成员
4
- > **更新方式**:重大架构变更后追加对应章节,旧章节原文保留(历史可溯)
5
- > **当前版本**:v2.1(2026-04-26)
6
-
7
- ---
8
-
9
- ## 目录
10
-
11
- 1. [这个体系解决什么问题](#1-这个体系解决什么问题)
12
- 2. [npm 包工作机制](#2-npm-包工作机制)
13
- 3. [整体运行时架构](#3-整体运行时架构)
14
- 4. [分层架构详解](#4-分层架构详解)
15
- - 4.1 规范层(standards/)
16
- - 4.2 Skill 层(skills/)
17
- - 4.3 适配层(\_compat/)
18
- - 4.4 报告层(reports/)
19
- - 4.5 模板层(page-codegen/templates/)
20
- 5. [Pre-flight 约定式输出机制](#5-pre-flight-约定式输出机制)
21
- 6. [三层文档体系](#6-三层文档体系)
22
- 7. [Skill 生命周期管理](#7-skill-生命周期管理)
23
- 8. [菜单/字典/权限同步机制](#8-菜单字典权限同步机制)
24
- 9. [工具链前置检测](#9-工具链前置检测)
25
- 10. [版本演进历史](#10-版本演进历史)
26
- 11. [关键决策记录(ADR)](#11-关键决策记录adr)
27
-
28
- ---
29
-
30
- ## 1. 这个体系解决什么问题
31
-
32
- ### 根本问题:AI 不了解"你的项目"
33
-
34
- AI 编辑器(Copilot / Cursor / Windsurf 等)知道通用编程知识,但不知道:
35
-
36
- - 这个项目用 `AbstractPageQueryHook` 而不是手写 `ref` + `axios`
37
- - 表格必须用 `AGGrid` 的封装,不能直接用 `el-table`
38
- - API 响应外壳是 `{ code: 2000, data: {...} }`,不是 `{ code: 200, result: {} }`
39
- - 页面目录必须是 4 文件(data.ts / index.vue / index.scss / api.md)
40
- - 菜单注册有专门的后端接口流程,不是手改路由文件
41
-
42
- 不了解这些,AI 每次都会生成"语法正确但不合规"的代码,增加 review 成本。
43
-
44
- ### 传统方案的缺陷
45
-
46
- | 方案 | 问题 |
47
- | ------------------------------------ | ------------------------------------------------- |
48
- | 把规范写进 wiki | AI 不读 wiki;wiki 和代码脱节 |
49
- | 把规范贴进每次对话 | 重复劳动;规范长了 token 爆炸;换 AI 工具就要重来 |
50
- | 一个超长的 `copilot-instructions.md` | v1.x 试过,膨胀到 600+ 行,AI 全量加载不看实际 |
51
-
52
- ### 本方案的核心思路
53
-
54
- > **把规范做成 AI 可自动加载的结构化知识库,以 Skill 为粒度按需调度,形成"口述意图 → 符合规范的完整实现"的闭环。**
55
-
56
- 具体体现为:
57
-
58
- 1. 规范分层、按任务类型懒加载(token 高效利用)
59
- 2. Skill 触发词驱动(开发者用自然语言,AI 读结构化 SKILL.md)
60
- 3. Pre-flight 约定式声明(消除 AI "假执行"黑盒问题)
61
- 4. 多 AI 编辑器适配(一套内容,自动生成 9 种根配置,解耦可扩展)
62
- 5. 报告层追加不覆盖(累积团队知识,不丢失审计历史)
63
-
64
- ---
65
-
66
- ## 2. npm 包工作机制
67
-
68
- `wl-skills-kit` 是一个**一次性初始化型 npm 包(scaffolding CLI)**,不是运行时依赖:
69
-
70
- ```
71
- npx @agile-team/wl-skills-kit ← 下载 → 执行 → 完成,不留在 dependencies
72
- npx @agile-team/wl-skills-kit update ← 增量更新,可在业务项目生命周期中多次运行
73
- ```
74
-
75
- ### 仓库目录 vs 业务项目目录
76
-
77
- | 仓库目录 | 说明 | 会被安装? |
78
- | --------------- | ----------------------------------------- | ---------- |
79
- | `bin/` | CLI 实现(`wl-skills.js`) | ✅ 会 |
80
- | `files/` | 所有要复制到业务项目的文件 | ✅ 会 |
81
- | `kit-internal/` | 维护者文档(architecture / CONTRIBUTING) | ❌ 不会 |
82
- | `CHANGELOG.md` | 版本记录 | ✅ 会 |
83
-
84
- > **关键**:`kit-internal/` 通过 `package.json` 的 `files` 白名单机制严格排除,永远不会进入业务项目。
85
-
86
- ### bin/wl-skills.js 工作流程
87
-
88
- ```
89
- wl-skills.js init/update
90
-
91
- ├─ 1. 递归读取 files/ 目录下所有文件
92
-
93
- ├─ 2. 读取 files/.github/copilot-instructions.md(主体内容)
94
-
95
- ├─ 3. 读取 _compat/editors.json(编辑器注册表)
96
- │ 对每个 enabled editor:
97
- │ 读取 _compat/headers/{editor}.txt(特化 frontmatter)
98
- │ 拼接:header + 自动生成注释 + 主体内容
99
- │ 写入 editor.outputPath(如 CLAUDE.md / .cursorrules / ...)
100
-
101
- ├─ 4. 写入其他 files/ 文件到目标目录
102
- │ - reports/*.md 已存在则跳过(保护团队累积数据)
103
- │ - 其他文件:覆盖写入
104
-
105
- └─ 5. 写入/更新 .wl-skills-manifest.json(文件哈希快照)
106
- ```
107
-
108
- ---
109
-
110
- ## 3. 整体运行时架构
111
-
112
- ```
113
- 开发者
114
- │ 在 AI 对话中说出意图
115
- │ "帮我生成客户管理列表页"
116
-
117
- AI 编辑器(Copilot / Cursor / Windsurf / Claude Code / Cline / Kiro / Trae)
118
-
119
- │ 自动加载根配置文件(各编辑器读自己的文件):
120
- │ Copilot → .github/copilot-instructions.md
121
- │ Claude → CLAUDE.md
122
- │ Cursor → .cursorrules + .cursor/rules/conventions.mdc
123
- │ Windsurf → .windsurfrules
124
- │ Cline → .clinerules
125
- │ Kiro → .kiro/steering/conventions.md
126
- │ Trae → .trae/rules/conventions.md
127
- │ 通用 → AGENTS.md
128
-
129
- │ 根配置包含:
130
- │ - 项目架构概要(栈、4文件原则、API契约)
131
- │ - Skill 调度规则(触发词 → 读 _registry.md → 读 SKILL.md)
132
- │ - Pre-flight 输出要求
133
-
134
-
135
- .github/skills/_registry.md
136
- │ 触发词 → SKILL 路径映射
137
- │ "生成页面" → skills/core/page-codegen/SKILL.md
138
-
139
-
140
- .github/skills/core/page-codegen/SKILL.md
141
- │ 声明:必读 standards 列表 + 完整生成流程 + 输出规范
142
-
143
-
144
- .github/standards/(按 index.md 门控,按需加载)
145
- │ page-codegen 需要:02/06/07/08/12/13 共 6 条
146
- │ convention-audit 需要:全部 13 条
147
-
148
-
149
- AI 生成代码/报告/api.md
150
-
151
- └─ 写入到:
152
- src/views/<域>/<模块>/<子模块>/<page>/
153
- .github/reports/(追加写入)
154
- ```
155
-
156
- ---
157
-
158
- ## 4. 分层架构详解
159
-
160
- ### 4.1 规范层(standards/)
161
-
162
- **目录结构**:
163
-
164
- ```
165
- standards/
166
- ├── index.md ← 门控:任务类型 → 规范子集映射
167
- ├── 01-toolchain.md 工具链前置检测(🔴 阻断)
168
- ├── 02-code-structure.md 4文件原则 + 三段式 + script 9段顺序(🔴 必遵)
169
- ├── 03-comments.md 注释规范(🟡 建议)
170
- ├── 04-coding-basics.md 基础编码 13 条(🔴 必遵)
171
- ├── 05-logging.md 日志输出规范(🔴 必遵)
172
- ├── 06-security.md 安全规范(🔴 必遵)
173
- ├── 07-config.md 配置管理 / 环境变量(🔴 必遵)
174
- ├── 08-git.md Git 分支 & 提交规范(🔴 必遵)
175
- ├── 09-typescript.md TypeScript 类型规范(strict:false 环境)(🟡 建议)
176
- ├── 10-pinia.md Pinia 状态管理规范(🔴 必遵)
177
- ├── 11-form-validation.md 表单与校验规范(🔴 必遵)
178
- ├── 12-base-table.md BaseTable + AGGrid cid 命名规范(🔴 必遵)
179
- └── 13-platform-components.md 平台组件对照表(🔴 必遵 + 阻断)
180
- ```
181
-
182
- **懒加载门控设计**:
183
-
184
- `index.md` 维护任务类型 → 规范子集的映射表。AI 接到任务时,先查 `index.md` 确认本次任务需要加载哪些规范文件,而不是每次全部读取 13 条。典型负载:
185
-
186
- | 任务类型 | 加载规范数 | 说明 |
187
- | ---------------- | ---------- | --------------------------- |
188
- | 生成新页面 | 5 条 | 01 / 02 / 04 / 12 / 13(按需 +09/10/11) |
189
- | 修改/重构页面 | 3 条 | 02 / 04 / 13(按需 +09/10/11) |
190
- | 规范审计(全量) | 13 条 | 全部加载 |
191
- | 菜单/同步操作 | 1 条 | 07(环境变量不硬编码) |
192
- | 仅 Git 提交 | 1 条 | 08 |
193
-
194
- **第 13 条的特殊地位**:`13-platform-components.md` 是最核心的 AI 行为约束,强制 AI 在生成代码时优先使用平台封装组件(`@jhlc/jh-ui` / `@jhlc/common-core`),禁止随意使用原始 `el-table` / `el-form`。与第 12 条(BaseTable/AGGrid 封装)并列为质量门控最高优先级。
195
-
196
- ---
197
-
198
- ### 4.2 Skill 层(skills/)
199
-
200
- **分级目录**:
201
-
202
- ```
203
- skills/
204
- ├── _registry.md 触发词 → SKILL 路径(单一数据源,禁止其他地方重复定义触发词)
205
- ├── _compat/ 多 AI 编辑器适配层(见 4.3)
206
-
207
- ├── core/ 核心通用 Skill(任何前端项目均可使用)
208
- │ ├── prototype-scan/ 原型/口述 → 页面清单
209
- │ ├── api-contract/ 页面清单 → api.md 前后端契约
210
- │ ├── page-codegen/ api.md → 4文件骨架代码
211
- │ ├── convention-audit/ 现有代码 → 规范偏差报告
212
- │ └── template-extract/ 成熟页面 → 领域模板(沉淀复用)
213
-
214
- ├── sync/ 数据同步类(与后端系统联动)
215
- │ ├── menu-sync/ ✅ 启用:菜单基线 ↔ 后端菜单接口
216
- │ ├── dict-sync/ ⏳ PLANNED
217
- │ └── permission-sync/ ⏳ PLANNED
218
-
219
- ├── ops/ 运维/质量类
220
- │ └── code-fix/ ⏳ PLANNED:受控自动修复偏差
221
-
222
- └── domain/ 领域专属 Skill(按需创建,初始为空)
223
- └── README.md
224
- ```
225
-
226
- **Skill 调度流程**:
227
-
228
- ```
229
- 用户说出意图
230
- → AI 扫描 _registry.md 触发词表
231
- → 命中 → read_file 加载对应 SKILL.md
232
- → SKILL.md 声明必读 standards → AI 按需加载规范
233
- → 输出 Pre-flight 声明 → 执行任务
234
- ```
235
-
236
- **扩展边界**:当 `domain/` 下某域 Skill 超过 5 个,或出现跨团队复用需求时,拆为独立 npm 包(如 `@agile-team/wl-skills-produce`),本包保留 `core/sync/ops`。
237
-
238
- ---
239
-
240
- ### 4.3 适配层(\_compat/)
241
-
242
- **核心问题**:9 种 AI 编辑器读取格式各异,有的需要 frontmatter,有的不需要,字段也不同:
243
-
244
- | 编辑器 | 加载路径 | frontmatter 要求 |
245
- | ------------ | --------------------------------- | ----------------------------------- |
246
- | Copilot | `.github/copilot-instructions.md` | 无 |
247
- | Claude | `CLAUDE.md` | 无 |
248
- | Cursor(旧) | `.cursorrules` | 无 |
249
- | Cursor(新) | `.cursor/rules/*.mdc` | `description + globs + alwaysApply` |
250
- | Windsurf | `.windsurfrules` | 无 |
251
- | Cline | `.clinerules` | 无 |
252
- | Kiro | `.kiro/steering/*.md` | `inclusion: always` |
253
- | Trae | `.trae/rules/*.md` | `description + alwaysApply` |
254
- | 通用 | `AGENTS.md` | 无 |
255
-
256
- **解耦设计**:
257
-
258
- ```
259
- _compat/
260
- ├── editors.json ← 编辑器注册表(bin 读此决定生成什么)
261
- ├── headers/ ← 各编辑器特化头部模板(含 frontmatter)
262
- │ ├── cursor-mdc.txt description + globs + alwaysApply
263
- │ ├── kiro.txt inclusion: always
264
- │ ├── trae.txt description + alwaysApply
265
- │ └── ...(无 frontmatter 的也有对应 txt,写版权注释)
266
- └── README.md
267
- ```
268
-
269
- **解耦效果**:
270
-
271
- - 主体内容(规范 + Skill 调度逻辑)来自 `copilot-instructions.md`,**单一数据源**
272
- - 每个编辑器的差异只在 `headers/*.txt` 里定义,互不干扰
273
- - 在 `editors.json` 中将某编辑器 `enabled: false`,重跑 `update` 后该文件不再生成,其他编辑器配置**完全不受影响**(已验证)
274
-
275
- ---
276
-
277
- ### 4.4 报告层(reports/)
278
-
279
- **设计原则:追加不覆盖**
280
-
281
- `reports/` 是团队的**累积知识资产**,`init`/`update` 命令遇到已存在的报告文件一律跳过。
282
-
283
- ```
284
- reports/
285
- ├── SYS_MENU_INFO.md 线上菜单基线(menu-sync 的数据来源)
286
- ├── SYS_DICT_INFO.md 线上字典基线(dict-sync PLANNED)
287
- ├── SYS_PERMISSION_INFO.md 线上权限基线(permission-sync PLANNED)
288
- ├── PROTOTYPE_SCAN_*.md 原型扫描结果(prototype-scan 生成)
289
- ├── PAGE_CODEGEN_*.md 代码生成摘要(page-codegen 生成)
290
- ├── AUDIT_AI_*.md 规范审计详细报告(convention-audit 生成,AI 读)
291
- ├── AUDIT_HUMAN_*.md 规范审计摘要(convention-audit 生成,人读)
292
- ├── MENU_SYNC_*.md 菜单同步操作日志(menu-sync 生成)
293
- └── CODE_FIX_*.md 自动修复操作日志(code-fix PLANNED)
294
- ```
295
-
296
- **三类报告的写入规则**:
297
-
298
- | 类别 | 文件 | 写入方式 | 用途 |
299
- | -------- | --------------------- | ---------------------------- | ----------------------------- |
300
- | 系统基线 | `SYS_*.md` | pull 时全量刷新 | 作为 sync 系列 Skill 的数据源 |
301
- | 过程报告 | `PROTOTYPE_SCAN_*` 等 | 每次生成追加,文件名带时间戳 | 可追溯历史 |
302
- | 操作日志 | `MENU_SYNC_*` 等 | 每次操作追加,含回滚 SQL | 出了问题可查回滚 |
303
-
304
- ---
305
-
306
- ### 4.5 模板层(page-codegen/templates/)
307
-
308
- **分层策略**:
309
-
310
- ```
311
- templates/
312
- ├── _index.md 模板注册表(单一数据源)
313
- ├── universal/ 通用交互模式模板(跨业务域通用)
314
- │ ├── TPL-LIST.md 普通列表页
315
- │ ├── TPL-MASTER-DETAIL.md 主从详情页
316
- │ ├── TPL-TREE-LIST.md 树形列表页
317
- │ ├── TPL-DETAIL-TABS.md 详情 Tabs 页
318
- │ ├── TPL-FORM-ROUTE.md 路由级表单页
319
- │ ├── TPL-RECORD-FORM.md 记录级表单
320
- │ ├── TPL-CHANGE-HISTORY.md 变更历史页
321
- │ └── TPL-DRIVEN.md 配置驱动页
322
- └── domains/ 领域专属模板(单领域高频)
323
- ├── _CONTRIBUTING.md 贡献规范
324
- ├── produce/ 生产域
325
- │ └── TPL-OPERATION-STATION.md
326
- └── sale/ 销售域(占位,待沉淀)
327
- ```
328
-
329
- **模板选择优先级**:
330
-
331
- ```
332
- 命中 domains/{域}/{场景} → 优先使用领域模板
333
- 未命中 → 回落 universal/{类型} → 通用模板
334
- 两者都不匹配 → AI 基于规范 + 上下文自由生成(并在完成摘要中标注)
335
- ```
336
-
337
- **`template-extract` 配套**:团队成员可通过 `template-extract` Skill,只需提供一个目录路径,AI 自动将成熟页面分析提取为 `.tpl` 格式模板并写入 `domains/`,**门槛极低**是驱动团队贡献的关键。
338
-
339
- ---
340
-
341
- ## 5. Pre-flight 约定式输出机制
342
-
343
- ### 问题
344
-
345
- AI "假执行"——声称读了规范,实际按惯性输出。没有强制约束时,Pre-flight 形同虚设。
346
-
347
- ### 机制
348
-
349
- 三层保障:
350
-
351
- **第一层**:`copilot-instructions.md` 主入口明文要求:
352
-
353
- > 触发任何 Skill 时,**必须在回复第一段输出 Pre-flight 声明**,列出已读文件、检测结果、关键参数(cid 等)。跳过 Pre-flight = 未执行 Skill,开发者有权要求重来。
354
-
355
- **第二层**:每个 `SKILL.md` 文件顶部重复声明:
356
-
357
- ```
358
- ## Pre-flight 声明
359
-
360
- 在开始任何操作之前,必须输出:
361
- 🚀 已触发技能 page-codegen/SKILL.md → 页面代码生成
362
- ✅ 已读取 standards/02-code-structure.md → 4文件原则
363
- ✅ 工具链检测:.prettierrc.js ✓ eslint.config.ts ✓ .husky/ ✓
364
- ✅ cid 已生成:cl-745831
365
- ```
366
-
367
- **第三层**:错误回退——如 AI 未输出 Pre-flight,开发者一句"补 Pre-flight 声明",AI 必须补充,否则视为工具失效,升级处理。
368
-
369
- ### 为什么用约定式输出而不是工具调用
370
-
371
- 见 [ADR-001](#adr-001约定式输出而非工具调用)。
372
-
373
- ---
374
-
375
- ## 6. 三层文档体系
376
-
377
- 每个启用的 Skill 有三类配套文档,面向不同读者:
378
-
379
- | 文件 | 读者 | 位置 | 内容 |
380
- | --------------- | -------------- | ------------------------ | ---------------------------------- |
381
- | `SKILL.md` | AI 编辑器/模型 | `skills/{scope}/{name}/` | 触发词、Pre-flight、执行步骤、约束 |
382
- | `USAGE.md` | 团队成员 | `skills/{scope}/{name}/` | 示例对话、踩坑、FAQ、快速上手 |
383
- | `*.MAINTAIN.md` | kit 维护者 | `kit-internal/skills/` | 设计背景、修改要点、版本依赖 |
384
-
385
- **设计意图**:
386
-
387
- - `SKILL.md` 写给机器看:精确、结构化、无废话
388
- - `USAGE.md` 写给人看:有温度、有示例、有踩坑经验
389
- - `MAINTAIN.md` 写给维护者看:为什么这么设计、改的时候要注意什么
390
-
391
- 三者严格分离,避免"AI 读到人类语气的废话"或"人类读到机器格式"的不适。
392
-
393
- ---
394
-
395
- ## 7. Skill 生命周期管理
396
-
397
- ```
398
- 需求识别
399
-
400
-
401
- ⏳ PLANNED(SKILL.draft.md)
402
- │ 包含:设计目标、数据流、工作模式、转正条件
403
- │ 不参与 AI 调度(_registry.md 中不注册)
404
-
405
- ▼ 满足转正条件:
406
- │ ① 设计草稿评审通过
407
- │ ② 至少一个真实项目端到端跑通
408
- │ ③ 文档完整(SKILL.md + USAGE.md + MAINTAIN.md)
409
- │ ④ 触发词不与现有 Skill 冲突
410
-
411
-
412
- ✅ 启用(SKILL.md)
413
- │ 注册到 _registry.md
414
- │ 参与 AI 调度
415
-
416
- ▼ 技术过时 / 被更好方案替代
417
-
418
- ⚠️ 废弃(SKILL.deprecated.md)
419
- │ 从 _registry.md 移除
420
- │ 保留文件 + 废弃说明,不直接删除
421
- ```
422
-
423
- ---
424
-
425
- ## 8. 菜单/字典/权限同步机制
426
-
427
- 三类 sync Skill 共用同一模式,以 `menu-sync` 为基准(已启用):
428
-
429
- ```
430
- 本地基线文件(reports/SYS_MENU_INFO.md)
431
-
432
- ├─ pull 模式:从线上拉取 → 全量刷新基线
433
-
434
- └─ push 模式:
435
- ① 读取基线
436
- ② 扫描业务项目(src/views/ 下的页面)
437
- ③ 对比:基线 vs 线上 → 找出缺失条目
438
- ④ Pre-flight 输出操作预览(必须用户确认)
439
- ⑤ 调用后端接口写入
440
- ⑥ 输出操作日志(含回滚 SQL)到 reports/MENU_SYNC_*.md
441
- ```
442
-
443
- **关键设计约束**:
444
-
445
- - **env.local.json 不入 git**:包含 token / gatewayPath,每个开发者本地配置
446
- - **永远不主动删除**:sync 系列 Skill 只做新增/更新,删除走人工 + 后台
447
- - **生产环境保护**:检测到 gatewayPath 含生产域名时,强制输出 SQL 而不直接调用接口
448
- - **二次确认**:任何写操作,Pre-flight 声明后必须等用户 `yes` 才执行
449
-
450
- ---
451
-
452
- ## 9. 工具链前置检测
453
-
454
- `page-codegen` / `convention-audit` 等代码生成/审计类 Skill 在执行前,必须检查项目是否安装了 `@robot-admin/git-standards`(提供 prettier / eslint / husky 配置):
455
-
456
- ```
457
- 检测文件:.prettierrc.js / eslint.config.ts / .husky/
458
-
459
- 全部存在 → ✅ 继续执行
460
-
461
- 任一缺失 → ❌ 暂停执行,输出:
462
- 工具链检测失败:未找到 [具体文件]
463
- → 请执行:npx @robot-admin/git-standards init
464
- → 原因:生成代码必须在统一格式化/lint 规则下有效,否则代码写完就报错
465
- ⛔ 代码生成已暂停
466
- ```
467
-
468
- > 使用 `npx` 而非 `npm install` 的原因:`@robot-admin/git-standards` 是一次性初始化工具,运行后只留下配置文件,包本身不需要出现在 `devDependencies`(零运行时依赖,零污染)。
469
-
470
- ---
471
-
472
- ## 10. 版本演进历史
473
-
474
- | 版本 | 核心变化 | 状态 |
475
- | ---- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------- |
476
- | v1.x | 5 个 Skill 平铺 + 9 个 TPL 平铺 + 单一超长 copilot-instructions | ✅ 已发布 |
477
- | v2.0 | 规范模块化(13 条)+ 模板分层(universal/domains)+ 报告分类 + Pre-flight + 工具链门控 | ✅ 已发布 |
478
- | v2.1 | Skill 分级目录(core/sync/ops/domain)+ 多 AI 适配解耦(editors.json)+ 各 Skill USAGE.md + api-contract 真实响应 + 3 个 PLANNED 草稿补全 | ✅ 当前 |
479
- | v2.2 | dict-sync / permission-sync / code-fix 从 PLANNED → 转正(视后端接口稳定情况) | ⏳ 规划中 |
480
- | v2.3 | CI 流水线接入(convention-audit 报告注入 PR 评论)+ Skill 版本感知 | ⏳ 规划中 |
481
-
482
- ---
483
-
484
- ## 11. 关键决策记录(ADR)
485
-
486
- ### ADR-001:约定式输出而非工具调用
487
-
488
- **背景**:如何强制 AI 输出 Pre-flight 声明?
489
-
490
- **决策**:用 `SKILL.md` 内文本约定(约定式输出),不用自定义工具函数(如 `pre_flight()`)。
491
-
492
- **理由**:
493
-
494
- - 约定式输出:所有 AI 模型都支持(Copilot/Claude/GPT/本地模型)
495
- - 工具调用:需要编辑器支持函数调用协议,且各编辑器实现不同——与"多 AI 适配"目标矛盾
496
-
497
- ---
498
-
499
- ### ADR-002:文件命名全英文
500
-
501
- **背景**:部分工具在中文路径上有编码问题(Git / Node.js / Windows cmd)。
502
-
503
- **决策**:所有文件名使用英文(kebab-case),文件内容使用中文。
504
-
505
- **效果**:路径安全 + 内容可读,两全其美。
506
-
507
- ---
508
-
509
- ### ADR-003:PLANNED Skill 用 `.draft.md` 后缀
510
-
511
- **背景**:PLANNED Skill 需要在仓库中占位(体现架构意图),但不能被 AI 调度。
512
-
513
- **决策**:用 `SKILL.draft.md` 后缀代替 `SKILL.md`,`_registry.md` 只注册 `SKILL.md` 文件。
514
-
515
- **效果**:AI 按触发词只会加载 `SKILL.md`,`SKILL.draft.md` 不参与调度,但对维护者可见且路径明确。
516
-
517
- ---
518
-
519
- ### ADR-004:模板提取用"开发者指路 + AI 分析"混合模式
520
-
521
- **背景**:如何让团队成员以极低门槛贡献领域模板?
522
-
523
- **方案对比**:
524
-
525
- | 方案 | 门槛 | 质量 | 结论 |
526
- | -------------- | ---- | ----------------------------- | ------------- |
527
- | 全自动扫描 | 极低 | 低(AI 不知道"哪个值得提取") | ❌ |
528
- | 纯手写模板 | 高 | 高 | ❌ 团队不会用 |
529
- | 指路 + AI 分析 | 低 | 高 | ✅ |
530
-
531
- **决策**:开发者只需提供目录路径,AI 读代码 → 分析 → 生成模板,90% 工作量由 AI 完成。
532
-
533
- ---
534
-
535
- ### ADR-005:多 AI 编辑器适配解耦(editors.json 注册表)
536
-
537
- **背景**:v2.0 的 `getEditorConfigs()` 把 9 个编辑器硬编码在 `bin/wl-skills.js` 里,frontmatter 也只有 Cursor 做了特化,其他编辑器全部用相同格式。
538
-
539
- **问题**:
540
-
541
- 1. 添加新编辑器 → 改 JS 代码
542
- 2. 移除某编辑器 → 改 JS 代码 + 需要小心不影响其他
543
- 3. Kiro / Trae 没有专属 frontmatter → 不满足编辑器官方最佳实践
544
-
545
- **决策**:
546
-
547
- - 提取 `_compat/editors.json` 作为编辑器注册表(数据 vs 代码分离)
548
- - 提取 `_compat/headers/` 作为各编辑器 frontmatter 模板文件
549
- - `bin/wl-skills.js` 只有读取逻辑,不再硬编码任何编辑器信息
550
-
551
- **效果**:
552
-
553
- - 添加新编辑器:加 `headers/xxx.txt` + 在 `editors.json` 注册,JS 不改
554
- - 禁用某编辑器:`enabled: false` 一行,其他编辑器完全不受影响(已端到端验证)
555
- - 每个编辑器 frontmatter 独立维护,Kiro 有 `inclusion: always`,Trae 有 `description + alwaysApply`
1
+ # wl-skills-kit 架构设计与决策记录
2
+
3
+ > **读者**:团队技术负责人 / wl-skills-kit 维护者 / 对体系设计感兴趣的团队成员
4
+ > **更新方式**:重大架构变更后追加对应章节,旧章节原文保留(历史可溯)
5
+ > **当前版本**:v2.1(2026-04-26)
6
+
7
+ ---
8
+
9
+ ## 目录
10
+
11
+ 1. [这个体系解决什么问题](#1-这个体系解决什么问题)
12
+ 2. [npm 包工作机制](#2-npm-包工作机制)
13
+ 3. [整体运行时架构](#3-整体运行时架构)
14
+ 4. [分层架构详解](#4-分层架构详解)
15
+ - 4.1 规范层(standards/)
16
+ - 4.2 Skill 层(skills/)
17
+ - 4.3 适配层(\_compat/)
18
+ - 4.4 报告层(reports/)
19
+ - 4.5 模板层(page-codegen/templates/)
20
+ 5. [Pre-flight 约定式输出机制](#5-pre-flight-约定式输出机制)
21
+ 6. [三层文档体系](#6-三层文档体系)
22
+ 7. [Skill 生命周期管理](#7-skill-生命周期管理)
23
+ 8. [菜单/字典/权限同步机制](#8-菜单字典权限同步机制)
24
+ 9. [工具链前置检测](#9-工具链前置检测)
25
+ 10. [版本演进历史](#10-版本演进历史)
26
+ 11. [关键决策记录(ADR)](#11-关键决策记录adr)
27
+
28
+ ---
29
+
30
+ ## 1. 这个体系解决什么问题
31
+
32
+ ### 根本问题:AI 不了解"你的项目"
33
+
34
+ AI 编辑器(Copilot / Cursor / Windsurf 等)知道通用编程知识,但不知道:
35
+
36
+ - 这个项目用 `AbstractPageQueryHook` 而不是手写 `ref` + `axios`
37
+ - 表格必须用 `AGGrid` 的封装,不能直接用 `el-table`
38
+ - API 响应外壳是 `{ code: 2000, data: {...} }`,不是 `{ code: 200, result: {} }`
39
+ - 页面目录必须是 4 文件(data.ts / index.vue / index.scss / api.md)
40
+ - 菜单注册有专门的后端接口流程,不是手改路由文件
41
+
42
+ 不了解这些,AI 每次都会生成"语法正确但不合规"的代码,增加 review 成本。
43
+
44
+ ### 传统方案的缺陷
45
+
46
+ | 方案 | 问题 |
47
+ | ------------------------------------ | ------------------------------------------------- |
48
+ | 把规范写进 wiki | AI 不读 wiki;wiki 和代码脱节 |
49
+ | 把规范贴进每次对话 | 重复劳动;规范长了 token 爆炸;换 AI 工具就要重来 |
50
+ | 一个超长的 `copilot-instructions.md` | v1.x 试过,膨胀到 600+ 行,AI 全量加载不看实际 |
51
+
52
+ ### 本方案的核心思路
53
+
54
+ > **把规范做成 AI 可自动加载的结构化知识库,以 Skill 为粒度按需调度,形成"口述意图 → 符合规范的完整实现"的闭环。**
55
+
56
+ 具体体现为:
57
+
58
+ 1. 规范分层、按任务类型懒加载(token 高效利用)
59
+ 2. Skill 触发词驱动(开发者用自然语言,AI 读结构化 SKILL.md)
60
+ 3. Pre-flight 约定式声明(消除 AI "假执行"黑盒问题)
61
+ 4. 多 AI 编辑器适配(一套内容,自动生成 9 种根配置,解耦可扩展)
62
+ 5. 报告层追加不覆盖(累积团队知识,不丢失审计历史)
63
+
64
+ ---
65
+
66
+ ## 2. npm 包工作机制
67
+
68
+ `wl-skills-kit` 是一个**一次性初始化型 npm 包(scaffolding CLI)**,不是运行时依赖:
69
+
70
+ ```
71
+ npx @agile-team/wl-skills-kit ← 下载 → 执行 → 完成,不留在 dependencies
72
+ npx @agile-team/wl-skills-kit update ← 增量更新,可在业务项目生命周期中多次运行
73
+ ```
74
+
75
+ ### 仓库目录 vs 业务项目目录
76
+
77
+ | 仓库目录 | 说明 | 会被安装? |
78
+ | --------------- | ----------------------------------------- | ---------- |
79
+ | `bin/` | CLI 实现(`wl-skills.js`) | ✅ 会 |
80
+ | `files/` | 所有要复制到业务项目的文件 | ✅ 会 |
81
+ | `kit-internal/` | 维护者文档(architecture / CONTRIBUTING) | ❌ 不会 |
82
+ | `CHANGELOG.md` | 版本记录 | ✅ 会 |
83
+
84
+ > **关键**:`kit-internal/` 通过 `package.json` 的 `files` 白名单机制严格排除,永远不会进入业务项目。
85
+
86
+ ### bin/wl-skills.js 工作流程
87
+
88
+ ```
89
+ wl-skills.js init/update
90
+
91
+ ├─ 1. 递归读取 files/ 目录下所有文件
92
+
93
+ ├─ 2. 读取 files/.github/copilot-instructions.md(主体内容)
94
+
95
+ ├─ 3. 读取 _compat/editors.json(编辑器注册表)
96
+ │ 对每个 enabled editor:
97
+ │ 读取 _compat/headers/{editor}.txt(特化 frontmatter)
98
+ │ 拼接:header + 自动生成注释 + 主体内容
99
+ │ 写入 editor.outputPath(如 CLAUDE.md / .cursorrules / ...)
100
+
101
+ ├─ 4. 写入其他 files/ 文件到目标目录
102
+ │ - reports/*.md 已存在则跳过(保护团队累积数据)
103
+ │ - 其他文件:覆盖写入
104
+
105
+ └─ 5. 写入/更新 .wl-skills-manifest.json(文件哈希快照)
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 3. 整体运行时架构
111
+
112
+ ```
113
+ 开发者
114
+ │ 在 AI 对话中说出意图
115
+ │ "帮我生成客户管理列表页"
116
+
117
+ AI 编辑器(Copilot / Cursor / Windsurf / Claude Code / Cline / Kiro / Trae)
118
+
119
+ │ 自动加载根配置文件(各编辑器读自己的文件):
120
+ │ Copilot → .github/copilot-instructions.md
121
+ │ Claude → CLAUDE.md
122
+ │ Cursor → .cursorrules + .cursor/rules/conventions.mdc
123
+ │ Windsurf → .windsurfrules
124
+ │ Cline → .clinerules
125
+ │ Kiro → .kiro/steering/conventions.md
126
+ │ Trae → .trae/rules/conventions.md
127
+ │ 通用 → AGENTS.md
128
+
129
+ │ 根配置包含:
130
+ │ - 项目架构概要(栈、4文件原则、API契约)
131
+ │ - Skill 调度规则(触发词 → 读 _registry.md → 读 SKILL.md)
132
+ │ - Pre-flight 输出要求
133
+
134
+
135
+ .github/skills/_registry.md
136
+ │ 触发词 → SKILL 路径映射
137
+ │ "生成页面" → skills/core/page-codegen/SKILL.md
138
+
139
+
140
+ .github/skills/core/page-codegen/SKILL.md
141
+ │ 声明:必读 standards 列表 + 完整生成流程 + 输出规范
142
+
143
+
144
+ .github/standards/(按 index.md 门控,按需加载)
145
+ │ page-codegen 需要:02/06/07/08/12/13 共 6 条
146
+ │ convention-audit 需要:全部 13 条
147
+
148
+
149
+ AI 生成代码/报告/api.md
150
+
151
+ └─ 写入到:
152
+ src/views/<域>/<模块>/<子模块>/<page>/
153
+ .github/reports/(追加写入)
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 4. 分层架构详解
159
+
160
+ ### 4.1 规范层(standards/)
161
+
162
+ **目录结构**:
163
+
164
+ ```
165
+ standards/
166
+ ├── index.md ← 门控:任务类型 → 规范子集映射
167
+ ├── 01-toolchain.md 工具链前置检测(🔴 阻断)
168
+ ├── 02-code-structure.md 4文件原则 + 三段式 + script 9段顺序(🔴 必遵)
169
+ ├── 03-comments.md 注释规范(🟡 建议)
170
+ ├── 04-coding-basics.md 基础编码 13 条(🔴 必遵)
171
+ ├── 05-logging.md 日志输出规范(🔴 必遵)
172
+ ├── 06-security.md 安全规范(🔴 必遵)
173
+ ├── 07-config.md 配置管理 / 环境变量(🔴 必遵)
174
+ ├── 08-git.md Git 分支 & 提交规范(🔴 必遵)
175
+ ├── 09-typescript.md TypeScript 类型规范(strict:false 环境)(🟡 建议)
176
+ ├── 10-pinia.md Pinia 状态管理规范(🔴 必遵)
177
+ ├── 11-form-validation.md 表单与校验规范(🔴 必遵)
178
+ ├── 12-base-table.md BaseTable + AGGrid cid 命名规范(🔴 必遵)
179
+ └── 13-platform-components.md 平台组件对照表(🔴 必遵 + 阻断)
180
+ ```
181
+
182
+ **懒加载门控设计**:
183
+
184
+ `index.md` 维护任务类型 → 规范子集的映射表。AI 接到任务时,先查 `index.md` 确认本次任务需要加载哪些规范文件,而不是每次全部读取 13 条。典型负载:
185
+
186
+ | 任务类型 | 加载规范数 | 说明 |
187
+ | ---------------- | ---------- | --------------------------- |
188
+ | 生成新页面 | 5 条 | 01 / 02 / 04 / 12 / 13(按需 +09/10/11) |
189
+ | 修改/重构页面 | 3 条 | 02 / 04 / 13(按需 +09/10/11) |
190
+ | 规范审计(全量) | 13 条 | 全部加载 |
191
+ | 菜单/同步操作 | 1 条 | 07(环境变量不硬编码) |
192
+ | 仅 Git 提交 | 1 条 | 08 |
193
+
194
+ **第 13 条的特殊地位**:`13-platform-components.md` 是最核心的 AI 行为约束,强制 AI 在生成代码时优先使用平台封装组件(`@jhlc/jh-ui` / `@jhlc/common-core`),禁止随意使用原始 `el-table` / `el-form`。与第 12 条(BaseTable/AGGrid 封装)并列为质量门控最高优先级。
195
+
196
+ ---
197
+
198
+ ### 4.2 Skill 层(skills/)
199
+
200
+ **分级目录**:
201
+
202
+ ```
203
+ skills/
204
+ ├── _registry.md 触发词 → SKILL 路径(单一数据源,禁止其他地方重复定义触发词)
205
+ ├── _compat/ 多 AI 编辑器适配层(见 4.3)
206
+
207
+ ├── core/ 核心通用 Skill(任何前端项目均可使用)
208
+ │ ├── prototype-scan/ 原型/口述 → 页面清单
209
+ │ ├── api-contract/ 页面清单 → api.md 前后端契约
210
+ │ ├── page-codegen/ api.md → 4文件骨架代码
211
+ │ ├── convention-audit/ 现有代码 → 规范偏差报告
212
+ │ └── template-extract/ 成熟页面 → 领域模板(沉淀复用)
213
+
214
+ ├── sync/ 数据同步类(与后端系统联动)
215
+ │ ├── menu-sync/ ✅ 启用:菜单基线 ↔ 后端菜单接口
216
+ │ ├── dict-sync/ ⏳ PLANNED
217
+ │ └── permission-sync/ ⏳ PLANNED
218
+
219
+ ├── ops/ 运维/质量类
220
+ │ └── code-fix/ ⏳ PLANNED:受控自动修复偏差
221
+
222
+ └── domain/ 领域专属 Skill(按需创建,初始为空)
223
+ └── README.md
224
+ ```
225
+
226
+ **Skill 调度流程**:
227
+
228
+ ```
229
+ 用户说出意图
230
+ → AI 扫描 _registry.md 触发词表
231
+ → 命中 → read_file 加载对应 SKILL.md
232
+ → SKILL.md 声明必读 standards → AI 按需加载规范
233
+ → 输出 Pre-flight 声明 → 执行任务
234
+ ```
235
+
236
+ **扩展边界**:当 `domain/` 下某域 Skill 超过 5 个,或出现跨团队复用需求时,拆为独立 npm 包(如 `@agile-team/wl-skills-produce`),本包保留 `core/sync/ops`。
237
+
238
+ ---
239
+
240
+ ### 4.3 适配层(\_compat/)
241
+
242
+ **核心问题**:9 种 AI 编辑器读取格式各异,有的需要 frontmatter,有的不需要,字段也不同:
243
+
244
+ | 编辑器 | 加载路径 | frontmatter 要求 |
245
+ | ------------ | --------------------------------- | ----------------------------------- |
246
+ | Copilot | `.github/copilot-instructions.md` | 无 |
247
+ | Claude | `CLAUDE.md` | 无 |
248
+ | Cursor(旧) | `.cursorrules` | 无 |
249
+ | Cursor(新) | `.cursor/rules/*.mdc` | `description + globs + alwaysApply` |
250
+ | Windsurf | `.windsurfrules` | 无 |
251
+ | Cline | `.clinerules` | 无 |
252
+ | Kiro | `.kiro/steering/*.md` | `inclusion: always` |
253
+ | Trae | `.trae/rules/*.md` | `description + alwaysApply` |
254
+ | 通用 | `AGENTS.md` | 无 |
255
+
256
+ **解耦设计**:
257
+
258
+ ```
259
+ _compat/
260
+ ├── editors.json ← 编辑器注册表(bin 读此决定生成什么)
261
+ ├── headers/ ← 各编辑器特化头部模板(含 frontmatter)
262
+ │ ├── cursor-mdc.txt description + globs + alwaysApply
263
+ │ ├── kiro.txt inclusion: always
264
+ │ ├── trae.txt description + alwaysApply
265
+ │ └── ...(无 frontmatter 的也有对应 txt,写版权注释)
266
+ └── README.md
267
+ ```
268
+
269
+ **解耦效果**:
270
+
271
+ - 主体内容(规范 + Skill 调度逻辑)来自 `copilot-instructions.md`,**单一数据源**
272
+ - 每个编辑器的差异只在 `headers/*.txt` 里定义,互不干扰
273
+ - 在 `editors.json` 中将某编辑器 `enabled: false`,重跑 `update` 后该文件不再生成,其他编辑器配置**完全不受影响**(已验证)
274
+
275
+ ---
276
+
277
+ ### 4.4 报告层(reports/)
278
+
279
+ **设计原则:追加不覆盖**
280
+
281
+ `reports/` 是团队的**累积知识资产**,`init`/`update` 命令遇到已存在的报告文件一律跳过。
282
+
283
+ ```
284
+ reports/
285
+ ├── SYS_MENU_INFO.md 线上菜单基线(menu-sync 的数据来源)
286
+ ├── SYS_DICT_INFO.md 线上字典基线(dict-sync PLANNED)
287
+ ├── SYS_PERMISSION_INFO.md 线上权限基线(permission-sync PLANNED)
288
+ ├── PROTOTYPE_SCAN_*.md 原型扫描结果(prototype-scan 生成)
289
+ ├── PAGE_CODEGEN_*.md 代码生成摘要(page-codegen 生成)
290
+ ├── AUDIT_AI_*.md 规范审计详细报告(convention-audit 生成,AI 读)
291
+ ├── AUDIT_HUMAN_*.md 规范审计摘要(convention-audit 生成,人读)
292
+ ├── MENU_SYNC_*.md 菜单同步操作日志(menu-sync 生成)
293
+ └── CODE_FIX_*.md 自动修复操作日志(code-fix PLANNED)
294
+ ```
295
+
296
+ **三类报告的写入规则**:
297
+
298
+ | 类别 | 文件 | 写入方式 | 用途 |
299
+ | -------- | --------------------- | ---------------------------- | ----------------------------- |
300
+ | 系统基线 | `SYS_*.md` | pull 时全量刷新 | 作为 sync 系列 Skill 的数据源 |
301
+ | 过程报告 | `PROTOTYPE_SCAN_*` 等 | 每次生成追加,文件名带时间戳 | 可追溯历史 |
302
+ | 操作日志 | `MENU_SYNC_*` 等 | 每次操作追加,含回滚 SQL | 出了问题可查回滚 |
303
+
304
+ ---
305
+
306
+ ### 4.5 模板层(page-codegen/templates/)
307
+
308
+ **分层策略**:
309
+
310
+ ```
311
+ templates/
312
+ ├── _index.md 模板注册表(单一数据源)
313
+ ├── universal/ 通用交互模式模板(跨业务域通用)
314
+ │ ├── TPL-LIST.md 普通列表页
315
+ │ ├── TPL-MASTER-DETAIL.md 主从详情页
316
+ │ ├── TPL-TREE-LIST.md 树形列表页
317
+ │ ├── TPL-DETAIL-TABS.md 详情 Tabs 页
318
+ │ ├── TPL-FORM-ROUTE.md 路由级表单页
319
+ │ ├── TPL-RECORD-FORM.md 记录级表单
320
+ │ ├── TPL-CHANGE-HISTORY.md 变更历史页
321
+ │ └── TPL-DRIVEN.md 配置驱动页
322
+ └── domains/ 领域专属模板(单领域高频)
323
+ ├── _CONTRIBUTING.md 贡献规范
324
+ ├── produce/ 生产域
325
+ │ └── TPL-OPERATION-STATION.md
326
+ └── sale/ 销售域(占位,待沉淀)
327
+ ```
328
+
329
+ **模板选择优先级**:
330
+
331
+ ```
332
+ 命中 domains/{域}/{场景} → 优先使用领域模板
333
+ 未命中 → 回落 universal/{类型} → 通用模板
334
+ 两者都不匹配 → AI 基于规范 + 上下文自由生成(并在完成摘要中标注)
335
+ ```
336
+
337
+ **`template-extract` 配套**:团队成员可通过 `template-extract` Skill,只需提供一个目录路径,AI 自动将成熟页面分析提取为 `.tpl` 格式模板并写入 `domains/`,**门槛极低**是驱动团队贡献的关键。
338
+
339
+ ---
340
+
341
+ ## 5. Pre-flight 约定式输出机制
342
+
343
+ ### 问题
344
+
345
+ AI "假执行"——声称读了规范,实际按惯性输出。没有强制约束时,Pre-flight 形同虚设。
346
+
347
+ ### 机制
348
+
349
+ 三层保障:
350
+
351
+ **第一层**:`copilot-instructions.md` 主入口明文要求:
352
+
353
+ > 触发任何 Skill 时,**必须在回复第一段输出 Pre-flight 声明**,列出已读文件、检测结果、关键参数(cid 等)。跳过 Pre-flight = 未执行 Skill,开发者有权要求重来。
354
+
355
+ **第二层**:每个 `SKILL.md` 文件顶部重复声明:
356
+
357
+ ```
358
+ ## Pre-flight 声明
359
+
360
+ 在开始任何操作之前,必须输出:
361
+ 🚀 已触发技能 page-codegen/SKILL.md → 页面代码生成
362
+ ✅ 已读取 standards/02-code-structure.md → 4文件原则
363
+ ✅ 工具链检测:.prettierrc.js ✓ eslint.config.ts ✓ .husky/ ✓
364
+ ✅ cid 已生成:cl-745831
365
+ ```
366
+
367
+ **第三层**:错误回退——如 AI 未输出 Pre-flight,开发者一句"补 Pre-flight 声明",AI 必须补充,否则视为工具失效,升级处理。
368
+
369
+ ### 为什么用约定式输出而不是工具调用
370
+
371
+ 见 [ADR-001](#adr-001约定式输出而非工具调用)。
372
+
373
+ ---
374
+
375
+ ## 6. 三层文档体系
376
+
377
+ 每个启用的 Skill 有三类配套文档,面向不同读者:
378
+
379
+ | 文件 | 读者 | 位置 | 内容 |
380
+ | --------------- | -------------- | ------------------------ | ---------------------------------- |
381
+ | `SKILL.md` | AI 编辑器/模型 | `skills/{scope}/{name}/` | 触发词、Pre-flight、执行步骤、约束 |
382
+ | `USAGE.md` | 团队成员 | `skills/{scope}/{name}/` | 示例对话、踩坑、FAQ、快速上手 |
383
+ | `*.MAINTAIN.md` | kit 维护者 | `kit-internal/skills/` | 设计背景、修改要点、版本依赖 |
384
+
385
+ **设计意图**:
386
+
387
+ - `SKILL.md` 写给机器看:精确、结构化、无废话
388
+ - `USAGE.md` 写给人看:有温度、有示例、有踩坑经验
389
+ - `MAINTAIN.md` 写给维护者看:为什么这么设计、改的时候要注意什么
390
+
391
+ 三者严格分离,避免"AI 读到人类语气的废话"或"人类读到机器格式"的不适。
392
+
393
+ ---
394
+
395
+ ## 7. Skill 生命周期管理
396
+
397
+ ```
398
+ 需求识别
399
+
400
+
401
+ ⏳ PLANNED(SKILL.draft.md)
402
+ │ 包含:设计目标、数据流、工作模式、转正条件
403
+ │ 不参与 AI 调度(_registry.md 中不注册)
404
+
405
+ ▼ 满足转正条件:
406
+ │ ① 设计草稿评审通过
407
+ │ ② 至少一个真实项目端到端跑通
408
+ │ ③ 文档完整(SKILL.md + USAGE.md + MAINTAIN.md)
409
+ │ ④ 触发词不与现有 Skill 冲突
410
+
411
+
412
+ ✅ 启用(SKILL.md)
413
+ │ 注册到 _registry.md
414
+ │ 参与 AI 调度
415
+
416
+ ▼ 技术过时 / 被更好方案替代
417
+
418
+ ⚠️ 废弃(SKILL.deprecated.md)
419
+ │ 从 _registry.md 移除
420
+ │ 保留文件 + 废弃说明,不直接删除
421
+ ```
422
+
423
+ ---
424
+
425
+ ## 8. 菜单/字典/权限同步机制
426
+
427
+ 三类 sync Skill 共用同一模式,以 `menu-sync` 为基准(已启用):
428
+
429
+ ```
430
+ 本地基线文件(reports/SYS_MENU_INFO.md)
431
+
432
+ ├─ pull 模式:从线上拉取 → 全量刷新基线
433
+
434
+ └─ push 模式:
435
+ ① 读取基线
436
+ ② 扫描业务项目(src/views/ 下的页面)
437
+ ③ 对比:基线 vs 线上 → 找出缺失条目
438
+ ④ Pre-flight 输出操作预览(必须用户确认)
439
+ ⑤ 调用后端接口写入
440
+ ⑥ 输出操作日志(含回滚 SQL)到 reports/MENU_SYNC_*.md
441
+ ```
442
+
443
+ **关键设计约束**:
444
+
445
+ - **env.local.json 不入 git**:包含 token / gatewayPath,每个开发者本地配置
446
+ - **永远不主动删除**:sync 系列 Skill 只做新增/更新,删除走人工 + 后台
447
+ - **生产环境保护**:检测到 gatewayPath 含生产域名时,强制输出 SQL 而不直接调用接口
448
+ - **二次确认**:任何写操作,Pre-flight 声明后必须等用户 `yes` 才执行
449
+
450
+ ---
451
+
452
+ ## 9. 工具链前置检测
453
+
454
+ `page-codegen` / `convention-audit` 等代码生成/审计类 Skill 在执行前,必须检查项目是否安装了 `@robot-admin/git-standards`(提供 prettier / eslint / husky 配置):
455
+
456
+ ```
457
+ 检测文件:.prettierrc.js / eslint.config.ts / .husky/
458
+
459
+ 全部存在 → ✅ 继续执行
460
+
461
+ 任一缺失 → ❌ 暂停执行,输出:
462
+ 工具链检测失败:未找到 [具体文件]
463
+ → 请执行:npx @robot-admin/git-standards init
464
+ → 原因:生成代码必须在统一格式化/lint 规则下有效,否则代码写完就报错
465
+ ⛔ 代码生成已暂停
466
+ ```
467
+
468
+ > 使用 `npx` 而非 `npm install` 的原因:`@robot-admin/git-standards` 是一次性初始化工具,运行后只留下配置文件,包本身不需要出现在 `devDependencies`(零运行时依赖,零污染)。
469
+
470
+ ---
471
+
472
+ ## 10. 版本演进历史
473
+
474
+ | 版本 | 核心变化 | 状态 |
475
+ | ---- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------- |
476
+ | v1.x | 5 个 Skill 平铺 + 9 个 TPL 平铺 + 单一超长 copilot-instructions | ✅ 已发布 |
477
+ | v2.0 | 规范模块化(13 条)+ 模板分层(universal/domains)+ 报告分类 + Pre-flight + 工具链门控 | ✅ 已发布 |
478
+ | v2.1 | Skill 分级目录(core/sync/ops/domain)+ 多 AI 适配解耦(editors.json)+ 各 Skill USAGE.md + api-contract 真实响应 + 3 个 PLANNED 草稿补全 | ✅ 当前 |
479
+ | v2.2 | dict-sync / permission-sync / code-fix 从 PLANNED → 转正(视后端接口稳定情况) | ⏳ 规划中 |
480
+ | v2.3 | CI 流水线接入(convention-audit 报告注入 PR 评论)+ Skill 版本感知 | ⏳ 规划中 |
481
+
482
+ ---
483
+
484
+ ## 11. 关键决策记录(ADR)
485
+
486
+ ### ADR-001:约定式输出而非工具调用
487
+
488
+ **背景**:如何强制 AI 输出 Pre-flight 声明?
489
+
490
+ **决策**:用 `SKILL.md` 内文本约定(约定式输出),不用自定义工具函数(如 `pre_flight()`)。
491
+
492
+ **理由**:
493
+
494
+ - 约定式输出:所有 AI 模型都支持(Copilot/Claude/GPT/本地模型)
495
+ - 工具调用:需要编辑器支持函数调用协议,且各编辑器实现不同——与"多 AI 适配"目标矛盾
496
+
497
+ ---
498
+
499
+ ### ADR-002:文件命名全英文
500
+
501
+ **背景**:部分工具在中文路径上有编码问题(Git / Node.js / Windows cmd)。
502
+
503
+ **决策**:所有文件名使用英文(kebab-case),文件内容使用中文。
504
+
505
+ **效果**:路径安全 + 内容可读,两全其美。
506
+
507
+ ---
508
+
509
+ ### ADR-003:PLANNED Skill 用 `.draft.md` 后缀
510
+
511
+ **背景**:PLANNED Skill 需要在仓库中占位(体现架构意图),但不能被 AI 调度。
512
+
513
+ **决策**:用 `SKILL.draft.md` 后缀代替 `SKILL.md`,`_registry.md` 只注册 `SKILL.md` 文件。
514
+
515
+ **效果**:AI 按触发词只会加载 `SKILL.md`,`SKILL.draft.md` 不参与调度,但对维护者可见且路径明确。
516
+
517
+ ---
518
+
519
+ ### ADR-004:模板提取用"开发者指路 + AI 分析"混合模式
520
+
521
+ **背景**:如何让团队成员以极低门槛贡献领域模板?
522
+
523
+ **方案对比**:
524
+
525
+ | 方案 | 门槛 | 质量 | 结论 |
526
+ | -------------- | ---- | ----------------------------- | ------------- |
527
+ | 全自动扫描 | 极低 | 低(AI 不知道"哪个值得提取") | ❌ |
528
+ | 纯手写模板 | 高 | 高 | ❌ 团队不会用 |
529
+ | 指路 + AI 分析 | 低 | 高 | ✅ |
530
+
531
+ **决策**:开发者只需提供目录路径,AI 读代码 → 分析 → 生成模板,90% 工作量由 AI 完成。
532
+
533
+ ---
534
+
535
+ ### ADR-005:多 AI 编辑器适配解耦(editors.json 注册表)
536
+
537
+ **背景**:v2.0 的 `getEditorConfigs()` 把 9 个编辑器硬编码在 `bin/wl-skills.js` 里,frontmatter 也只有 Cursor 做了特化,其他编辑器全部用相同格式。
538
+
539
+ **问题**:
540
+
541
+ 1. 添加新编辑器 → 改 JS 代码
542
+ 2. 移除某编辑器 → 改 JS 代码 + 需要小心不影响其他
543
+ 3. Kiro / Trae 没有专属 frontmatter → 不满足编辑器官方最佳实践
544
+
545
+ **决策**:
546
+
547
+ - 提取 `_compat/editors.json` 作为编辑器注册表(数据 vs 代码分离)
548
+ - 提取 `_compat/headers/` 作为各编辑器 frontmatter 模板文件
549
+ - `bin/wl-skills.js` 只有读取逻辑,不再硬编码任何编辑器信息
550
+
551
+ **效果**:
552
+
553
+ - 添加新编辑器:加 `headers/xxx.txt` + 在 `editors.json` 注册,JS 不改
554
+ - 禁用某编辑器:`enabled: false` 一行,其他编辑器完全不受影响(已端到端验证)
555
+ - 每个编辑器 frontmatter 独立维护,Kiro 有 `inclusion: always`,Trae 有 `description + alwaysApply`