@agile-team/wl-skills-kit 2.7.1 → 2.7.3

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.
@@ -1,451 +1,208 @@
1
- ---
2
- name: dict-sync
3
- description: "Use when: syncing data dictionary entries to the backend, pulling the current online dictionary baseline, or checking which dictionaries used in data.ts are missing from the system. Triggers on: 同步字典, 创建字典, 刷新字典基线, 字典对比, 字典审计, dict sync, create dict."
4
- ---
5
-
6
- # Skill: 字典同步(dict-sync)
7
-
8
- 将 `data.ts` 中引用的数据字典(`logicType: BusLogicDataType.dict, logicValue: "DICT_CODE"`)同步到后端字典表,保持本地基线与线上一致。
9
-
10
- > **与 menu-sync 的关系**:机制完全对称——同样读取本地基线报告 → 与线上对比 → 补齐差异。
11
- > 配置直接复用 `skills/sync/env.local.json` 统一配置文件,无需重复填写。
12
-
13
- ---
14
-
15
- ## 配置(统一配置文件,无需重复填写)
16
-
17
- 读取 `.github/skills/sync/env.local.json`(已在 .gitignore,不入 git):
18
-
19
- ```json
20
- {
21
- "gatewayPath": "http://192.168.10.50:9000",
22
- "sysAppNo": "QjQuXy1kbKxZyjhS5N2",
23
- "token": "eyJhbGci...",
24
- "dict": {
25
- "moduleId": "7C909G0U2F8HI7E305LV0135LSJ3UBIO"
26
- }
27
- }
28
- ```
29
-
30
- `moduleId` 获取方式:进入低代码平台「数据字典」模块 → 新增一条字典 → DevTools Network → 查找 `moduleId` 字段值。
31
-
32
- **向下兼容**:如上述文件不存在,回落到 `skills/sync/menu-sync/env/env.local.json`(老版本路径)。
33
-
34
- ---
35
-
36
- ## Pre-flight 声明(执行前必须输出)
37
-
38
- ```
39
- 🚀 已触发技能 dict-sync/SKILL.md 字典同步
40
- 已读取 skills/sync/env.local.json → 网关地址、token、sysAppNo、dict.moduleId
41
- 已读取 reports/SYS_DICT_INFO.md → 本地字典基线
42
- 操作模式:{pull / push / audit}
43
- ✅ 目标字典码:{用户指定 / 从 data.ts 扫描到的字典码列表}
44
- ```
45
-
46
- ---
47
-
48
- ## API 调用规范
49
-
50
- 所有接口使用以下 Headers:
51
-
52
- ```
53
- Authorization: Bearer {token}
54
- Sysappno: {sysAppNo}
55
- Content-Type: application/json
56
- ```
57
-
58
- **成功判断**:`response.code === 2000`
59
- **Token 失效**:`code === 401` 或 `code` 不在 `[200, 2000]` 且 message 含 "token" → 停止执行,提示用户更新 token。
60
-
61
- ---
62
-
63
- ## 三种工作模式
64
-
65
- ### pull — 刷新本地基线
66
-
67
- **触发词**:`刷新字典基线` / `拉字典`
68
-
69
- ```
70
- 调用 GET {gatewayPath}/system/business/dict/getDictionaryTreeData
71
- 解析 data.data.dictionary.children(递归,无 children 的节点为字典叶节点)
72
- 整理为 SYS_DICT_INFO.md 格式覆盖写入
73
- 输出:共拉取 N 个字典码,M 个字典项
74
- ```
75
-
76
- **接口**:
77
- ```
78
- GET {gatewayPath}/system/business/dict/getDictionaryTreeData
79
- Headers:
80
- Authorization: Bearer {token}
81
- Sysappno: {sysAppNo}
82
- ```
83
-
84
- **响应结构**:
85
- ```json
86
- {
87
- "code": 2000,
88
- "data": {
89
- "dictionary": {
90
- "children": [
91
- {
92
- "id": "节点ID",
93
- "strSn": "字典编码或模块编码",
94
- "strName": "字典名称",
95
- "children": [...]
96
- }
97
- ]
98
- }
99
- }
100
- }
101
- ```
102
- 叶节点(无 `children`)= 实际字典,取其 `id`(用于后续创建字典项)和 `strSn`。
103
-
104
- ---
105
-
106
- ### push — 推送新增字典(核心模式)
107
-
108
- **触发词**:`同步字典` / `创建字典` / `补字典`
109
-
110
- #### Step 1:扫描 data.ts 中的字典引用
111
-
112
- 从用户指定范围扫描所有:
113
- ```typescript
114
- logicType: BusLogicDataType.dict, logicValue: "DICT_CODE"
115
- ```
116
- 收集所有 `logicValue` 值去重,得到「当前用到的字典码集合」。
117
-
118
- #### Step 2:与本地基线 + 线上对比(去重双保险)
119
-
120
- ```
121
- 读取 reports/SYS_DICT_INFO.md → 已知字典码(本地已记录,大概率线上有)
122
- 调用 getDictionaryTreeData → 当前线上实际存在的字典码(strSn 列表)
123
- 待创建 = 用到的字典码 - 线上已有字典码
124
- ```
125
-
126
- > **多人协同说明**:每人各自的 env.local.json 不入 git,各人用自己的 token。
127
- > 去重通过 Step 线上实时查询保证:A 创建了,B 运行时线上已有,自动跳过,**不会重复创建**。
128
- > 即使极端并发(两人同一秒执行),后端 `strSn` 字段有唯一约束,第二次创建会返回"已存在",Skill 将其视为成功跳过。
129
-
130
- #### Step 3:Pre-flight 输出清单,等待确认
131
-
132
- ```
133
- 📋 待同步字典清单:
134
- 新建:ORDER_STATUS(订单状态)— 含 4 项
135
- 新建:SALES_COMPANY(销售公司)— 3
136
- 跳过(线上已有):PRODUCT_SEGMENT
137
-
138
- 确认执行?(yes/no)
139
- ```
140
-
141
- #### Step 4:创建字典码
142
-
143
- ```
144
- POST {gatewayPath}/system/business/dict/save
145
- Headers: Authorization / Sysappno / Content-Type
146
-
147
- Body:
148
- {
149
- "strSn": "ORDER_STATUS",
150
- "strName": "订单状态",
151
- "intIsVisible": 1,
152
- "intSort": 0,
153
- "moduleId": "{dict.moduleId}"
154
- }
155
- ```
156
-
157
- 成功后再次调用 `getDictionaryTreeData` 获取新创建字典的 `id`(用于下一步)。
158
-
159
- #### Step 5:创建字典项
160
-
161
- **逐条**调用(服务端会跳过重复的 strKey):
162
-
163
- ```
164
- POST {gatewayPath}/system/dictDtl/save
165
- Headers: Authorization / Sysappno / Content-Type
166
-
167
- Body:
168
- {
169
- "strKey": "1",
170
- "strValue": "待审核",
171
- "strSn": "ORDER_STATUS",
172
- "dictId": "{上一步获取的字典 id}"
173
- }
174
- ```
175
-
176
- #### Step 6:输出结果表 + 更新基线
177
-
178
- | 字典码 | 字典名称 | 字典项数 | 状态 |
179
- |--------|---------|---------|------|
180
- | ORDER_STATUS | 订单状态 | 4 | ✅ created |
181
- | SALES_COMPANY | 销售公司 | 3 | ✅ created |
182
- | PRODUCT_SEGMENT | 产品板块 | - | ⏭️ skipped(线上已有) |
183
-
184
- 执行完成后,将新建字典追加写入 `reports/SYS_DICT_INFO.md`。
185
-
186
- ---
187
-
188
- ### audit — 仅检查,不调接口
189
-
190
- **触发词**:`字典审计` / `检查字典`
191
-
192
- ```
193
- 1. 扫描指定范围的 data.ts,收集所有 logicValue 字典码
194
- 2. 对比 SYS_DICT_INFO.md 本地基线
195
- 3. 输出三类:
196
- 已在基线中(无需操作)
197
- ⚠️ data.ts 中用到但不在基线中(建议执行 push)
198
- 💤 在基线中但未被任何 data.ts 使用(可能已废弃)
199
- 4. 不调用任何接口
200
- ```
201
-
202
- ---
203
-
204
- ## SYS_DICT_INFO.md — 本地基线格式
205
-
206
- 路径:`.github/reports/SYS_DICT_INFO.md`
207
-
208
- ```markdown
209
- ## ORDER_STATUS(订单状态)
210
-
211
- | 值(strKey) | 显示名称(strValue) | 备注 |
212
- | ----------- | ------------------- | ---- |
213
- | 0 | 草稿 | |
214
- | 1 | 待审核 | |
215
- | 2 | 审核通过 | |
216
- ```
217
-
218
- **字典码命名规范**:全大写 + 下划线,如 `ORDER_STATUS` / `SALES_COMPANY`(来自项目实际 data.ts 用法)。
219
-
220
- ---
221
-
222
- ## 与其他 Skill 联动
223
-
224
- | Skill | 联动方式 |
225
- |-------|---------|
226
- | **page-codegen** | 生成 data.ts 时,如 `logicValue` 不在基线中,报告末尾提示"建议运行 dict-sync 补齐" |
227
- | **convention-audit** | 可调用 audit 模式,"字典码未在基线"列为 🟡 偏差 |
228
- | **menu-sync** | 共享 `skills/sync/env.local.json`,gatewayPath / token / sysAppNo 同一份配置 |
229
-
230
-
231
- # Skill: 字典同步(dict-sync)
232
-
233
- 将 `data.ts` 中引用的数据字典(`logicType: BusLogicDataType.dict`)同步到后端字典表,保持本地基线与线上一致。
234
-
235
- > **与 menu-sync 的关系**:机制完全对称——同样读取本地基线报告 → 与线上对比 → 补齐差异。
236
- > 配置直接复用 `menu-sync/env/env.local.json`,无需重复填写。
237
-
238
- ---
239
-
240
- ## ⚠️ 激活前请确认 3 个 API 端点
241
-
242
- 在开始使用本 Skill 前,请与后端团队核实以下 3 个接口路径,并将正确路径填入本文件对应位置(搜索 `TODO_CONFIRM`):
243
-
244
- | # | 用途 | 草稿路径(待确认) | 确认方式 |
245
- |---|------|--------------------|---------|
246
- | 1 | 查询全量字典列表(去重用) | `GET /system/dict/list` | DevTools → 进入"数据字典"列表页 → 查看 Network |
247
- | 2 | 创建/更新单个字典码 | `POST /system/dict/save` | DevTools → 新增一条字典 → 查看 Request URL + Body |
248
- | 3 | 批量保存字典项(value/label) | `POST /system/dictItem/save` | DevTools → 为字典添加项 → 查看 Request URL + Body |
249
-
250
- 确认完成后,删除此区块即可正式使用。
251
-
252
- ---
253
-
254
- ## 配置(复用 menu-sync,无需重复填写)
255
-
256
- 本 Skill 读取顺序:
257
-
258
- 1. 优先读取 `skills/sync/dict-sync/env/env.local.json`(如存在)
259
- 2. 回落到 `skills/sync/menu-sync/env/env.local.json`(_inherit 机制)
260
-
261
- **绝大多数情况下无需单独创建字典配置**——menu-sync 配置的 `gatewayPath`、`token`、`sysAppNo` 完全共用。
262
-
263
- 仅当字典接口需要独立 token 或不同网关时,才在 `dict-sync/env/env.local.json` 单独配置:
264
-
265
- ```json
266
- {
267
- "gatewayPath": "http://网关地址:端口",
268
- "sysAppNo": "应用编码",
269
- "token": "Bearer Token(不含 bearer 前缀)"
270
- }
271
- ```
272
-
273
- ---
274
-
275
- ## Pre-flight 声明(执行前必须输出)
276
-
277
- ```
278
- 🚀 已触发技能 dict-sync/SKILL.md → 字典同步
279
- ✅ 已读取 menu-sync/env/env.local.json → 网关地址、token、sysAppNo
280
- ✅ 已读取 reports/SYS_DICT_INFO.md → 本地字典基线
281
- ✅ 操作模式:{pull / push / audit}
282
- ✅ 目标字典码:{用户指定 / 从 data.ts 扫描到的字典码列表}
283
- ```
284
-
285
- ---
286
-
287
- ## SYS_DICT_INFO.md — 本地基线格式
288
-
289
- 路径:`.github/reports/SYS_DICT_INFO.md`
290
-
291
- 写入规范(每次 pull 后覆盖更新,push 后追加):
292
-
293
- ```markdown
294
- ## {DICT_CODE}({字典中文名})
295
-
296
- | 值(value) | 显示名称(label) | 排序 | 备注 |
297
- | ---------- | ---------------- | ---- | ---- |
298
- | 0 | 草稿 | 1 | |
299
- | 1 | 待审核 | 2 | |
300
- | 2 | 审核通过 | 3 | |
301
- | 3 | 已驳回 | 4 | |
302
- ```
303
-
304
- **字典码命名规范**(来自项目 data.ts 分析):
305
-
306
- | 风格 | 正确 ✅ | 错误 ❌ |
307
- |------|---------|---------|
308
- | 全大写+下划线 | `ORDER_STATUS` / `SALES_COMPANY` | `orderStatus` / `salesCompany` |
309
-
310
- ---
311
-
312
- ## 三种工作模式
313
-
314
- ### pull — 刷新本地基线
315
-
316
- **触发词**:`刷新字典基线` / `拉字典`
317
-
318
- ```
319
- 1. 调用 GET {TODO_CONFIRM: /system/dict/list?size=500} → 获取全量字典
320
- 2. 整理为 SYS_DICT_INFO.md 格式
321
- 3. 覆盖写入 reports/SYS_DICT_INFO.md
322
- 4. 输出:共拉取 N 个字典码,M 个字典项
323
- ```
324
-
325
- **接口调用**:
326
- ```
327
- GET {gatewayPath}/system/dict/list?current=1&size=500 ← TODO_CONFIRM 路径
328
- Headers:
329
- authorization: bearer {token}
330
- Sysappno: {sysAppNo}
331
- ```
332
-
333
- **响应处理**:取 `data.records`(或 `data.list`,以实际为准),`code === 2000` 为成功。
334
-
335
- ---
336
-
337
- ### push — 推送新增字典(核心模式)
338
-
339
- **触发词**:`同步字典` / `创建字典` / `补字典`
340
-
341
- #### Step 1:扫描当前 data.ts 中的字典引用
342
-
343
- 从用户指定范围(单文件 / 整个 src/views/)扫描所有:
344
- ```typescript
345
- logicType: BusLogicDataType.dict, logicValue: "DICT_CODE"
346
- ```
347
- 收集所有 `logicValue` 值,去重后得到「当前用到的字典码集合」。
348
-
349
- #### Step 2:与本地基线对比
350
-
351
- 读取 `reports/SYS_DICT_INFO.md`,找出「未在基线中的字典码」(即需要新建的字典)。
352
-
353
- > 若本地基线为空或过期,提示用户先执行 `pull` 模式拉取基线。
354
-
355
- #### Step 3:Pre-flight 输出待新建清单
356
-
357
- 在执行任何 API 调用前,输出:
358
-
359
- ```
360
- 📋 待同步字典清单:
361
- 新建字典码:ORDER_STATUS(订单状态)— 含 4 个字典项
362
- 新建字典码:SALES_COMPANY(销售公司)— 含 3 个字典项
363
- 跳过(已在基线中):PRODUCT_SEGMENT
364
-
365
- 确认执行?(yes/no)
366
- ```
367
-
368
- 等待用户确认后再执行。
369
-
370
- #### Step 4:逐条创建字典码
371
-
372
- ```
373
- POST {gatewayPath}/system/dict/save ← TODO_CONFIRM 路径
374
- Headers:
375
- authorization: bearer {token}
376
- Sysappno: {sysAppNo}
377
- Content-Type: application/json
378
-
379
- Body(待确认字段名):
380
- {
381
- "dictCode": "ORDER_STATUS",
382
- "dictName": "订单状态",
383
- "remark": ""
384
- }
385
- ```
386
-
387
- #### Step 5:批量写入字典项
388
-
389
- ```
390
- POST {gatewayPath}/system/dictItem/save ← TODO_CONFIRM 路径
391
- Headers:
392
- authorization: bearer {token}
393
- Sysappno: {sysAppNo}
394
- Content-Type: application/json
395
-
396
- Body(待确认字段名,按实际接口响应调整):
397
- {
398
- "dictCode": "ORDER_STATUS",
399
- "items": [
400
- { "dictItemValue": "0", "dictItemLabel": "草稿", "sortNo": 1 },
401
- { "dictItemValue": "1", "dictItemLabel": "待审核", "sortNo": 2 }
402
- ]
403
- }
404
- ```
405
-
406
- #### Step 6:输出结果表
407
-
408
- | 字典码 | 字典名称 | 字典项数 | 状态 |
409
- |--------|---------|---------|------|
410
- | ORDER_STATUS | 订单状态 | 4 | ✅ created |
411
- | SALES_COMPANY | 销售公司 | 3 | ✅ created |
412
- | PRODUCT_SEGMENT | 产品板块 | 5 | ⏭️ skipped(已存在) |
413
-
414
- 执行完成后,将新建字典追加写入 `reports/SYS_DICT_INFO.md`。
415
-
416
- ---
417
-
418
- ### audit — 仅检查,不调接口
419
-
420
- **触发词**:`字典审计` / `检查字典`
421
-
422
- ```
423
- 1. 扫描指定范围的 data.ts,收集所有 logicValue 字典码
424
- 2. 与 SYS_DICT_INFO.md 基线对比
425
- 3. 输出三个清单:
426
- ✅ 已在基线中(无需操作)
427
- ⚠️ 在 data.ts 中使用但不在基线中(建议执行 push)
428
- 💤 在基线中但未被任何 data.ts 使用(可能已废弃)
429
- 4. 不调用任何接口
430
- ```
431
-
432
- ---
433
-
434
- ## 冲突处理原则
435
-
436
- | 场景 | 策略 |
437
- |------|------|
438
- | 本地新增字典,线上不存在 | 调接口创建 |
439
- | 字典码已存在,字典名不同 | 询问用户:以本地为准(更新)/ 保留线上 / 跳过 |
440
- | 字典项 value 相同,label 不同 | 询问用户:以本地为准 / 以线上为准 / 跳过 |
441
- | 线上存在,本地无记录 | 仅在 audit 中报告,**绝不主动删除** |
442
-
443
- ---
444
-
445
- ## 与其他 Skill 联动
446
-
447
- | Skill | 联动方式 |
448
- |-------|---------|
449
- | **page-codegen** | 生成 data.ts 时,如发现 `logicValue` 字典码不在基线中,报告末尾追加"⚠️ 建议运行 dict-sync 补齐以下字典" |
450
- | **convention-audit** | 审计 12 号规范时,可调用 dict-sync audit 模式,将"字典码未在基线中"列为 🟡 偏差 |
451
- | **menu-sync** | 共享 env.local.json 配置,无需重复填写 |
1
+ ---
2
+ name: dict-sync
3
+ description: "Use when: syncing data dictionary entries to the backend, pulling the current online dictionary baseline, or checking which dictionaries used in data.ts are missing from the system. Triggers on: 同步字典, 创建字典, 刷新字典基线, 字典对比, 字典审计, dict sync, create dict."
4
+ ---
5
+
6
+ # Skill: 字典同步(dict-sync)
7
+
8
+ 将 `data.ts` 中引用的数据字典(`logicType: BusLogicDataType.dict, logicValue: "DICT_CODE"`)同步到后端字典表,保持本地基线与线上一致。
9
+
10
+ > **与 menu-sync / permission-sync 对称**:同样读取本地基线 → 与线上对比 → 补齐差异。配置共用 `skills/sync/env.local.json`。
11
+
12
+ ---
13
+
14
+ ## 📖 必读公共护栏
15
+
16
+ 本 Skill 遵守 `../_mcp-guardrail.md`(MCP 调用纪律与自愈闭环)。AI 首次执行 sync 类任务时先 `read_file` 加载它。
17
+
18
+ 本 Skill 使用的 MCP 工具:`wls_dict_query` / `wls_dict_upsert`。调用失败时按 guardrail §2 剧本引导用户完善 `env.local.json` 后重试,**不得用 curl/手拼 HTTP 绕开 MCP**。
19
+
20
+ ---
21
+
22
+ ## 配置(统一配置文件)
23
+
24
+ 读取 `.github/skills/sync/env.local.json`(已在 `.gitignore`,不入 git):
25
+
26
+ ```json
27
+ {
28
+ "gatewayPath": "http://192.168.10.50:9000",
29
+ "sysAppNo": "QjQuXy1kbKxZyjhS5N2",
30
+ "token": "eyJhbGci...",
31
+ "dict": {
32
+ "moduleId": "7C909G0U2F8HI7E305LV0135LSJ3UBIO"
33
+ }
34
+ }
35
+ ```
36
+
37
+ | 字段 | 说明 |
38
+ |---|---|
39
+ | `gatewayPath` | 后端网关,末尾不加斜杠 |
40
+ | `sysAppNo` | 应用编码(非明文) |
41
+ | `token` | 纯 JWT,**不含 `bearer ` 前缀**(MCP 内部自动拼接) |
42
+ | `dict.moduleId` | 字典所属模块 ID(字典管理后台 Network 抓取) |
43
+
44
+ > 字段获取方式见同目录 `../menu-sync/env/guide.md`。
45
+
46
+ ---
47
+
48
+ ## Pre-flight 声明(执行前必须输出)
49
+
50
+ ```
51
+ 🚀 已触发技能 dict-sync/SKILL.md → 字典同步
52
+ ✅ MCP 工具检查:wls_dict_query / wls_dict_upsert 均可用
53
+ 已读取 .github/skills/sync/env.local.json → 网关 + token + sysAppNo + dict.moduleId
54
+ 已读取 .github/reports/SYS_DICT_INFO.md → 本地字典基线
55
+ 操作模式:{pull / push / audit}
56
+ ✅ 目标字典码:{用户指定 / data.ts 扫描结果}
57
+ ```
58
+
59
+ > Pre-flight 任一项失败(特别是 MCP 工具检查),立即停止并向用户报告,**不得**降级为手动调接口。
60
+
61
+ ---
62
+
63
+ ## 三种工作模式
64
+
65
+ ### pull — 刷新本地基线
66
+
67
+ **触发词**:`刷新字典基线` / `拉字典`
68
+
69
+ **执行**:
70
+ 1. 调用 MCP 工具 `wls_dict_query`(无参)
71
+ 2. 工具返回当前应用域全部字典模块 + 字典项树
72
+ 3. AI 解析返回结果,整理为 SYS_DICT_INFO.md 格式覆盖写入
73
+ 4. 输出:"共拉取 N 个字典码,M 个字典项"
74
+
75
+ > MCP 内部对应 `GET /system/business/dict/getDictionaryTreeData`,AI **无需关心**。
76
+
77
+ ---
78
+
79
+ ### push — 推送新增字典(核心模式)
80
+
81
+ **触发词**:`同步字典` / `创建字典` / `补字典`
82
+
83
+ #### Step 1:扫描 data.ts 中的字典引用
84
+
85
+ 从用户指定范围扫描所有:
86
+
87
+ ```typescript
88
+ logicType: BusLogicDataType.dict, logicValue: "DICT_CODE"
89
+ ```
90
+
91
+ 去重得到「当前用到的字典码集合」。
92
+
93
+ #### Step 2:与本地基线 + 线上对比(去重双保险)
94
+
95
+ ```
96
+ ① 读取 reports/SYS_DICT_INFO.md → 本地已知字典码
97
+ ② 调用 wls_dict_query → 线上当前字典码(strSn 列表)
98
+ ③ 待创建 = 用到的字典码 - 线上已有字典码
99
+ ```
100
+
101
+ > **多人协同**:每人 env.local.json 不入 git。去重通过 ② 线上实时查询保证;后端 `strSn` 字段有唯一约束,并发场景下第二次创建会被服务端跳过,Skill 视为成功。
102
+
103
+ #### Step 3:Pre-flight 输出待新建清单,等待确认
104
+
105
+ ```
106
+ 📋 待同步字典清单:
107
+ 新建:ORDER_STATUS(订单状态)— 含 4 项
108
+ 新建:SALES_COMPANY(销售公司)— 3
109
+ 跳过(线上已有):PRODUCT_SEGMENT
110
+ 确认执行?(yes/no)
111
+ ```
112
+
113
+ #### Step 4:批量创建字典码 + 字典项
114
+
115
+ 调用 MCP 工具 `wls_dict_upsert`(**逐个字典模块**调一次):
116
+
117
+ ```jsonc
118
+ // MCP 工具入参
119
+ {
120
+ "module": {
121
+ "strSn": "ORDER_STATUS",
122
+ "strName": "订单状态",
123
+ "sortPriority": "1",
124
+ "strLevel": 2
125
+ },
126
+ "items": [
127
+ { "strSn": "0", "strName": "草稿", "strLevel": 2 },
128
+ { "strSn": "1", "strName": "待审核", "strLevel": 2 },
129
+ { "strSn": "2", "strName": "已通过", "strLevel": 2 },
130
+ { "strSn": "3", "strName": "已驳回", "strLevel": 2 }
131
+ ]
132
+ }
133
+ ```
134
+
135
+ > 工具内部:模块不存在则创建并自动 re-query 取 id;字典项按 strSn 自动跳过已存在项。AI 无需手动管理 id。
136
+
137
+ #### Step 5:输出结果表 + 更新基线
138
+
139
+ | 字典码 | 字典名称 | 字典项数 | 状态 |
140
+ |---|---|---|---|
141
+ | ORDER_STATUS | 订单状态 | 4 | ✅ created |
142
+ | SALES_COMPANY | 销售公司 | 3 | ✅ created |
143
+ | PRODUCT_SEGMENT | 产品板块 | - | ⏭️ skipped(线上已有) |
144
+
145
+ 执行完成后,将新建字典追加写入 `.github/reports/SYS_DICT_INFO.md`。
146
+
147
+ ---
148
+
149
+ ### audit — 仅检查,不调写接口
150
+
151
+ **触发词**:`字典审计` / `检查字典`
152
+
153
+ ```
154
+ 1. 扫描指定范围的 data.ts,收集所有 logicValue 字典码
155
+ 2. 调用 wls_dict_query 获取线上现状
156
+ 3. 对比 SYS_DICT_INFO.md 本地基线
157
+ 4. 输出三类清单:
158
+ ✅ 已在基线 + 线上(健康)
159
+ ⚠️ data.ts 用到但缺失(建议执行 push)
160
+ 💤 在基线但未被任何 data.ts 引用(可能已废弃)
161
+ 5. 不调用任何写接口
162
+ ```
163
+
164
+ ---
165
+
166
+ ## SYS_DICT_INFO.md — 本地基线格式
167
+
168
+ 路径:`.github/reports/SYS_DICT_INFO.md`
169
+
170
+ ```markdown
171
+ ## ORDER_STATUS(订单状态)
172
+
173
+ | 值(strSn) | 显示名称(strName) | 备注 |
174
+ | ---------- | ------------------ | ---- |
175
+ | 0 | 草稿 | |
176
+ | 1 | 待审核 | |
177
+ | 2 | 已通过 | |
178
+ | 3 | 已驳回 | |
179
+ ```
180
+
181
+ **字典码命名规范**:全大写 + 下划线,如 `ORDER_STATUS` / `SALES_COMPANY`。
182
+
183
+ ---
184
+
185
+ ## 冲突处理原则
186
+
187
+ | 场景 | 策略 |
188
+ |---|---|
189
+ | 本地新增、线上不存在 | 调 `wls_dict_upsert` 创建 |
190
+ | 字典码已存在、字典名不同 | 询问用户:以本地为准 / 保留线上 / 跳过 |
191
+ | 字典项 strSn 相同、strName 不同 | 询问用户决定(Skill 默认跳过,不覆盖) |
192
+ | 线上存在、本地无记录 | 仅在 audit 中报告,**绝不主动删除** |
193
+
194
+ ---
195
+
196
+ ## 与其他 Skill 联动
197
+
198
+ | Skill | 联动方式 |
199
+ |---|---|
200
+ | **page-codegen** | 生成 data.ts 时如 `logicValue` 不在基线中,报告末尾提示"建议运行 dict-sync 补齐" |
201
+ | **convention-audit** | 调用 audit 模式,"字典码未在基线"列为 🟡 偏差 |
202
+ | **menu-sync / permission-sync** | 共享 `skills/sync/env.local.json`,gatewayPath / token / sysAppNo 同一份 |
203
+
204
+ ---
205
+
206
+ ## MCP 不可用或调用失败时怎么办
207
+
208
+ 见 `../_mcp-guardrail.md` §2 自愈闭环剧本。**原则**:先帮用户完善 `env.local.json` 里的 token / dict.moduleId,重试 MCP 工具。**绝不允许** AI 用 curl/PowerShell/fetch 绕开 MCP 手拼 HTTP。