@agile-team/wl-skills-kit 1.2.0 → 2.1.0

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 (86) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +169 -366
  3. package/bin/wl-skills.js +149 -43
  4. package/files/.github/copilot-instructions.md +105 -42
  5. package/files/.github/guides/README.md +13 -0
  6. package/files/.github/guides/architecture.md +555 -0
  7. package/files/.github/guides/usage.md +166 -0
  8. package/files/.github/reports/README.md +65 -0
  9. package/files/.github/reports/SYS_DICT_INFO.md +19 -0
  10. package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -0
  11. package/files/.github/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +33 -0
  12. package/files/.github/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md +44 -0
  13. package/files/.github/skills/_compat/README.md +108 -0
  14. package/files/.github/skills/_compat/editors.json +61 -0
  15. package/files/.github/skills/_compat/headers/agents.txt +8 -0
  16. package/files/.github/skills/_compat/headers/claude-code.txt +7 -0
  17. package/files/.github/skills/_compat/headers/cline.txt +7 -0
  18. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -0
  19. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -0
  20. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -0
  21. package/files/.github/skills/_compat/headers/kiro.txt +10 -0
  22. package/files/.github/skills/_compat/headers/trae.txt +11 -0
  23. package/files/.github/skills/_compat/headers/windsurf.txt +7 -0
  24. package/files/.github/skills/_registry.md +81 -0
  25. package/files/.github/skills/{api-contract → core/api-contract}/SKILL.md +126 -29
  26. package/files/.github/skills/core/api-contract/USAGE.md +110 -0
  27. package/files/.github/skills/core/convention-audit/SKILL.md +189 -0
  28. package/files/.github/skills/core/convention-audit/USAGE.md +99 -0
  29. package/files/.github/skills/{page-codegen → core/page-codegen}/SKILL.md +67 -22
  30. package/files/.github/skills/core/page-codegen/USAGE.md +102 -0
  31. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -0
  32. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -0
  33. package/files/.github/skills/{page-codegen → core/page-codegen/templates/domains/produce}/TPL-OPERATION-STATION.md +442 -442
  34. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -0
  35. package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-DETAIL-TABS.md +94 -39
  36. package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-DRIVEN.md +124 -124
  37. package/files/.github/skills/{prototype-scan → core/prototype-scan}/SKILL.md +87 -3
  38. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -0
  39. package/files/.github/skills/core/template-extract/SKILL.md +139 -0
  40. package/files/.github/skills/core/template-extract/USAGE.md +93 -0
  41. package/files/.github/skills/domain/README.md +51 -0
  42. package/files/.github/skills/ops/code-fix/SKILL.draft.md +108 -0
  43. package/files/.github/skills/sync/dict-sync/SKILL.draft.md +100 -0
  44. package/files/.github/skills/{menu-sync → sync/menu-sync}/SKILL.md +258 -258
  45. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -0
  46. package/files/.github/skills/{menu-sync → sync/menu-sync}/env/guide.md +83 -83
  47. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -0
  48. package/files/.github/standards/01-toolchain.md +57 -0
  49. package/files/.github/standards/02-code-structure.md +111 -0
  50. package/files/.github/standards/03-comments.md +53 -0
  51. package/files/.github/standards/04-coding-basics.md +33 -0
  52. package/files/.github/standards/05-logging.md +38 -0
  53. package/files/.github/standards/06-security.md +44 -0
  54. package/files/.github/standards/07-config.md +52 -0
  55. package/files/.github/standards/08-git.md +60 -0
  56. package/files/.github/standards/09-typescript.md +71 -0
  57. package/files/.github/standards/10-pinia.md +57 -0
  58. package/files/.github/standards/11-form-validation.md +81 -0
  59. package/files/.github/standards/12-base-table.md +116 -0
  60. package/files/.github/standards/13-platform-components.md +123 -0
  61. package/files/.github/standards/index.md +89 -0
  62. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  63. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  64. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  65. package/files/docs/jh-date-range.md +257 -257
  66. package/files/docs/jh-date.md +222 -222
  67. package/files/docs/jh-dept-picker.md +190 -190
  68. package/files/docs/jh-drag-row.md +590 -590
  69. package/files/docs/jh-file-upload.md +216 -216
  70. package/files/docs/jh-picker.md +218 -218
  71. package/files/docs/jh-select.md +148 -148
  72. package/files/docs/jh-text.md +248 -248
  73. package/files/docs/jh-user-picker.md +197 -197
  74. package/package.json +4 -1
  75. package/files/.github/docs/menu-sync-design.md +0 -264
  76. package/files/.github/docs/use-skill.md +0 -382
  77. package/files/.github/docs/wl-skills-kit.md +0 -266
  78. package/files/.github/skills/convention-extract/SKILL.md +0 -236
  79. /package/files/.github/{docs → reports}/SYS_MENU_INFO.md +0 -0
  80. /package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-CHANGE-HISTORY.md +0 -0
  81. /package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-FORM-ROUTE.md +0 -0
  82. /package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-LIST.md +0 -0
  83. /package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-MASTER-DETAIL.md +0 -0
  84. /package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-RECORD-FORM.md +0 -0
  85. /package/files/.github/skills/{page-codegen → core/page-codegen/templates/universal}/TPL-TREE-LIST.md +0 -0
  86. /package/files/.github/skills/{menu-sync → sync/menu-sync}/env/env.local.json +0 -0
@@ -0,0 +1,81 @@
1
+ # Skills 注册表(单一数据源)
2
+
3
+ > 触发词 → SKILL 路径的唯一映射。所有 AI 编辑器/模型从此处查路由,**禁止在其他文件重复定义触发词**。
4
+
5
+ ---
6
+
7
+ ## 目录分级(v2.0+)
8
+
9
+ ```
10
+ skills/
11
+ ├── _registry.md ← 本文件
12
+ ├── _compat/ 多 AI 编辑器适配(配置 + 注入逻辑)
13
+
14
+ ├── core/ 核心通用 Skill(任何前端业务项目通用)
15
+ │ ├── prototype-scan/
16
+ │ ├── api-contract/
17
+ │ ├── page-codegen/
18
+ │ ├── convention-audit/
19
+ │ └── template-extract/
20
+
21
+ ├── sync/ 数据同步类(与后端联动)
22
+ │ ├── menu-sync/
23
+ │ ├── dict-sync/ [PLANNED]
24
+ │ └── permission-sync/ [PLANNED]
25
+
26
+ ├── ops/ 运维/构建类
27
+ │ └── code-fix/ [PLANNED]
28
+
29
+ └── domain/ 领域专属 Skill(按域扩展,初始为空)
30
+ ```
31
+
32
+ > **扩展策略**:
33
+ >
34
+ > - Skill 数 ≤ 15 个:留在本仓库分子目录管理
35
+ > - Skill 数 > 15 或出现领域强相关 Skill 集群:拆为独立 npm 包(如 `@agile-team/wl-skills-produce`),主包仅保留 core/sync/ops
36
+
37
+ ---
38
+
39
+ ## 启用 Skill 路由表
40
+
41
+ | Skill 名 | 状态 | 路径 | 触发关键词 |
42
+ | ---------------- | ---------- | -------------------------------------------- | -------------------------------------------------------------------------- |
43
+ | prototype-scan | ✅ 启用 | `skills/core/prototype-scan/SKILL.md` | 扫描原型 / 解析原型 / 页面清单 / 详设文档 / 口述需求 / 建个页面 / 写个页面 |
44
+ | api-contract | ✅ 启用 | `skills/core/api-contract/SKILL.md` | 接口约定 / api.md / 字段定义 / 前后端对齐 / 接口设计 |
45
+ | page-codegen | ✅ 启用 | `skills/core/page-codegen/SKILL.md` | 生成页面 / 创建页面 / 代码生成 / vue页面 / 按原型生成 / 帮我生成 |
46
+ | convention-audit | ✅ 启用 | `skills/core/convention-audit/SKILL.md` | 规范审计 / 代码审计 / 规范检查 / 对齐规范 / 规范偏差 |
47
+ | template-extract | ✅ 启用 | `skills/core/template-extract/SKILL.md` | 提取模板 / 抽取模板 / 沉淀模板 / 模板贡献 |
48
+ | menu-sync | ✅ 启用 | `skills/sync/menu-sync/SKILL.md` | 创建菜单 / 注册菜单 / 同步菜单 / 补菜单 |
49
+ | dict-sync | ⏳ PLANNED | `skills/sync/dict-sync/SKILL.draft.md` | (草稿,不参与调度) |
50
+ | permission-sync | ⏳ PLANNED | `skills/sync/permission-sync/SKILL.draft.md` | (草稿,不参与调度) |
51
+ | code-fix | ⏳ PLANNED | `skills/ops/code-fix/SKILL.draft.md` | (草稿,不参与调度) |
52
+
53
+ ---
54
+
55
+ ## 调度规则
56
+
57
+ 1. AI 收到用户消息 → 匹配上表 `触发关键词` → `read_file` 加载 `路径` 列对应的 SKILL.md
58
+ 2. SKILL.md 中标注的 `必读 standards` 按 `standards/index.md` 任务类型映射加载
59
+ 3. 在 SKILL.md 指示下输出 **Pre-flight 声明**(强制约定式输出)
60
+
61
+ ---
62
+
63
+ ## 多触发词时的优先级
64
+
65
+ 当用户消息同时匹配多个 Skill 时(如"扫描原型并生成页面"):
66
+
67
+ 1. 优先识别**完整流水线意图**:触发 `prototype-scan` → 串接 `api-contract` → 串接 `page-codegen` → 串接 `menu-sync`
68
+ 2. 否则按**最具体的触发词**匹配单个 Skill
69
+ 3. 用户明确指定时(如"只扫描,不生成"),按用户指示
70
+
71
+ ---
72
+
73
+ ## 配套人读文档
74
+
75
+ 每个启用 Skill 同目录下都有 `USAGE.md`:
76
+
77
+ | 文件 | 读者 | 用途 |
78
+ | --------------- | -------------- | ------------------------------------------ |
79
+ | `SKILL.md` | AI 编辑器/模型 | 触发规则、流程步骤、Pre-flight 声明 |
80
+ | `USAGE.md` | 团队成员 | 示例对话、踩坑、FAQ、快速上手 |
81
+ | `*.MAINTAIN.md` | kit 维护者 | 维护要点(在 `kit-internal/skills/` 目录) |
@@ -46,35 +46,130 @@ description: "Use when: designing API contracts between frontend and backend bas
46
46
 
47
47
  非标准 CRUD 操作按以下约定命名,URL 后缀使用**动词原形**(camelCase):
48
48
 
49
- | 操作 | 方法 | URL 后缀 | 请求说明 |
50
- | ---------- | ---- | ----------------- | --------------------------------------- |
51
- | 提交审批 | POST | `/submit` | `{ id }` 或 `{ ids: [] }` |
52
- | 审批通过 | POST | `/approve` | `{ id, opinion? }` |
53
- | 审批驳回 | POST | `/reject` | `{ id, opinion }` |
54
- | 撤回 | POST | `/withdraw` | `{ id }` 撤回已提交的单据 |
55
- | 启用/禁用 | POST | `/changeStatus` | `{ id, status }` |
56
- | 转化 | POST | `/convert` | `{ id }` 临时→正式(如临时客户→正式) |
57
- | 下发 | POST | `/release` | `{ id }` 计划/工单下发执行 |
58
- | 关闭 | POST | `/close` | `{ id }` 关闭订单/计划 |
59
- | 作废 | POST | `/cancel` | `{ id }` 作废单据 |
60
- | 批量操作 | POST | `/batchXxx` | 如 `/batchSubmit`、`/batchRemove` |
61
- | 子表查询 | POST | `/queryXxxList` | 如 `/queryDetailList`,主从表场景 |
49
+ | 操作 | 方法 | URL 后缀 | 请求说明 |
50
+ | --------- | ---- | --------------- | ------------------------------------- |
51
+ | 提交审批 | POST | `/submit` | `{ id }` 或 `{ ids: [] }` |
52
+ | 审批通过 | POST | `/approve` | `{ id, opinion? }` |
53
+ | 审批驳回 | POST | `/reject` | `{ id, opinion }` |
54
+ | 撤回 | POST | `/withdraw` | `{ id }` 撤回已提交的单据 |
55
+ | 启用/禁用 | POST | `/changeStatus` | `{ id, status }` |
56
+ | 转化 | POST | `/convert` | `{ id }` 临时→正式(如临时客户→正式) |
57
+ | 下发 | POST | `/release` | `{ id }` 计划/工单下发执行 |
58
+ | 关闭 | POST | `/close` | `{ id }` 关闭订单/计划 |
59
+ | 作废 | POST | `/cancel` | `{ id }` 作废单据 |
60
+ | 批量操作 | POST | `/batchXxx` | 如 `/batchSubmit`、`/batchRemove` |
61
+ | 子表查询 | POST | `/queryXxxList` | 如 `/queryDetailList`,主从表场景 |
62
62
 
63
63
  > **命名原则**:`/[服务缩写]/[资源名]/[动作]`,动作用英文动词原形,不用中文拼音,不加 `do` / `handle` 前缀。
64
64
 
65
- ### 统一响应结构
65
+ ### 统一响应结构(基于真实后端契约)
66
+
67
+ > ⚠️ **重要**:本项目后端响应外壳为 `{ code, message, data }`(**非 `result`**),成功码为 **`2000`**(**非 200**)。
68
+
69
+ #### 1. 分页查询响应
70
+
71
+ ```json
72
+ {
73
+ "code": 2000,
74
+ "message": "操作成功",
75
+ "data": {
76
+ "records": [
77
+ {
78
+ /* Entity 字段 */
79
+ }
80
+ ],
81
+ "total": 100,
82
+ "current": 1,
83
+ "size": 20,
84
+ "pages": 5,
85
+ "countId": null,
86
+ "maxLimit": null,
87
+ "orders": [],
88
+ "searchCount": true
89
+ }
90
+ }
91
+ ```
92
+
93
+ | data 字段 | 类型 | 说明 |
94
+ | ------------- | ------- | ---------------------------------------- |
95
+ | `records` | array | 当前页数据列表 |
96
+ | `total` | number | 总记录数 |
97
+ | `current` | number | 当前页码 |
98
+ | `size` | number | 每页条数 |
99
+ | `pages` | number | 总页数 |
100
+ | `countId` | any | MyBatis-Plus 分页计数 ID(前端忽略) |
101
+ | `maxLimit` | any | 最大单页限制(前端忽略) |
102
+ | `orders` | array | 排序条件回传(前端忽略,除非需回显排序) |
103
+ | `searchCount` | boolean | 是否执行总数查询(前端忽略) |
104
+
105
+ > 前端 `BaseTable` / `AbstractPageQueryHook` 已自动适配:取 `data.records` 渲染、`data.total` 设分页、其他字段透传或忽略。无需在 data.ts 中处理。
106
+
107
+ #### 2. 单条 / 非分页查询响应
108
+
109
+ ```json
110
+ {
111
+ "code": 2000,
112
+ "message": "操作成功",
113
+ "data": {
114
+ /* Entity 单对象 */
115
+ }
116
+ }
117
+ ```
118
+
119
+ 或返回数组(无需分页时):
120
+
121
+ ```json
122
+ {
123
+ "code": 2000,
124
+ "message": "操作成功",
125
+ "data": [
126
+ {
127
+ /* Entity */
128
+ }
129
+ ]
130
+ }
131
+ ```
132
+
133
+ #### 3. 字典查询响应
134
+
135
+ ```json
136
+ {
137
+ "code": 2000,
138
+ "message": "操作成功",
139
+ "data": [
140
+ { "value": "01", "label": "已审批", "extra": null },
141
+ { "value": "02", "label": "驳回", "extra": null }
142
+ ]
143
+ }
144
+ ```
145
+
146
+ #### 4. 增删改响应
147
+
148
+ ```json
149
+ { "code": 2000, "message": "操作成功", "data": true }
150
+ ```
151
+
152
+ 或返回主键:
66
153
 
67
154
  ```json
68
- // 分页查询
69
- { "code": 200, "message": "操作成功", "result": { "records": [], "total": 100, "current": 1, "size": 20 } }
155
+ { "code": 2000, "message": "操作成功", "data": "1234567890123456789" }
156
+ ```
70
157
 
71
- // 单条查询
72
- { "code": 200, "result": { /* Entity */ } }
158
+ #### 5. 失败响应
73
159
 
74
- // 增删改
75
- { "code": 200, "message": "操作成功", "result": true }
160
+ ```json
161
+ { "code": 4001, "message": "参数缺失:customerName 不能为空", "data": null }
76
162
  ```
77
163
 
164
+ | code 范围 | 含义 |
165
+ | ------------- | --------------------------------- |
166
+ | `2000` | 成功 |
167
+ | `4xxx` | 客户端错误(参数/权限/校验) |
168
+ | `5xxx` | 服务端错误 |
169
+ | `401` / `403` | 网关层未登录 / 无权限(统一拦截) |
170
+
171
+ > 业务代码**不需要**关心 `code` 判断,`request.ts` 拦截器统一处理:非 2000 自动 `Promise.reject` + Toast 提示。业务代码 `.then()` 拿到的就是 `data` 字段内容。
172
+
78
173
  ### 字段命名
79
174
 
80
175
  | 端 | 规范 | 说明 |
@@ -111,7 +206,7 @@ export const API_CONFIG = {
111
206
  update: "/pm/omptMillPlanOrder/update",
112
207
  export: "/pm/omptMillPlanOrder/export",
113
208
  // 按需增加业务操作
114
- release: "/pm/omptMillPlanOrder/release"
209
+ release: "/pm/omptMillPlanOrder/release",
115
210
  } as const;
116
211
  ```
117
212
 
@@ -140,7 +235,7 @@ export const API_CONFIG = {
140
235
  getById: "/[服务缩写]/[资源名]/getById",
141
236
  save: "/[服务缩写]/[资源名]/save",
142
237
  update: "/[服务缩写]/[资源名]/update",
143
- export: "/[服务缩写]/[资源名]/export"
238
+ export: "/[服务缩写]/[资源名]/export",
144
239
  } as const;
145
240
  ```
146
241
 
@@ -179,7 +274,7 @@ POST /[服务缩写]/[资源名]/list
179
274
  | [startDate] | string | ❌ | 开始日期 YYYY-MM-DD |
180
275
  | [endDate] | string | ❌ | 结束日期 YYYY-MM-DD |
181
276
 
182
- **响应 records:** 同实体定义
277
+ **响应 data.records:** 同实体定义;外壳 `{ code: 2000, message, data: { records, total, current, size, pages, countId, maxLimit, orders, searchCount } }`
183
278
 
184
279
  ### 2. 详情查询
185
280
 
@@ -187,7 +282,7 @@ POST /[服务缩写]/[资源名]/list
187
282
  GET /[服务缩写]/[资源名]/getById?id=xxx
188
283
  ```
189
284
 
190
- **响应 result:** 单个 Entity
285
+ **响应 data:** 单个 Entity;外壳 `{ code: 2000, message, data: {...} }`
191
286
 
192
287
  ### 3. 新增
193
288
 
@@ -231,11 +326,13 @@ GET /[服务缩写]/[资源名]/export?[查询参数]
231
326
 
232
327
  ## 联调注意
233
328
 
234
- 1. 前端字段全部 camelCase,后端 JSON 序列化输出 camelCase
235
- 2. 时间字段统一 `YYYY-MM-DD HH:mm:ss`
236
- 3. 大数字 ID 后端转字符串
237
- 4. 分页参数是 `current` / `size`(基类自动处理)
238
- 5. 枚举字段前端传 value,后端可返回 `[field]Label` 辅助展示
329
+ 1. **响应外壳**:`{ code, message, data }`,成功 `code: 2000`(非 200,非 result)
330
+ 2. 前端字段全部 camelCase,后端 JSON 序列化输出 camelCase
331
+ 3. 时间字段统一 `YYYY-MM-DD HH:mm:ss`
332
+ 4. 大数字 ID 后端转字符串(雪花 ID 超过 JS Number 精度)
333
+ 5. 分页参数前端传 `current` / `size`(基类自动处理),后端响应 `data.records` / `data.total`
334
+ 6. 枚举字段前端传 value,后端可返回 `[field]Label` 辅助展示,或前端自行通过 `logicValue` 字典翻译
335
+ 7. 业务代码 `.then(res => res)` 拿到的就是 `data` 字段(拦截器已剥外壳)
239
336
  ````
240
337
 
241
338
  ---
@@ -0,0 +1,110 @@
1
+ # 使用指南:api-contract(接口约定)
2
+
3
+ > **谁读这个文档**:团队成员(前端/后端/产品)
4
+ > **AI 触发文件**:同目录 `SKILL.md`
5
+
6
+ ---
7
+
8
+ ## 这个 Skill 解决什么问题
9
+
10
+ 为每个页面生成一份 `api.md`,**作为前后端联调的契约**:
11
+
12
+ - 前端:`data.ts` 里的 `API_CONFIG` URL、查询字段直接来源于此
13
+ - 后端:拿 api.md 即可写 Controller + Service + Entity,字段名一致零联调成本
14
+
15
+ ---
16
+
17
+ ## 何时使用
18
+
19
+ - 拿到《页面清单》(来自 `prototype-scan`),准备让后端开发接口
20
+ - 已有页面但接口未定义,需要补齐契约
21
+ - 接口字段需要变更,更新 api.md 让前后端同步
22
+
23
+ ---
24
+
25
+ ## 触发关键词
26
+
27
+ `接口约定` / `api.md` / `字段定义` / `前后端对齐` / `接口设计`
28
+
29
+ ---
30
+
31
+ ## 真实响应契约(务必背下来)
32
+
33
+ ```json
34
+ // 分页
35
+ { "code": 2000, "message": "操作成功", "data": { "records": [...], "total": 100, "current": 1, "size": 20, "pages": 5, "countId": null, "maxLimit": null, "orders": [], "searchCount": true } }
36
+
37
+ // 单条 / 数组
38
+ { "code": 2000, "message": "...", "data": { /* 或 [] */ } }
39
+
40
+ // 失败
41
+ { "code": 4001, "message": "...", "data": null }
42
+ ```
43
+
44
+ - **code 成功值是 `2000`**(不是 200!)
45
+ - **包裹字段是 `data`**(不是 `result`!)
46
+ - 业务代码 `.then(res => res)` 拿到的已是 `data` 内容(拦截器剥壳)
47
+
48
+ ---
49
+
50
+ ## 标准对话示例
51
+
52
+ ```
53
+ 你:基于 reports/PROTOTYPE_SCAN_客户管理_20260426.md 生成各页面的 api.md
54
+ AI:[Pre-flight]
55
+ 将生成 7 个 api.md 文件,输出位置:
56
+ src/views/produce/aiflow/mmwr-customer-archive/api.md
57
+ src/views/produce/aiflow/mmwr-customer-detail/api.md
58
+ ...
59
+ 服务缩写:mmwr,资源名:mmwrCustomer*
60
+ 需向你确认 3 项:
61
+ 1. 主键字段是 customerCode 还是 customerNo?
62
+ 2. 状态字典 logicValue 是 customer_state 还是 mmwr_customer_state?
63
+ 3. 临时客户转正式客户是 /convert 还是单独接口?
64
+ ```
65
+
66
+ ---
67
+
68
+ ## 输出物
69
+
70
+ 每个页面目录下生成 `api.md`,结构:
71
+
72
+ 1. **API_CONFIG**(粘贴到 data.ts 用)
73
+ 2. **实体定义**(字段名、类型、字典、必填)
74
+ 3. **接口清单**(list/getById/save/update/remove/export + 业务操作如 release/approve)
75
+ 4. **数据字典**(dictCode 列表)
76
+ 5. **联调注意**
77
+
78
+ ---
79
+
80
+ ## 团队协作流程
81
+
82
+ 1. 前端基于 prototype-scan 输出生成 api.md(标 🟡 待确认)
83
+ 2. **发后端 review**(钉钉/IM 直接发文件路径)
84
+ 3. 后端确认字段,标 🟢 已确认
85
+ 4. 后端按 api.md 出接口,前端按 api.md 写 data.ts
86
+ 5. 联调时若有变更,更新 api.md 并标 🔴 有变更,双方同步修改
87
+
88
+ ---
89
+
90
+ ## 常见踩坑
91
+
92
+ | 现象 | 原因 | 解法 |
93
+ | ------------------------------------------------- | ------------------------------ | --------------------------------------------- |
94
+ | 字段名不一致(前端 customerNo 后端 customerCode) | 没走 api.md 直接编码 | 强制约定:**先 api.md 再 data.ts** |
95
+ | 拦截器报"code 不是 2000" | mock 数据用了 200 | 改 mock 为 2000 |
96
+ | 业务代码报 `data.records is undefined` | 后端忘记包装外壳,返回了纯数组 | 后端按契约包 `{ code, message, data: {...} }` |
97
+ | 雪花 ID 精度丢失 | 后端返回 number | 后端 ID 字段统一 String 序列化 |
98
+
99
+ ---
100
+
101
+ ## FAQ
102
+
103
+ **Q:api.md 一定要放在页面目录下吗?**
104
+ A:是。便于 PR review 时一眼看到改了哪个页面的契约。
105
+
106
+ **Q:可以跳过 api.md 直接 codegen 吗?**
107
+ A:技术上可以,AI 会用通用模板字段,但**联调时必踩坑**。建议至少写到"实体定义"段落。
108
+
109
+ **Q:业务操作(如 release / approve)需要写吗?**
110
+ A:写。`page-codegen` 会读取 api.md 中的业务操作列表,自动在 toolbar 里加按钮。
@@ -0,0 +1,189 @@
1
+ ---
2
+ name: convention-audit
3
+ description: "Use when: auditing project source code against the 13 modular standards in .github/standards/. Outputs deviation report and component-extraction suggestions to reports/. Triggers on: 规范审计, 规范检查, 代码审计, 对齐规范, 规范偏差, audit code, check conventions."
4
+ ---
5
+
6
+ # Skill: 规范审计(convention-audit)
7
+
8
+ 以 `.github/standards/` 13 条规范为唯一基线,扫描项目源码,输出**偏差报告**和**组件提取建议**到 `reports/` 目录。
9
+
10
+ > **核心理念**:规范是"标准",代码必须对齐标准。本 Skill 只负责发现偏差并给出整改建议,**不自动修复**(修复由 [PLANNED] code-fix Skill 完成)。
11
+
12
+ ---
13
+
14
+ ## 触发词
15
+
16
+ `规范审计` / `规范检查` / `代码审计` / `对齐规范` / `规范偏差` / `audit code`
17
+
18
+ ---
19
+
20
+ ## Pre-flight 声明(执行前必须输出)
21
+
22
+ ```
23
+ 🚀 已触发技能 convention-audit/SKILL.md → 规范审计:扫描源码 + 偏差报告 + 提取建议
24
+ ✅ 已读取 standards/index.md → 规范门控
25
+ ✅ 已读取 standards/01 ~ 13 → 完整 13 条规范基线(审计场景需全量加载)
26
+ ✅ 已读取 reports/规范审查报告.md → 现有报告(用于追加,不覆盖)
27
+ ✅ 审计范围:{用户指定的目录或单文件}
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 适用场景
33
+
34
+ | 场景 | 说明 |
35
+ | --------------------------- | ---------------------------------------- |
36
+ | 新项目导入 wl-skills-kit 后 | 扫描旧代码,输出整改清单,逐步迁移 |
37
+ | 日常 Code Review 辅助 | 比对单文件或目录,快速发现偏差 |
38
+ | 项目迁移/升级 | 老项目引入新架构,批量评估改造量 |
39
+ | 团队培训 | 新成员提交代码前,用审计验证是否符合规范 |
40
+ | page-codegen 后置自检 | 页面生成完成后自动跑一次审计,确认合规 |
41
+ | CI/CD(PLANNED) | PR 上自动跑审计,不合规 PR 阻断合并 |
42
+
43
+ ---
44
+
45
+ ## 审计范围(13 条规范全覆盖)
46
+
47
+ | 编号 | 审计维度 | 严重度判定 |
48
+ | ---- | ---------------------------- | -------------------------------------------------------------------- |
49
+ | 01 | 工具链就绪 | 缺少 `.prettierrc.js` / `eslint.config.ts` / `.husky/` → 🔴 严重 |
50
+ | 02 | 4 文件原则、三段式、9 段顺序 | 缺 data.ts / index.vue 含业务逻辑 → 🔴;段落顺序乱 → 🟡 |
51
+ | 03 | 注释规范 | 文件头缺失 → 🟡;显而易见的注释 → 🟢 提示 |
52
+ | 04 | 基础编码(13 条) | 用 var / for...in / 字符串拼接 → 🟡 |
53
+ | 05 | console 残留 | src/ 下任何 console.log / warn / error → 🟡 |
54
+ | 06 | 安全规范 | v-html 无注释 / import axios / eval → 🔴 |
55
+ | 07 | 配置管理 | 硬编码 `http://` / `https://` IP → 🔴;非 VITE\_ 环境变量 → 🟡 |
56
+ | 08 | Git 规范 | (审计时不检测,由 husky 自动拦截) |
57
+ | 09 | TypeScript | 滥用 any(>3 处/页) → 🟡 |
58
+ | 10 | Pinia | data.ts 内 import Store → 🔴 |
59
+ | 11 | 表单校验 | FORM_ROUTE 缺 validate / resetFields → 🔴 |
60
+ | 12 | BaseTable + cid | 用 el-table / 缺 render-type / cid 缺失或重复 → 🔴 |
61
+ | 13 | 平台组件合规 | 用 el-form/el-table/el-date-picker 替代封装 → 🔴;3+ 复用 → 提取建议 |
62
+
63
+ ---
64
+
65
+ ## 执行流程
66
+
67
+ ### 步骤 1:确定审计范围
68
+
69
+ | 用户输入 | 范围 |
70
+ | --------------------------------- | ------------- |
71
+ | "审计整个项目" | `src/views/` |
72
+ | "审计 produce/mmwr" | 该子目录 |
73
+ | "审计 mmwr-customer-archive 页面" | 单页面 4 文件 |
74
+
75
+ ### 步骤 2:加载规范基线
76
+
77
+ 读取 `standards/01 ~ 13` 全部规范文件(审计场景必须全量加载)。
78
+
79
+ ### 步骤 3:扫描源码
80
+
81
+ 逐个文件检查 13 个维度。同时记录:
82
+
83
+ - **跨页面相同 el-\* 模式**(统计出现次数和位置)
84
+ - **每个偏差所在文件的菜单位置**(从 koroFileHeader 文件头注释解析)
85
+
86
+ ### 步骤 4:追加写入两份报告
87
+
88
+ #### 报告 A:`reports/规范审查报告.md`(追加,最新章节在顶)
89
+
90
+ ```markdown
91
+ ## 🕐 {YYYY-MM-DD HH:mm} | 范围:{范围} | 触发:{user / page-codegen / CI}
92
+
93
+ ### 概要
94
+
95
+ | 指标 | 值 |
96
+ | -------- | --- |
97
+ | 扫描页面 | 12 |
98
+ | 合规页面 | 8 |
99
+ | 偏差页面 | 4 |
100
+ | 🔴 严重 | 5 |
101
+ | 🟡 轻微 | 7 |
102
+
103
+ ### 🔴 严重偏差(必须整改)
104
+
105
+ #### {页面路径} — 违反规范 13(平台组件合规)
106
+
107
+ - **菜单位置**(来自文件头):销售管理 > 国内贸易订单
108
+ - **现状**:使用 `<el-table>` 渲染数据
109
+ - **应为**:使用 `<BaseTable render-type="agGrid" cid="...">`
110
+ - **整改建议**:参考 templates/universal/TPL-LIST.md
111
+ - **修复标记**:🔧 待修复
112
+
113
+ (按规范条目分组列出全部偏差)
114
+
115
+ ### 🟡 轻微偏差(建议整改)
116
+
117
+ (同格式)
118
+
119
+ ### ✅ 合规页面
120
+
121
+ - src/views/produce/.../mmwr-customer-archive/
122
+ - ...
123
+
124
+ ---
125
+
126
+ (历史章节自然下沉)
127
+ ```
128
+
129
+ #### 报告 B:`reports/组件提取建议.md`(追加)
130
+
131
+ ```markdown
132
+ ## 🕐 {YYYY-MM-DD HH:mm} | 范围:{范围}
133
+
134
+ ### 📦 组件提取建议(共 N 处)
135
+
136
+ | 建议组件名 | 出现次数 | 页面路径 | 菜单位置 | 模式描述 |
137
+ | ------------- | -------- | ---------------------------------------- | --------------------- | ---------------- |
138
+ | c_statusBadge | 5 处 | src/views/sale/.../{a,b,c,d,e}/index.vue | 销售管理 > 多个子菜单 | 状态枚举彩色标签 |
139
+ | c_priceFormat | 4 处 | src/views/.../... | ... | 千分位金额显示 |
140
+
141
+ > ⚠️ 以上为建议,不自动提取。
142
+ > 人工确认后,触发 `template-extract` Skill(页面级模板)或手动封装为 `c_*` 组件。
143
+ ```
144
+
145
+ ### 步骤 5:输出摘要
146
+
147
+ ```
148
+ 📦 审计完成
149
+ ─────────────────────────────────────────────────────
150
+ ✅ reports/规范审查报告.md → 已追加章节({N} 个偏差)
151
+ ✅ reports/组件提取建议.md → 已追加 {M} 条提取建议
152
+ ─────────────────────────────────────────────────────
153
+ 📌 后续步骤:
154
+ 1. 人工 review 报告,标记需要修复的条目
155
+ 2. 严重偏差优先修复(用 page-codegen 重新生成)
156
+ 3. [PLANNED] 触发 code-fix 自动整改 🟢/🟡 等级偏差
157
+ 4. 提取建议人工评审 → template-extract 或手动封装
158
+ ─────────────────────────────────────────────────────
159
+ ```
160
+
161
+ ---
162
+
163
+ ## 偏差严重度定义
164
+
165
+ | 级别 | 标记 | 定义 | 示例 |
166
+ | ---- | ---- | ------------------------------------------ | ----------------------------------------------------- |
167
+ | 🔴 | 严重 | 架构性违反,影响可维护性 / 安全 / 团队协作 | 不用 AbstractPageQueryHook、用 el-table、import axios |
168
+ | 🟡 | 轻微 | 风格 / 命名不统一,不影响功能 | for...in、目录名 camelCase、缺 api.md |
169
+ | 🟢 | 提示 | 优化建议,可逐步改进 | 重复表达式可抽 computed、超长函数可拆分 |
170
+
171
+ ---
172
+
173
+ ## 与其他 Skill 的关系
174
+
175
+ | Skill | 关系 |
176
+ | ---------------------- | ------------------------------------------------------- |
177
+ | **page-codegen** | 审计发现偏差后,可调用 page-codegen 重新生成合规代码 |
178
+ | **template-extract** | 审计输出的"组件提取建议",确认后可触发 template-extract |
179
+ | **code-fix** [PLANNED] | 审计报告作为修复输入,自动整改 🟢🟡 等级偏差 |
180
+ | **CI/CD** | 审计可作为 PR 检查项,不合规 PR 阻断合并 |
181
+
182
+ ---
183
+
184
+ ## 注意事项
185
+
186
+ 1. **规范基线唯一**:以 `standards/index.md` 加载的 13 条文件为准,**不接受**"旧代码一直这么写"的辩解
187
+ 2. **追加不覆盖**:每次审计追加新章节到报告,**不删除历史**,便于追溯整改进度
188
+ 3. **菜单位置解析**:依赖 koroFileHeader 文件头注释,缺失文件头时标记 `菜单位置:未知`
189
+ 4. **AI 自我审计**:page-codegen 生成代码后,建议立即跑一次单页审计验证合规