@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.
- package/CHANGELOG.md +24 -23
- package/README.md +15 -146
- package/files/.cursor/mcp.json +8 -0
- package/files/.github/guides/README.md +13 -13
- package/files/.github/guides/architecture.md +555 -555
- package/files/.github/guides/mcp-setup.md +109 -0
- package/files/.github/guides/usage.md +184 -176
- package/files/.github/reports/README.md +65 -65
- package/files/.github/reports/SYS_DICT_INFO.md +50 -50
- package/files/.github/reports/SYS_MENU_INFO.md +247 -247
- package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
- 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
- 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
- package/files/.github/skills/_compat/README.md +108 -108
- package/files/.github/skills/_compat/editors.json +7 -0
- package/files/.github/skills/_compat/headers/agents.txt +8 -8
- package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
- package/files/.github/skills/_compat/headers/cline.txt +7 -7
- package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
- package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
- package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
- package/files/.github/skills/_compat/headers/kiro.txt +10 -10
- package/files/.github/skills/_compat/headers/qoder.txt +8 -0
- package/files/.github/skills/_compat/headers/trae.txt +11 -11
- package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
- package/files/.github/skills/_registry.md +81 -81
- package/files/.github/skills/core/api-contract/SKILL.md +344 -344
- package/files/.github/skills/core/api-contract/USAGE.md +110 -110
- package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
- package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
- package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
- package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
- package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
- package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
- package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
- package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -309
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
- package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
- package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
- package/files/.github/skills/core/template-extract/SKILL.md +139 -139
- package/files/.github/skills/core/template-extract/USAGE.md +93 -93
- package/files/.github/skills/domain/README.md +51 -51
- package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
- package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
- package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
- package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
- package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -91
- package/files/.github/standards/01-toolchain.md +57 -57
- package/files/.github/standards/02-code-structure.md +111 -111
- package/files/.github/standards/03-comments.md +53 -53
- package/files/.github/standards/04-coding-basics.md +33 -33
- package/files/.github/standards/05-logging.md +38 -38
- package/files/.github/standards/06-security.md +44 -44
- package/files/.github/standards/07-config.md +52 -52
- package/files/.github/standards/08-git.md +60 -60
- package/files/.github/standards/09-typescript.md +71 -71
- package/files/.github/standards/10-pinia.md +57 -57
- package/files/.github/standards/11-form-validation.md +81 -81
- package/files/.github/standards/12-base-table.md +153 -153
- package/files/.github/standards/13-platform-components.md +123 -123
- package/files/.github/standards/index.md +89 -89
- package/files/.kiro/settings/mcp.json +8 -0
- package/files/.mcp.json +8 -0
- package/files/.vscode/mcp.json +9 -0
- package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
- package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
- package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
- package/files/docs/jh-date-range.md +257 -257
- package/files/docs/jh-date.md +222 -222
- package/files/docs/jh-dept-picker.md +190 -190
- package/files/docs/jh-drag-row.md +590 -590
- package/files/docs/jh-file-upload.md +216 -216
- package/files/docs/jh-picker.md +218 -218
- package/files/docs/jh-select.md +148 -148
- package/files/docs/jh-text.md +248 -248
- package/files/docs/jh-user-picker.md +197 -197
- package/files/src/components/global/C_RightToolbar/data.ts +228 -228
- package/files/src/components/global/C_RightToolbar/index.scss +44 -44
- package/files/src/components/global/C_Splitter/index.scss +61 -61
- package/files/src/components/global/C_SvgIcon/index.scss +15 -15
- package/files/src/components/global/C_TagStatus/index.scss +20 -20
- package/files/src/components/global/C_Tree/data.ts +61 -61
- package/files/src/components/local/c_listModal/index.scss +4 -4
- package/package.json +1 -1
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
# 使用指南:menu-sync(菜单同步)
|
|
2
|
-
|
|
3
|
-
> **谁读这个文档**:团队成员(前端 + 后端联调时)
|
|
4
|
-
> **AI 触发文件**:同目录 `SKILL.md`
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 这个 Skill 解决什么问题
|
|
9
|
-
|
|
10
|
-
新页面写完后,需要在系统菜单中**注册一条菜单记录**才能从 UI 访问。这个 Skill:
|
|
11
|
-
|
|
12
|
-
1. 拉取**线上菜单数据**到 `reports/SYS_MENU_INFO.md`(团队基线)
|
|
13
|
-
2. 对比已生成页面 vs 线上菜单,**自动补齐缺失菜单项**
|
|
14
|
-
3. 调用菜单注册接口(或生成 SQL 让后端执行)
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## 何时使用
|
|
19
|
-
|
|
20
|
-
- 新增页面后,从 UI 访问报"菜单不存在"
|
|
21
|
-
- 一次性创建一批页面,需要批量注册菜单
|
|
22
|
-
- 同步线上菜单基线(PROD/UAT/DEV 拉齐)
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## 触发关键词
|
|
27
|
-
|
|
28
|
-
`创建菜单` / `注册菜单` / `同步菜单` / `补菜单`
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 前置条件
|
|
33
|
-
|
|
34
|
-
`.github/skills/sync/menu-sync/env/env.local.json`(首次使用先填写):
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
{
|
|
38
|
-
"gatewayPath": "https://uat-api.example.com",
|
|
39
|
-
"token": "Bearer xxx",
|
|
40
|
-
"tenantId": "10001",
|
|
41
|
-
"rootMenuId": "1234567890"
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
> **`env.local.json` 不入 git**(已加 .gitignore)。每个开发者本地填自己的 token。
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## 标准对话示例
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
你:把 src/views/produce/aiflow/ 下新建的 7 个页面同步到菜单
|
|
53
|
-
AI:[Pre-flight]
|
|
54
|
-
步骤 1:读取线上菜单基线 reports/SYS_MENU_INFO.md(最新更新:2025-04-20)
|
|
55
|
-
步骤 2:扫描 src/views/produce/aiflow/ 共 7 个页面
|
|
56
|
-
步骤 3:对比缺失:5 项缺失,2 项已存在
|
|
57
|
-
步骤 4:将调用 /sys/menu/save 创建 5 项
|
|
58
|
-
[需你确认]:
|
|
59
|
-
- 父菜单:精整作业 → 客户管理(rootMenuId: xxx)
|
|
60
|
-
- 排序:sortNo 自动递增
|
|
61
|
-
- 权限标识:mmwr:customer:list 等
|
|
62
|
-
确认 yes/no?
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## 输出物
|
|
68
|
-
|
|
69
|
-
1. **基线文件**:`.github/reports/SYS_MENU_INFO.md` —— 线上菜单的本地基线(团队 review 用)
|
|
70
|
-
2. **同步报告**:`.github/reports/MENU_SYNC_<YYYYMMDD>.md` —— 本次新增/更新了哪些菜单
|
|
71
|
-
3. **回滚 SQL**:报告里附带 DELETE SQL,用于回退
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## 常见踩坑
|
|
76
|
-
|
|
77
|
-
| 现象 | 原因 | 解法 |
|
|
78
|
-
| -------------------- | ---------------------------- | ---------------------------------------------- |
|
|
79
|
-
| 同步成功但 UI 看不到 | 用户角色没分配新菜单 | 跑 permission-sync(PLANNED)或后台手工分配 |
|
|
80
|
-
| 401/403 报错 | env.local.json 的 token 过期 | 重新登录系统,从 Network 抓 Authorization 替换 |
|
|
81
|
-
| 同名菜单重复创建 | 没读 SYS_MENU_INFO.md 基线 | 先跑一遍"刷新基线"再 sync |
|
|
82
|
-
| 父菜单 ID 不对 | rootMenuId 配错 | 从浏览器开发者工具看父菜单的 dom data-id |
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## 团队协作流程
|
|
87
|
-
|
|
88
|
-
1. 新人入职,让他先把 `env.local.json` 填一份(参考 env.example.json)
|
|
89
|
-
2. **每周一**由 lead 跑一次"刷新基线",确保 reports/SYS_MENU_INFO.md 最新
|
|
90
|
-
3. PR 提交前自查"我加的菜单有没有提交进基线"
|
|
91
|
-
4. 上线前再 sync 一次到生产环境(切换 env 文件中的 gatewayPath)
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## FAQ
|
|
96
|
-
|
|
97
|
-
**Q:env.local.json 泄露 token 危险吗?**
|
|
98
|
-
A:危险。token 视同密码。已加 .gitignore + .npmignore。**不要 commit**。
|
|
99
|
-
|
|
100
|
-
**Q:能不能直接给 SQL 让后端跑?**
|
|
101
|
-
A:能。在指令里加"只生成 SQL,不调用接口"即可。
|
|
102
|
-
|
|
103
|
-
**Q:和 dict-sync / permission-sync 关系?**
|
|
104
|
-
A:菜单是入口,字典是值域,权限是访问控制。三者独立但配合。建议顺序:menu-sync → permission-sync → dict-sync。
|
|
1
|
+
# 使用指南:menu-sync(菜单同步)
|
|
2
|
+
|
|
3
|
+
> **谁读这个文档**:团队成员(前端 + 后端联调时)
|
|
4
|
+
> **AI 触发文件**:同目录 `SKILL.md`
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 这个 Skill 解决什么问题
|
|
9
|
+
|
|
10
|
+
新页面写完后,需要在系统菜单中**注册一条菜单记录**才能从 UI 访问。这个 Skill:
|
|
11
|
+
|
|
12
|
+
1. 拉取**线上菜单数据**到 `reports/SYS_MENU_INFO.md`(团队基线)
|
|
13
|
+
2. 对比已生成页面 vs 线上菜单,**自动补齐缺失菜单项**
|
|
14
|
+
3. 调用菜单注册接口(或生成 SQL 让后端执行)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 何时使用
|
|
19
|
+
|
|
20
|
+
- 新增页面后,从 UI 访问报"菜单不存在"
|
|
21
|
+
- 一次性创建一批页面,需要批量注册菜单
|
|
22
|
+
- 同步线上菜单基线(PROD/UAT/DEV 拉齐)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 触发关键词
|
|
27
|
+
|
|
28
|
+
`创建菜单` / `注册菜单` / `同步菜单` / `补菜单`
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 前置条件
|
|
33
|
+
|
|
34
|
+
`.github/skills/sync/menu-sync/env/env.local.json`(首次使用先填写):
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"gatewayPath": "https://uat-api.example.com",
|
|
39
|
+
"token": "Bearer xxx",
|
|
40
|
+
"tenantId": "10001",
|
|
41
|
+
"rootMenuId": "1234567890"
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> **`env.local.json` 不入 git**(已加 .gitignore)。每个开发者本地填自己的 token。
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 标准对话示例
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
你:把 src/views/produce/aiflow/ 下新建的 7 个页面同步到菜单
|
|
53
|
+
AI:[Pre-flight]
|
|
54
|
+
步骤 1:读取线上菜单基线 reports/SYS_MENU_INFO.md(最新更新:2025-04-20)
|
|
55
|
+
步骤 2:扫描 src/views/produce/aiflow/ 共 7 个页面
|
|
56
|
+
步骤 3:对比缺失:5 项缺失,2 项已存在
|
|
57
|
+
步骤 4:将调用 /sys/menu/save 创建 5 项
|
|
58
|
+
[需你确认]:
|
|
59
|
+
- 父菜单:精整作业 → 客户管理(rootMenuId: xxx)
|
|
60
|
+
- 排序:sortNo 自动递增
|
|
61
|
+
- 权限标识:mmwr:customer:list 等
|
|
62
|
+
确认 yes/no?
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 输出物
|
|
68
|
+
|
|
69
|
+
1. **基线文件**:`.github/reports/SYS_MENU_INFO.md` —— 线上菜单的本地基线(团队 review 用)
|
|
70
|
+
2. **同步报告**:`.github/reports/MENU_SYNC_<YYYYMMDD>.md` —— 本次新增/更新了哪些菜单
|
|
71
|
+
3. **回滚 SQL**:报告里附带 DELETE SQL,用于回退
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 常见踩坑
|
|
76
|
+
|
|
77
|
+
| 现象 | 原因 | 解法 |
|
|
78
|
+
| -------------------- | ---------------------------- | ---------------------------------------------- |
|
|
79
|
+
| 同步成功但 UI 看不到 | 用户角色没分配新菜单 | 跑 permission-sync(PLANNED)或后台手工分配 |
|
|
80
|
+
| 401/403 报错 | env.local.json 的 token 过期 | 重新登录系统,从 Network 抓 Authorization 替换 |
|
|
81
|
+
| 同名菜单重复创建 | 没读 SYS_MENU_INFO.md 基线 | 先跑一遍"刷新基线"再 sync |
|
|
82
|
+
| 父菜单 ID 不对 | rootMenuId 配错 | 从浏览器开发者工具看父菜单的 dom data-id |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 团队协作流程
|
|
87
|
+
|
|
88
|
+
1. 新人入职,让他先把 `env.local.json` 填一份(参考 env.example.json)
|
|
89
|
+
2. **每周一**由 lead 跑一次"刷新基线",确保 reports/SYS_MENU_INFO.md 最新
|
|
90
|
+
3. PR 提交前自查"我加的菜单有没有提交进基线"
|
|
91
|
+
4. 上线前再 sync 一次到生产环境(切换 env 文件中的 gatewayPath)
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## FAQ
|
|
96
|
+
|
|
97
|
+
**Q:env.local.json 泄露 token 危险吗?**
|
|
98
|
+
A:危险。token 视同密码。已加 .gitignore + .npmignore。**不要 commit**。
|
|
99
|
+
|
|
100
|
+
**Q:能不能直接给 SQL 让后端跑?**
|
|
101
|
+
A:能。在指令里加"只生成 SQL,不调用接口"即可。
|
|
102
|
+
|
|
103
|
+
**Q:和 dict-sync / permission-sync 关系?**
|
|
104
|
+
A:菜单是入口,字典是值域,权限是访问控制。三者独立但配合。建议顺序:menu-sync → permission-sync → dict-sync。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"_notice": "【已迁移】请改用 skills/sync/env.local.json(菜单+字典+权限统一配置)。此文件仍受保护,向下兼容保留。",
|
|
3
|
-
"gatewayPath": "http://你的网关地址:端口",
|
|
4
|
-
"parentMenuId": "父级菜单ID",
|
|
5
|
-
"sysAppNo": "应用编码(从已有菜单接口响应中获取,非明文)",
|
|
6
|
-
"token": "你的Bearer Token(不含bearer前缀)"
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"_notice": "【已迁移】请改用 skills/sync/env.local.json(菜单+字典+权限统一配置)。此文件仍受保护,向下兼容保留。",
|
|
3
|
+
"gatewayPath": "http://你的网关地址:端口",
|
|
4
|
+
"parentMenuId": "父级菜单ID",
|
|
5
|
+
"sysAppNo": "应用编码(从已有菜单接口响应中获取,非明文)",
|
|
6
|
+
"token": "你的Bearer Token(不含bearer前缀)"
|
|
7
|
+
}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
# env.local.json 配置说明
|
|
2
|
-
|
|
3
|
-
> 每位成员在本地维护自己的副本,已加入 `.gitignore`,**不会提交到远端仓库**。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 配置文件位置(优先使用新统一路径)
|
|
8
|
-
|
|
9
|
-
**新路径(v2.1.5+ 推荐)**:`.github/skills/sync/env.local.json`
|
|
10
|
-
**兼容路径(老版)**:`.github/skills/sync/menu-sync/env/env.local.json`
|
|
11
|
-
|
|
12
|
-
AI 优先读新路径,如不存在自动回落到兼容路径。
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 配置格式(菜单/字典/权限三合一)
|
|
17
|
-
|
|
18
|
-
```json
|
|
19
|
-
{
|
|
20
|
-
"gatewayPath": "http://192.168.10.50:9000",
|
|
21
|
-
"sysAppNo": "QjQuXy1kbKxZyjhS5N2",
|
|
22
|
-
"token": "eyJhbGci...",
|
|
23
|
-
|
|
24
|
-
"menu": {
|
|
25
|
-
"parentMenuId": "1803456789012345678"
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
"dict": {
|
|
29
|
-
"moduleId": "7C909G0U2F8HI7E305LV0135LSJ3UBIO"
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## 字段说明
|
|
37
|
-
|
|
38
|
-
| 字段 | 说明 | 示例 |
|
|
39
|
-
|---|---|---|
|
|
40
|
-
| `gatewayPath` | 后端网关地址,含协议和端口,**末尾不加斜杠** | `http://192.168.10.50:9000` |
|
|
41
|
-
| `sysAppNo` | 应用编码(非明文,从已有菜单接口响应中获取) | `QjQuXy1kbKxZyjhS5N2` |
|
|
42
|
-
| `token` | 当前登录用户的 Bearer Token,**不含 `bearer ` 前缀** | `eyJhbGci...` |
|
|
43
|
-
| `menu.parentMenuId` | 目标父级目录的菜单数据库 ID(每套环境不同) | `1803456789012345678` |
|
|
44
|
-
| `dict.moduleId` | 字典所属模块 ID(字典管理后台获取) | `7C909G0U2F8HI7E305LV0135LSJ3UBIO` |
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## 如何获取各字段
|
|
49
|
-
|
|
50
|
-
### gatewayPath
|
|
51
|
-
|
|
52
|
-
询问后端同事,或查看浏览器 Network 面板中任意接口请求的 URL,取协议 + 域名/IP + 端口部分。
|
|
53
|
-
|
|
54
|
-
### menu.parentMenuId
|
|
55
|
-
|
|
56
|
-
**方法 A(推荐)**:系统管理后台 → 菜单管理 → 找到目标父级目录 → 点编辑/查看 → 复制菜单 ID
|
|
57
|
-
|
|
58
|
-
**方法 B(API 查询)**:
|
|
59
|
-
|
|
60
|
-
```
|
|
61
|
-
GET {gatewayPath}/system/menu/children?menuId=0
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
从顶级节点向下逐层查找,直到找到目标父级目录。也可以告诉 AI「帮我查一下父级菜单 ID」,AI 会自动调接口查询。
|
|
65
|
-
|
|
66
|
-
### sysAppNo
|
|
67
|
-
|
|
68
|
-
系统用编码后的字符串标识应用(如 `QjQuXy1kbKxZyjhS5N2`),而非明文 `produce` / `sale`。
|
|
69
|
-
|
|
70
|
-
**获取方式**:浏览器 F12 → Network → 找任意菜单相关接口的响应体 → 查看已有菜单条目的 `sysAppNo` 字段值,复制即可。
|
|
71
|
-
|
|
72
|
-
> ℹ️ 同一领域下所有菜单的 `sysAppNo` 相同,复制任意一个即可。
|
|
73
|
-
|
|
74
|
-
### token
|
|
75
|
-
|
|
76
|
-
1. 在浏览器中登录系统
|
|
77
|
-
2. 按 F12 打开 DevTools → Network 面板
|
|
78
|
-
3. 随便点一个接口请求
|
|
79
|
-
4. 查看 Request Headers → `authorization` 字段
|
|
80
|
-
5. 去掉 `bearer ` 前缀,复制剩余字符串粘贴到 `token` 字段
|
|
81
|
-
|
|
82
|
-
> Token 有有效期,若创建菜单时提示鉴权失败,重新登录后刷新 token 即可。
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## 使用方式
|
|
87
|
-
|
|
88
|
-
配置完成后,直接对 AI 说:
|
|
89
|
-
|
|
90
|
-
> 「帮我创建菜单」/ 「同步菜单」/ 「补菜单」
|
|
91
|
-
|
|
92
|
-
AI 会自动执行:
|
|
93
|
-
1. 读取 `SYS_MENU_INFO.md`(菜单定义)
|
|
94
|
-
2. 读取 `env.local.json`(环境配置)
|
|
95
|
-
3. 调 `/system/menu/children` 查询父级已有子节点(去重)
|
|
96
|
-
4. 逐条调 `/system/menu/save` 创建缺失菜单
|
|
97
|
-
5. 输出 `created / skipped` 结果表
|
|
98
|
-
|
|
99
|
-
**全程无需手动执行任何命令。**
|
|
1
|
+
# env.local.json 配置说明
|
|
2
|
+
|
|
3
|
+
> 每位成员在本地维护自己的副本,已加入 `.gitignore`,**不会提交到远端仓库**。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 配置文件位置(优先使用新统一路径)
|
|
8
|
+
|
|
9
|
+
**新路径(v2.1.5+ 推荐)**:`.github/skills/sync/env.local.json`
|
|
10
|
+
**兼容路径(老版)**:`.github/skills/sync/menu-sync/env/env.local.json`
|
|
11
|
+
|
|
12
|
+
AI 优先读新路径,如不存在自动回落到兼容路径。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 配置格式(菜单/字典/权限三合一)
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"gatewayPath": "http://192.168.10.50:9000",
|
|
21
|
+
"sysAppNo": "QjQuXy1kbKxZyjhS5N2",
|
|
22
|
+
"token": "eyJhbGci...",
|
|
23
|
+
|
|
24
|
+
"menu": {
|
|
25
|
+
"parentMenuId": "1803456789012345678"
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
"dict": {
|
|
29
|
+
"moduleId": "7C909G0U2F8HI7E305LV0135LSJ3UBIO"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 字段说明
|
|
37
|
+
|
|
38
|
+
| 字段 | 说明 | 示例 |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `gatewayPath` | 后端网关地址,含协议和端口,**末尾不加斜杠** | `http://192.168.10.50:9000` |
|
|
41
|
+
| `sysAppNo` | 应用编码(非明文,从已有菜单接口响应中获取) | `QjQuXy1kbKxZyjhS5N2` |
|
|
42
|
+
| `token` | 当前登录用户的 Bearer Token,**不含 `bearer ` 前缀** | `eyJhbGci...` |
|
|
43
|
+
| `menu.parentMenuId` | 目标父级目录的菜单数据库 ID(每套环境不同) | `1803456789012345678` |
|
|
44
|
+
| `dict.moduleId` | 字典所属模块 ID(字典管理后台获取) | `7C909G0U2F8HI7E305LV0135LSJ3UBIO` |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 如何获取各字段
|
|
49
|
+
|
|
50
|
+
### gatewayPath
|
|
51
|
+
|
|
52
|
+
询问后端同事,或查看浏览器 Network 面板中任意接口请求的 URL,取协议 + 域名/IP + 端口部分。
|
|
53
|
+
|
|
54
|
+
### menu.parentMenuId
|
|
55
|
+
|
|
56
|
+
**方法 A(推荐)**:系统管理后台 → 菜单管理 → 找到目标父级目录 → 点编辑/查看 → 复制菜单 ID
|
|
57
|
+
|
|
58
|
+
**方法 B(API 查询)**:
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
GET {gatewayPath}/system/menu/children?menuId=0
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
从顶级节点向下逐层查找,直到找到目标父级目录。也可以告诉 AI「帮我查一下父级菜单 ID」,AI 会自动调接口查询。
|
|
65
|
+
|
|
66
|
+
### sysAppNo
|
|
67
|
+
|
|
68
|
+
系统用编码后的字符串标识应用(如 `QjQuXy1kbKxZyjhS5N2`),而非明文 `produce` / `sale`。
|
|
69
|
+
|
|
70
|
+
**获取方式**:浏览器 F12 → Network → 找任意菜单相关接口的响应体 → 查看已有菜单条目的 `sysAppNo` 字段值,复制即可。
|
|
71
|
+
|
|
72
|
+
> ℹ️ 同一领域下所有菜单的 `sysAppNo` 相同,复制任意一个即可。
|
|
73
|
+
|
|
74
|
+
### token
|
|
75
|
+
|
|
76
|
+
1. 在浏览器中登录系统
|
|
77
|
+
2. 按 F12 打开 DevTools → Network 面板
|
|
78
|
+
3. 随便点一个接口请求
|
|
79
|
+
4. 查看 Request Headers → `authorization` 字段
|
|
80
|
+
5. 去掉 `bearer ` 前缀,复制剩余字符串粘贴到 `token` 字段
|
|
81
|
+
|
|
82
|
+
> Token 有有效期,若创建菜单时提示鉴权失败,重新登录后刷新 token 即可。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 使用方式
|
|
87
|
+
|
|
88
|
+
配置完成后,直接对 AI 说:
|
|
89
|
+
|
|
90
|
+
> 「帮我创建菜单」/ 「同步菜单」/ 「补菜单」
|
|
91
|
+
|
|
92
|
+
AI 会自动执行:
|
|
93
|
+
1. 读取 `SYS_MENU_INFO.md`(菜单定义)
|
|
94
|
+
2. 读取 `env.local.json`(环境配置)
|
|
95
|
+
3. 调 `/system/menu/children` 查询父级已有子节点(去重)
|
|
96
|
+
4. 逐条调 `/system/menu/save` 创建缺失菜单
|
|
97
|
+
5. 输出 `created / skipped` 结果表
|
|
98
|
+
|
|
99
|
+
**全程无需手动执行任何命令。**
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: permission-sync
|
|
3
|
-
description: "[PLANNED — DRAFT, not yet active] 权限同步 Skill 设计草稿。基于 reports/SYS_PERMISSION_INFO.md 基线,将页面级/按钮级权限码注册到系统权限表,并按角色分配。"
|
|
4
|
-
status: planned
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Skill: 权限同步(permission-sync)— 草稿
|
|
8
|
-
|
|
9
|
-
> ⚠️ **本文件为设计草稿(SKILL.draft.md),未启用,不参与 AI 调度。**
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## 1. 设计目标
|
|
14
|
-
|
|
15
|
-
新增页面后,除菜单外还需注册:
|
|
16
|
-
|
|
17
|
-
- **页面访问权限**(`mmwr:customer:list`)
|
|
18
|
-
- **按钮级权限**(`mmwr:customer:add` / `:edit` / `:remove` / `:approve` / `:export` ...)
|
|
19
|
-
- **数据权限**(可选:客户经理只看自己的客户等)
|
|
20
|
-
- **角色绑定**(哪些角色获得这些权限)
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 2. 数据流
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
本地基线 后端接口 Skill 触发
|
|
28
|
-
──────────────────────────────────────── ────────────────────────────────── ────────────────
|
|
29
|
-
reports/SYS_PERMISSION_INFO.md ─fetch─→ GET /sys/permission/listAll
|
|
30
|
-
←compare── POST /sys/permission/batchSave
|
|
31
|
-
─upload─→ POST /sys/role/assignPermissions ─→ "同步权限"
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## 3. 权限码命名规范
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
{服务缩写}:{资源camelCase}:{操作}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
| 操作 | 含义 | 示例 |
|
|
43
|
-
| -------- | -------------- | ------------------------------- |
|
|
44
|
-
| list | 查看列表 | `mmwr:customer:list` |
|
|
45
|
-
| detail | 查看详情 | `mmwr:customer:detail` |
|
|
46
|
-
| add | 新增 | `mmwr:customer:add` |
|
|
47
|
-
| edit | 编辑 | `mmwr:customer:edit` |
|
|
48
|
-
| remove | 删除 | `mmwr:customer:remove` |
|
|
49
|
-
| export | 导出 | `mmwr:customer:export` |
|
|
50
|
-
| import | 导入 | `mmwr:customer:import` |
|
|
51
|
-
| submit | 提交审批 | `mmwr:customer:submit` |
|
|
52
|
-
| approve | 审批通过 | `mmwr:customer:approve` |
|
|
53
|
-
| reject | 审批驳回 | `mmwr:customer:reject` |
|
|
54
|
-
| {custom} | 自定义业务操作 | `mmwr:customer:convertToFormal` |
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## 4. 三种工作模式
|
|
59
|
-
|
|
60
|
-
| 模式 | 触发 | 动作 |
|
|
61
|
-
| ---------- | ----------------------- | ------------------------------------------------------ |
|
|
62
|
-
| `scan` | "扫描权限码" | 从 src/views/ 扫 v-permission / hasPerm 调用,输出清单 |
|
|
63
|
-
| `register` | "注册权限码 / 同步权限" | 对比基线 → 创建缺失 + 更新描述 |
|
|
64
|
-
| `assign` | "给 XX 角色分配权限" | 选定角色 + 选定权限码 → 调 /sys/role/assignPermissions |
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## 5. 安全约束
|
|
69
|
-
|
|
70
|
-
- **生产环境拒绝直接 push**:检测 gatewayPath 含 prod/.com 时强制走"导出 SQL"模式
|
|
71
|
-
- **角色分配二次确认**:每次 assign 必须在 Pre-flight 中列出"角色 → 新增/移除的权限",得到用户 yes 才执行
|
|
72
|
-
- **不删除权限**:永远只新增/更新,删除走人工 SQL(防误删导致大面积失权)
|
|
73
|
-
- **审计**:每次 register/assign 输出 `reports/PERMISSION_SYNC_<YYYYMMDD>.md`,含完整调用日志和回滚 SQL
|
|
74
|
-
|
|
75
|
-
---
|
|
76
|
-
|
|
77
|
-
## 6. 与其他 Skill 联动
|
|
78
|
-
|
|
79
|
-
- **page-codegen**:生成 toolbar 时根据 api.md 操作集自动加 `v-permission` 指令
|
|
80
|
-
- **menu-sync**:菜单注册后提示"是否同步注册访问权限"
|
|
81
|
-
- **convention-audit**:审计按钮是否都有 v-permission
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## 7. 转正前的开发任务
|
|
86
|
-
|
|
87
|
-
- [ ] 确认后端权限模型(RBAC / ABAC?是否分页面权限和按钮权限?)
|
|
88
|
-
- [ ] 数据权限是否纳入本 Skill(建议:暂不,单独 data-permission-sync)
|
|
89
|
-
- [ ] 设计 v-permission 指令的项目内实现(如 @jhlc/common-core 提供则复用)
|
|
90
|
-
- [ ] 多租户场景下的权限继承策略
|
|
91
|
-
- [ ] 与 SSO(嘉为蓝鲸)权限同步策略
|
|
1
|
+
---
|
|
2
|
+
name: permission-sync
|
|
3
|
+
description: "[PLANNED — DRAFT, not yet active] 权限同步 Skill 设计草稿。基于 reports/SYS_PERMISSION_INFO.md 基线,将页面级/按钮级权限码注册到系统权限表,并按角色分配。"
|
|
4
|
+
status: planned
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: 权限同步(permission-sync)— 草稿
|
|
8
|
+
|
|
9
|
+
> ⚠️ **本文件为设计草稿(SKILL.draft.md),未启用,不参与 AI 调度。**
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. 设计目标
|
|
14
|
+
|
|
15
|
+
新增页面后,除菜单外还需注册:
|
|
16
|
+
|
|
17
|
+
- **页面访问权限**(`mmwr:customer:list`)
|
|
18
|
+
- **按钮级权限**(`mmwr:customer:add` / `:edit` / `:remove` / `:approve` / `:export` ...)
|
|
19
|
+
- **数据权限**(可选:客户经理只看自己的客户等)
|
|
20
|
+
- **角色绑定**(哪些角色获得这些权限)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. 数据流
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
本地基线 后端接口 Skill 触发
|
|
28
|
+
──────────────────────────────────────── ────────────────────────────────── ────────────────
|
|
29
|
+
reports/SYS_PERMISSION_INFO.md ─fetch─→ GET /sys/permission/listAll
|
|
30
|
+
←compare── POST /sys/permission/batchSave
|
|
31
|
+
─upload─→ POST /sys/role/assignPermissions ─→ "同步权限"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 3. 权限码命名规范
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
{服务缩写}:{资源camelCase}:{操作}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| 操作 | 含义 | 示例 |
|
|
43
|
+
| -------- | -------------- | ------------------------------- |
|
|
44
|
+
| list | 查看列表 | `mmwr:customer:list` |
|
|
45
|
+
| detail | 查看详情 | `mmwr:customer:detail` |
|
|
46
|
+
| add | 新增 | `mmwr:customer:add` |
|
|
47
|
+
| edit | 编辑 | `mmwr:customer:edit` |
|
|
48
|
+
| remove | 删除 | `mmwr:customer:remove` |
|
|
49
|
+
| export | 导出 | `mmwr:customer:export` |
|
|
50
|
+
| import | 导入 | `mmwr:customer:import` |
|
|
51
|
+
| submit | 提交审批 | `mmwr:customer:submit` |
|
|
52
|
+
| approve | 审批通过 | `mmwr:customer:approve` |
|
|
53
|
+
| reject | 审批驳回 | `mmwr:customer:reject` |
|
|
54
|
+
| {custom} | 自定义业务操作 | `mmwr:customer:convertToFormal` |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 4. 三种工作模式
|
|
59
|
+
|
|
60
|
+
| 模式 | 触发 | 动作 |
|
|
61
|
+
| ---------- | ----------------------- | ------------------------------------------------------ |
|
|
62
|
+
| `scan` | "扫描权限码" | 从 src/views/ 扫 v-permission / hasPerm 调用,输出清单 |
|
|
63
|
+
| `register` | "注册权限码 / 同步权限" | 对比基线 → 创建缺失 + 更新描述 |
|
|
64
|
+
| `assign` | "给 XX 角色分配权限" | 选定角色 + 选定权限码 → 调 /sys/role/assignPermissions |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 5. 安全约束
|
|
69
|
+
|
|
70
|
+
- **生产环境拒绝直接 push**:检测 gatewayPath 含 prod/.com 时强制走"导出 SQL"模式
|
|
71
|
+
- **角色分配二次确认**:每次 assign 必须在 Pre-flight 中列出"角色 → 新增/移除的权限",得到用户 yes 才执行
|
|
72
|
+
- **不删除权限**:永远只新增/更新,删除走人工 SQL(防误删导致大面积失权)
|
|
73
|
+
- **审计**:每次 register/assign 输出 `reports/PERMISSION_SYNC_<YYYYMMDD>.md`,含完整调用日志和回滚 SQL
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 6. 与其他 Skill 联动
|
|
78
|
+
|
|
79
|
+
- **page-codegen**:生成 toolbar 时根据 api.md 操作集自动加 `v-permission` 指令
|
|
80
|
+
- **menu-sync**:菜单注册后提示"是否同步注册访问权限"
|
|
81
|
+
- **convention-audit**:审计按钮是否都有 v-permission
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 7. 转正前的开发任务
|
|
86
|
+
|
|
87
|
+
- [ ] 确认后端权限模型(RBAC / ABAC?是否分页面权限和按钮权限?)
|
|
88
|
+
- [ ] 数据权限是否纳入本 Skill(建议:暂不,单独 data-permission-sync)
|
|
89
|
+
- [ ] 设计 v-permission 指令的项目内实现(如 @jhlc/common-core 提供则复用)
|
|
90
|
+
- [ ] 多租户场景下的权限继承策略
|
|
91
|
+
- [ ] 与 SSO(嘉为蓝鲸)权限同步策略
|