@agile-team/wl-skills-kit 2.1.5 → 2.1.6
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.
- package/README.md +24 -3
- package/bin/wl-skills.js +12 -6
- package/files/.github/guides/architecture.md +1 -1
- package/files/.github/reports/SYS_DICT_INFO.md +43 -12
- package/files/.github/skills/_registry.md +1 -1
- package/files/.github/skills/core/convention-audit/SKILL.md +1 -1
- package/files/.github/skills/sync/dict-sync/SKILL.md +451 -0
- package/files/.github/skills/sync/env.local.json +22 -0
- package/files/.github/skills/sync/menu-sync/SKILL.md +10 -5
- package/files/.github/skills/sync/menu-sync/env/env.local.json +1 -0
- package/files/.github/standards/12-base-table.md +17 -11
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @agile-team/wl-skills-kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@agile-team/wl-skills-kit)
|
|
4
|
+
|
|
5
|
+
**AI Skill 模板包 v2.1.6** — 一条命令将 13 条编码规范、6 个 AI Skill、组件文档、领域样例导入 Vue 3 项目。
|
|
4
6
|
|
|
5
7
|
让 AI 编辑器(Copilot / Cursor / Windsurf / Claude Code / Cline / Kiro / Trae / 通用 Agents)**真正理解项目规范**,从原型/详设到完整页面代码全流程自动化。
|
|
6
8
|
|
|
@@ -195,7 +197,7 @@ npx @agile-team/wl-skills-kit update
|
|
|
195
197
|
| `convention-audit` | ✅ 启用 | `skills/core/convention-audit/` | 13 条规范扫描 + 双报告 |
|
|
196
198
|
| `template-extract` | ✅ 启用 | `skills/core/template-extract/` | 现有页面 → 领域模板 |
|
|
197
199
|
| `menu-sync` | ✅ 启用 | `skills/sync/menu-sync/` | 菜单基线 ↔ 后端接口 |
|
|
198
|
-
| `dict-sync` |
|
|
200
|
+
| `dict-sync` | 🔧 待激活 | `skills/sync/dict-sync/` | 字典基线 ↔ 后端接口(API 端点已验证,配置后即用)|
|
|
199
201
|
| `permission-sync` | ⏳ PLANNED | `skills/sync/permission-sync/` | 权限基线 ↔ 后端接口 |
|
|
200
202
|
| `code-fix` | ⏳ PLANNED | `skills/ops/code-fix/` | 受控自动修复偏差 |
|
|
201
203
|
|
|
@@ -203,6 +205,24 @@ npx @agile-team/wl-skills-kit update
|
|
|
203
205
|
|
|
204
206
|
---
|
|
205
207
|
|
|
208
|
+
## AGGrid cid 唯一性规则
|
|
209
|
+
|
|
210
|
+
> 21 个系统共享同一浏览器 origin(localStorage 共用),cid 碰撞会导致列配置互相覆盖。
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
// ✅ 正确:Date.now().toString(36) — 毫秒级唯一,永不重复,约 9 位 base-36
|
|
214
|
+
cid="mca-lhfge5hc" // 表格级:{页面首字母缩写}-{base36时间戳}
|
|
215
|
+
cid: 'mca-customerName' // 列级:{表格缩写}-{fieldName}
|
|
216
|
+
|
|
217
|
+
// ❌ 错误:截断十进制后6位(每11.5天循环一次,且不同页面缩写易碰撞)
|
|
218
|
+
cid="mca-745831"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Pre-flight 中 AI 自动输出**:`✅ cid 已生成:mca-lhfge5hc(mmwr-customer-archive)`
|
|
222
|
+
`convention-audit` 遇到旧格式 cid 会标记为 🟡 偏差提示。
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
206
226
|
## 技能触发 & 验证
|
|
207
227
|
|
|
208
228
|
> **所有编辑器使用相同的触发词**,无需区分编辑器类型。Copilot / Cursor / Windsurf / Claude Code / Cline / Kiro / Trae 读取各自对应的配置文件,内容完全一致,仅 frontmatter 格式不同。
|
|
@@ -295,7 +315,8 @@ npx @agile-team/wl-skills-kit update
|
|
|
295
315
|
| 命令 | 保护路径 | 说明 |
|
|
296
316
|
| ------------------------ | --------------------------------------------------- | -------------------------- |
|
|
297
317
|
| `init` / `update` | `.github/reports/*.md` | 已存则跳过,不覆盖累积 |
|
|
298
|
-
| `init` / `update` | `.github/skills/sync/
|
|
318
|
+
| `init` / `update` | `.github/skills/sync/env.local.json` | 已存则跳过,保护同步配置(菜单+字典+权限统一) |
|
|
319
|
+
| `init` / `update` | `.github/skills/sync/menu-sync/env/env.local.json` | 旧版兼容,已存则跳过 |
|
|
299
320
|
| `clean`(默认) | `src/components/` + `src/types/` | 业务代码必需,永不删除 |
|
|
300
321
|
| `clean --keep-reports` | + `.github/reports/` | 保留菜单/字典/权限基线 |
|
|
301
322
|
|
package/bin/wl-skills.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* wl-skills-kit CLI v2.1.
|
|
4
|
+
* wl-skills-kit CLI v2.1.6
|
|
5
5
|
*
|
|
6
6
|
* 命令:
|
|
7
7
|
* init 全量安装(默认,向后兼容)
|
|
@@ -165,7 +165,8 @@ function isReportFile(relPath) {
|
|
|
165
165
|
|
|
166
166
|
// 用户本地配置:init/update 遇到已存在不覆盖(含 token / gatewayPath 等敏感信息)
|
|
167
167
|
const USER_LOCAL_CONFIGS = [
|
|
168
|
-
".github/skills/sync/
|
|
168
|
+
".github/skills/sync/env.local.json", // 统一配置(v2.1.5+,菜单+字典+权限共用)
|
|
169
|
+
".github/skills/sync/menu-sync/env/env.local.json", // 老版兼容
|
|
169
170
|
];
|
|
170
171
|
function isUserLocalConfig(relPath) {
|
|
171
172
|
return USER_LOCAL_CONFIGS.includes(relPath);
|
|
@@ -318,16 +319,21 @@ function runInstall(incremental) {
|
|
|
318
319
|
|
|
319
320
|
// ── Step 1.5: .gitignore 安全修补(防止 env.local.json 意外入 git)────────
|
|
320
321
|
|
|
321
|
-
const
|
|
322
|
-
".github/skills/sync/
|
|
322
|
+
const ENV_LOCAL_GITIGNORE_ENTRIES = [
|
|
323
|
+
".github/skills/sync/env.local.json", // 统一配置(v2.1.5+)
|
|
324
|
+
".github/skills/sync/menu-sync/env/env.local.json", // 老版兼容
|
|
325
|
+
];
|
|
323
326
|
const gitignorePath = path.join(TARGET_DIR, ".gitignore");
|
|
324
327
|
if (!dryRun && fs.existsSync(gitignorePath)) {
|
|
325
328
|
const giContent = fs.readFileSync(gitignorePath, "utf8");
|
|
326
|
-
|
|
329
|
+
const missing = ENV_LOCAL_GITIGNORE_ENTRIES.filter(
|
|
330
|
+
(e) => !giContent.includes(e)
|
|
331
|
+
);
|
|
332
|
+
if (missing.length > 0) {
|
|
327
333
|
fs.appendFileSync(
|
|
328
334
|
gitignorePath,
|
|
329
335
|
"\n# wl-skills-kit: 本地敏感配置(token / gatewayPath,不入 git)\n" +
|
|
330
|
-
|
|
336
|
+
missing.join("\n") +
|
|
331
337
|
"\n",
|
|
332
338
|
);
|
|
333
339
|
console.log(" ✔ .gitignore 已追加 env.local.json 保护条目");
|
|
@@ -1,19 +1,50 @@
|
|
|
1
|
-
# SYS_DICT_INFO —
|
|
1
|
+
# SYS_DICT_INFO — 字典数据基线
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
5
|
-
>
|
|
3
|
+
> **写入方**:`dict-sync pull` 模式从线上拉取后覆盖;`dict-sync push` 完成后追加新增字典
|
|
4
|
+
> **读取方**:`dict-sync push / audit` 模式对比本地 vs 线上差异
|
|
5
|
+
> **格式约定**:每个字典码一个二级标题块,字典项以表格形式列出
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 字典码命名规范
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
全大写 + 下划线分隔,例如:ORDER_STATUS / SALES_COMPANY / PRODUCT_NAME
|
|
13
|
+
```
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| status | 状态 | 1 | 启用 | 1 | |
|
|
15
|
-
| status | 状态 | 0 | 停用 | 2 | |
|
|
15
|
+
data.ts 中引用方式:
|
|
16
|
+
```typescript
|
|
17
|
+
{ logicType: BusLogicDataType.dict, logicValue: "ORDER_STATUS" }
|
|
16
18
|
```
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 字典数据
|
|
23
|
+
|
|
24
|
+
> ⚠️ 基线为空。请执行以下任一方式初始化:
|
|
25
|
+
>
|
|
26
|
+
> 1. **从线上拉取**:对 AI 说「刷新字典基线」→ dict-sync pull 模式自动填充此文件
|
|
27
|
+
> 2. **手动维护**:按以下格式手动添加,后续 push 模式以此为数据源
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
<!-- 以下为示例格式,执行 pull 后将被真实数据替换 -->
|
|
32
|
+
|
|
33
|
+
<!--
|
|
34
|
+
## ORDER_STATUS(订单状态)
|
|
35
|
+
|
|
36
|
+
| 值(value) | 显示名称(label) | 排序 | 备注 |
|
|
37
|
+
| ---------- | ---------------- | ---- | ---- |
|
|
38
|
+
| 0 | 草稿 | 1 | |
|
|
39
|
+
| 1 | 待审核 | 2 | |
|
|
40
|
+
| 2 | 审核通过 | 3 | |
|
|
41
|
+
| 3 | 已驳回 | 4 | |
|
|
42
|
+
|
|
43
|
+
## SALES_COMPANY(销售公司)
|
|
44
|
+
|
|
45
|
+
| 值(value) | 显示名称(label) | 排序 | 备注 |
|
|
46
|
+
| ---------- | ---------------- | ---- | ---- |
|
|
47
|
+
| 01 | 华北公司 | 1 | |
|
|
48
|
+
| 02 | 华南公司 | 2 | |
|
|
49
|
+
-->
|
|
50
|
+
|
|
@@ -46,7 +46,7 @@ skills/
|
|
|
46
46
|
| convention-audit | ✅ 启用 | `skills/core/convention-audit/SKILL.md` | 规范审计 / 代码审计 / 规范检查 / 对齐规范 / 规范偏差 / 接手新项目 / 存量代码分析 / 项目体检 |
|
|
47
47
|
| template-extract | ✅ 启用 | `skills/core/template-extract/SKILL.md` | 提取模板 / 抽取模板 / 沉淀模板 / 模板贡献 |
|
|
48
48
|
| menu-sync | ✅ 启用 | `skills/sync/menu-sync/SKILL.md` | 创建菜单 / 注册菜单 / 同步菜单 / 补菜单 |
|
|
49
|
-
| dict-sync |
|
|
49
|
+
| dict-sync | 🔧 待激活 | `skills/sync/dict-sync/SKILL.md` | 同步字典 / 创建字典 / 刷新字典基线 / 字典对比 / 字典审计(**API 端点确认后自动生效**)|
|
|
50
50
|
| permission-sync | ⏳ PLANNED | `skills/sync/permission-sync/SKILL.draft.md` | (草稿,不参与调度) |
|
|
51
51
|
| code-fix | ⏳ PLANNED | `skills/ops/code-fix/SKILL.draft.md` | (草稿,不参与调度) |
|
|
52
52
|
|
|
@@ -57,7 +57,7 @@ description: "Use when: auditing project source code against the 13 modular stan
|
|
|
57
57
|
| 09 | TypeScript | 滥用 any(>3 处/页) → 🟡 |
|
|
58
58
|
| 10 | Pinia | data.ts 内 import Store → 🔴 |
|
|
59
59
|
| 11 | 表单校验 | FORM_ROUTE 缺 validate / resetFields → 🔴 |
|
|
60
|
-
| 12 | BaseTable + cid | 用 el-table / 缺 render-type / cid 缺失或重复 →
|
|
60
|
+
| 12 | BaseTable + cid | 用 el-table / 缺 render-type / cid 缺失或重复 → 🔴;cid 后缀使用旧格式(十进制截断后6位)→ 🟡 提示改为 base-36 完整值 |
|
|
61
61
|
| 13 | 平台组件合规 | 用 el-form/el-table/el-date-picker 替代封装 → 🔴;3+ 复用 → 提取建议 |
|
|
62
62
|
|
|
63
63
|
---
|
|
@@ -0,0 +1,451 @@
|
|
|
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 配置,无需重复填写 |
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_readme": "wl-skills-kit 同步配置 — 已加入 .gitignore,请勿提交此文件。详细说明见 menu-sync/env/guide.md",
|
|
3
|
+
|
|
4
|
+
"gatewayPath": "http://你的网关地址:端口",
|
|
5
|
+
"sysAppNo": "应用编码(从已有菜单接口响应中获取,非明文)",
|
|
6
|
+
"token": "你的Bearer Token(不含bearer前缀)",
|
|
7
|
+
|
|
8
|
+
"menu": {
|
|
9
|
+
"_comment": "menu-sync 专属配置",
|
|
10
|
+
"parentMenuId": "父级菜单ID(从菜单管理后台获取)"
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
"dict": {
|
|
14
|
+
"_comment": "dict-sync 专属配置",
|
|
15
|
+
"moduleId": "字典所属模块ID(从字典管理后台获取,如 7C909G0U2F8HI7E305LV0135LSJ3UBIO)"
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
"permission": {
|
|
19
|
+
"_comment": "permission-sync 专属配置 — 待启用,字段待确认",
|
|
20
|
+
"parentPermissionId": ""
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -23,24 +23,29 @@ description: "Use when: creating system menus for newly generated pages, batch r
|
|
|
23
23
|
| `parentMenuNameCode` | API 自动查询 | AI 调 children 接口获取,无需手填 |
|
|
24
24
|
| **gatewayPath、parentMenuId、sysAppNo、token** | `env.local.json` | 每套环境不同,唯一需要手动维护的 4 个值 |
|
|
25
25
|
|
|
26
|
-
###
|
|
26
|
+
### 配置文件(统一维护,菜单/字典/权限共用)
|
|
27
27
|
|
|
28
|
-
`.github/skills/sync/
|
|
28
|
+
优先读取 `.github/skills/sync/env.local.json`(v2.1.5+ 统一配置):
|
|
29
29
|
|
|
30
30
|
```json
|
|
31
31
|
{
|
|
32
32
|
"gatewayPath": "http://网关地址:端口",
|
|
33
|
-
"parentMenuId": "父级菜单ID",
|
|
34
33
|
"sysAppNo": "应用编码(从已有菜单的sysAppNo字段获取,非明文)",
|
|
35
|
-
"token": "Bearer Token(不含bearer前缀)"
|
|
34
|
+
"token": "Bearer Token(不含bearer前缀)",
|
|
35
|
+
"menu": {
|
|
36
|
+
"parentMenuId": "父级菜单ID"
|
|
37
|
+
}
|
|
36
38
|
}
|
|
37
39
|
```
|
|
38
40
|
|
|
41
|
+
> 向下兼容:如上述文件不存在,回落读取 `menu-sync/env/env.local.json`(旧版路径)。
|
|
39
42
|
> 字段说明及获取方式见 `env/guide.md`
|
|
40
43
|
|
|
44
|
+
menu-sync 读取规则:`parentMenuId` 优先从 `menu.parentMenuId` 读取,回落到根级 `parentMenuId`。
|
|
45
|
+
|
|
41
46
|
### 使用步骤
|
|
42
47
|
|
|
43
|
-
1. **首次**:按 `env/guide.md` 填写 `env.local.json`
|
|
48
|
+
1. **首次**:按 `env/guide.md` 填写 `skills/sync/env.local.json` 的字段
|
|
44
49
|
2. **之后**:直接对 AI 说「帮我创建菜单」/「同步菜单」/「补菜单」
|
|
45
50
|
3. AI 自动执行:读 `reports/SYS_MENU_INFO.md` → 读 `env.local.json` → 查父级已有子节点 → 逐条对比去重 → 调 `/system/menu/save` → 输出 created/skipped 结果表
|
|
46
51
|
4. **全程无需手动执行任何命令**
|
|
@@ -26,28 +26,34 @@
|
|
|
26
26
|
|
|
27
27
|
## cid 命名规则(核心)
|
|
28
28
|
|
|
29
|
-
AGGrid 通过 `cid` 持久化列配置(列宽、顺序、显示),**cid
|
|
29
|
+
AGGrid 通过 `cid` 持久化列配置(列宽、顺序、显示),**cid 必须跨全部系统全局唯一**。
|
|
30
|
+
|
|
31
|
+
> ⚠️ 本项目包含 21 个 Module Federation 子应用,共享同一浏览器 origin(localStorage 共用)。
|
|
32
|
+
> 采用简短十进制后缀存在两个致命问题:①后 6 位每 ~11.5 天循环一次;②不同页面的首字母缩写高概率碰撞(如 `mca`、`dto`)。
|
|
33
|
+
> 因此后缀必须使用 **完整 base-36 时间戳**,保证毫秒级全局唯一且永不重复。
|
|
30
34
|
|
|
31
35
|
### 表格级 cid
|
|
32
36
|
|
|
33
37
|
```
|
|
34
|
-
格式:{页面目录首字母缩写}-{
|
|
38
|
+
格式:{页面目录首字母缩写}-{Date.now().toString(36)}
|
|
35
39
|
```
|
|
36
40
|
|
|
37
41
|
**生成规则(AI 执行)**:
|
|
38
42
|
|
|
39
43
|
1. 取页面 kebab-case 目录名,每个单词取首字母拼接为缩写
|
|
40
|
-
2.
|
|
44
|
+
2. 执行 `Date.now().toString(36)`,将结果完整追加(当前约 9 位 base-36,只增不减)
|
|
41
45
|
3. 用 `-` 连接
|
|
42
46
|
|
|
43
47
|
**示例**:
|
|
44
48
|
|
|
45
|
-
| 页面目录 | 缩写 | cid
|
|
46
|
-
| ------------------------ | ---- |
|
|
47
|
-
| `mmwr-customer-archive` | mca | `mca-
|
|
48
|
-
| `domestic-trade-order` | dto | `dto-
|
|
49
|
-
| 同页面第二个表格(子表) | mca | `mca-
|
|
50
|
-
| 同页面第三个表格 | mca | `mca-
|
|
49
|
+
| 页面目录 | 缩写 | cid(base-36后缀) |
|
|
50
|
+
| ------------------------ | ---- | ----------------------- |
|
|
51
|
+
| `mmwr-customer-archive` | mca | `mca-lhfge5hc` |
|
|
52
|
+
| `domestic-trade-order` | dto | `dto-lhfge5hi` |
|
|
53
|
+
| 同页面第二个表格(子表) | mca | `mca-lhfge5hc-sub1` |
|
|
54
|
+
| 同页面第三个表格 | mca | `mca-lhfge5hc-sub2` |
|
|
55
|
+
|
|
56
|
+
> **为什么不截断**:截断后缀(如后 6 位)会引入循环碰撞。完整 base-36 值为单调递增,毫秒级唯一,9 位 base-36 ≈ 2199 亿组合,同一毫秒只生成一次。
|
|
51
57
|
|
|
52
58
|
### 列级 cid
|
|
53
59
|
|
|
@@ -81,7 +87,7 @@ columnsDef(): TableColumnDesc<any>[] {
|
|
|
81
87
|
## Pre-flight 声明示例
|
|
82
88
|
|
|
83
89
|
```
|
|
84
|
-
✅ cid 已生成:mca-
|
|
90
|
+
✅ cid 已生成:mca-lhfge5hc(mmwr-customer-archive)
|
|
85
91
|
✅ 列级 cid 前缀:mca-
|
|
86
92
|
```
|
|
87
93
|
|
|
@@ -95,7 +101,7 @@ columnsDef(): TableColumnDesc<any>[] {
|
|
|
95
101
|
<BaseTable
|
|
96
102
|
ref="tableRef"
|
|
97
103
|
render-type="agGrid"
|
|
98
|
-
cid="mca-
|
|
104
|
+
cid="mca-lhfge5hc"
|
|
99
105
|
:data="list"
|
|
100
106
|
:columns="columns"
|
|
101
107
|
showToolbar
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agile-team/wl-skills-kit",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "AI Skill 模板包 — 一键导入 AI 指令 + 组件文档 + 通用组件 + 领域样例,覆盖 Copilot/Cursor/Windsurf/Kiro 等主流 AI 编辑器",
|
|
5
5
|
"main": "./bin/wl-skills.js",
|
|
6
6
|
"bin": {
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
],
|
|
27
27
|
"author": "JHLC Frontend Team",
|
|
28
28
|
"license": "UNLICENSED",
|
|
29
|
+
"homepage": "https://github.com/ChenyCHENYU/wl-skills-kit#readme",
|
|
29
30
|
"repository": {
|
|
30
31
|
"type": "git",
|
|
31
32
|
"url": "git+https://github.com/ChenyCHENYU/wl-skills-kit.git"
|