@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.
- package/CHANGELOG.md +44 -0
- package/README.md +16 -1
- package/bin/wl-skills.js +1 -1
- package/files/.github/copilot-instructions.md +12 -0
- package/files/.github/guides/architecture.md +1 -1
- package/files/.github/skills/_best-practices.md +220 -0
- package/files/.github/skills/_registry.md +23 -19
- package/files/.github/skills/sync/_mcp-guardrail.md +109 -0
- package/files/.github/skills/sync/dict-sync/SKILL.md +208 -451
- package/files/.github/skills/sync/menu-sync/SKILL.md +34 -27
- package/files/.github/skills/sync/menu-sync/USAGE.md +17 -11
- package/files/.github/skills/sync/permission-sync/SKILL.md +240 -258
- package/mcp/api/client.js +83 -76
- package/mcp/server.js +21 -0
- package/mcp/tools/dictSync.js +6 -1
- package/mcp/tools/menuSync.js +11 -0
- package/package.json +5 -4
|
@@ -1,258 +1,240 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: permission-sync
|
|
3
|
-
description: "Use when: managing roles, authorizing menus to roles, attaching action buttons (type=A) to page menus, or wiring permission field in data.ts toolbar config. Triggers on: 创建角色, 角色管理, 角色授权, 给角色分配菜单, 挂动作, 添加动作按钮, 同步权限, 权限码注册, role assign, permission sync."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Skill: 权限同步(permission-sync)
|
|
7
|
-
|
|
8
|
-
将系统的**角色 → 菜单授权 → 动作按钮 → `data.ts` 权限码字段**串成一条链路,覆盖从权限注册到代码落地的全流程。
|
|
9
|
-
|
|
10
|
-
> **与 menu-sync / dict-sync 的关系**:完全对称,统一从 `.github/skills/sync/env.local.json` 读取配置。`menu-sync` 负责页面菜单(type=M/C),`permission-sync` 负责其上的角色与动作(type=A)。
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 配置(统一配置文件,复用 menu-sync 的配置)
|
|
15
|
-
|
|
16
|
-
读取 `.github/skills/sync/env.local.json`:
|
|
17
|
-
|
|
18
|
-
```json
|
|
19
|
-
{
|
|
20
|
-
"gatewayPath": "http://你的网关地址:端口",
|
|
21
|
-
"sysAppNo": "应用编码",
|
|
22
|
-
"token": "Bearer Token(不含 bearer 前缀)"
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**permission-sync 不需要额外字段**——角色和动作的 `parentId` 由 AI 在执行流程中通过查询接口动态获取。
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## 三种工作模式
|
|
31
|
-
|
|
32
|
-
| 模式 | 触发关键词 | 动作 |
|
|
33
|
-
| ---------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
34
|
-
| `role-manage` | 创建角色 / 角色管理 / 列出角色 | 查询/新增角色(按 `code` 去重,幂等) |
|
|
35
|
-
| `role-assign` | 角色授权 / 给 XX 角色分配菜单 | 查询全量可授权菜单 → 选定 menuIds → 调用 `saveRoleMenus` 批量分配 |
|
|
36
|
-
| `action-attach` | 挂动作 / 给页面加按钮 / 注册权限码 | 注册 type=A 动作到后端 + 在 `data.ts` 对应按钮的 `ActionButtonDesc` 加 `permission` 字段,形成完整闭环 |
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Pre-flight 声明(执行前必须输出)
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
🚀 已触发技能 permission-sync/SKILL.md → 权限同步
|
|
44
|
-
✅ 已读取 skills/sync/env.local.json → 网关地址、token、sysAppNo
|
|
45
|
-
✅ 操作模式:{role-manage / role-assign / action-attach}
|
|
46
|
-
✅ 目标:{角色名 / roleId / 页面菜单 menuId 与权限码列表}
|
|
47
|
-
✅ 安全检查:{生产环境拒绝 / 角色分配二次确认 / 仅新增不删除}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
##
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
1.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
| `
|
|
193
|
-
| `
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
- ✅
|
|
204
|
-
- ✅
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
```md
|
|
242
|
-
# 权限同步报告 2026-04-29
|
|
243
|
-
|
|
244
|
-
## role-manage
|
|
245
|
-
- ✅ 新增角色:测试角色(QA)/ test_qa
|
|
246
|
-
|
|
247
|
-
## role-assign
|
|
248
|
-
- ✅ 角色 default_role 已分配 5 个菜单:[id1, id2, ...]
|
|
249
|
-
- ⚠️ 替换原有 7 个菜单(已确认)
|
|
250
|
-
|
|
251
|
-
## action-attach
|
|
252
|
-
- ✅ customer 页面新增 4 个动作:add/edit/remove/export
|
|
253
|
-
- ✅ 代码已加 v-permission(src/views/customer/list/index.vue 第 32-45 行)
|
|
254
|
-
|
|
255
|
-
## 回滚提示
|
|
256
|
-
- 角色分配可通过重新调用 saveRoleMenus 传旧 menuIds 恢复
|
|
257
|
-
- 新增的角色/动作建议通过后端管理界面手动删除(防止误删生产数据)
|
|
258
|
-
```
|
|
1
|
+
---
|
|
2
|
+
name: permission-sync
|
|
3
|
+
description: "Use when: managing roles, authorizing menus to roles, attaching action buttons (type=A) to page menus, or wiring permission field in data.ts toolbar config. Triggers on: 创建角色, 角色管理, 角色授权, 给角色分配菜单, 挂动作, 添加动作按钮, 同步权限, 权限码注册, role assign, permission sync."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: 权限同步(permission-sync)
|
|
7
|
+
|
|
8
|
+
将系统的**角色 → 菜单授权 → 动作按钮 → `data.ts` 权限码字段**串成一条链路,覆盖从权限注册到代码落地的全流程。
|
|
9
|
+
|
|
10
|
+
> **与 menu-sync / dict-sync 的关系**:完全对称,统一从 `.github/skills/sync/env.local.json` 读取配置。`menu-sync` 负责页面菜单(type=M/C),`permission-sync` 负责其上的角色与动作(type=A)。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 配置(统一配置文件,复用 menu-sync 的配置)
|
|
15
|
+
|
|
16
|
+
读取 `.github/skills/sync/env.local.json`:
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"gatewayPath": "http://你的网关地址:端口",
|
|
21
|
+
"sysAppNo": "应用编码",
|
|
22
|
+
"token": "Bearer Token(不含 bearer 前缀)"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**permission-sync 不需要额外字段**——角色和动作的 `parentId` 由 AI 在执行流程中通过查询接口动态获取。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 三种工作模式
|
|
31
|
+
|
|
32
|
+
| 模式 | 触发关键词 | 动作 |
|
|
33
|
+
| ---------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
34
|
+
| `role-manage` | 创建角色 / 角色管理 / 列出角色 | 查询/新增角色(按 `code` 去重,幂等) |
|
|
35
|
+
| `role-assign` | 角色授权 / 给 XX 角色分配菜单 | 查询全量可授权菜单 → 选定 menuIds → 调用 `saveRoleMenus` 批量分配 |
|
|
36
|
+
| `action-attach` | 挂动作 / 给页面加按钮 / 注册权限码 | 注册 type=A 动作到后端 + 在 `data.ts` 对应按钮的 `ActionButtonDesc` 加 `permission` 字段,形成完整闭环 |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Pre-flight 声明(执行前必须输出)
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
🚀 已触发技能 permission-sync/SKILL.md → 权限同步
|
|
44
|
+
✅ 已读取 skills/sync/env.local.json → 网关地址、token、sysAppNo
|
|
45
|
+
✅ 操作模式:{role-manage / role-assign / action-attach}
|
|
46
|
+
✅ 目标:{角色名 / roleId / 页面菜单 menuId 与权限码列表}
|
|
47
|
+
✅ 安全检查:{生产环境拒绝 / 角色分配二次确认 / 仅新增不删除}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## ⚠️ 必读公共护栏
|
|
53
|
+
|
|
54
|
+
本 Skill 遵守 `../_mcp-guardrail.md`(MCP 调用纪律与自愈闭环)。AI 首次执行 sync 类任务时先 `read_file` 加载它。
|
|
55
|
+
|
|
56
|
+
本 Skill 使用的 MCP 工具:`wls_role_query` / `wls_role_upsert` / `wls_assignable_menus_query` / `wls_role_assign_menus` / `wls_action_query` / `wls_action_upsert`。调用失败时按 guardrail §2 剧本引导用户完善 `env.local.json` 后重试,**不得用 curl/手拼 HTTP 绕开 MCP**。
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## MCP 工具调用规范
|
|
61
|
+
|
|
62
|
+
permission-sync 通过 6 个 MCP 工具完成所有操作(无需手动 fetch):
|
|
63
|
+
|
|
64
|
+
| 工具 | 用途 |
|
|
65
|
+
| ----------------------------- | ------------------------------------------ |
|
|
66
|
+
| `wls_role_query` | 查询角色列表(带分页) |
|
|
67
|
+
| `wls_role_upsert` | 批量新增角色(按 code 去重) |
|
|
68
|
+
| `wls_assignable_menus_query` | 查询全量可授权菜单 |
|
|
69
|
+
| `wls_role_assign_menus` | 给角色批量分配菜单(**全量覆盖**,注意!) |
|
|
70
|
+
| `wls_action_query` | 查询页面菜单下的动作(type=A) |
|
|
71
|
+
| `wls_action_upsert` | 批量新增动作(按 permission 去重) |
|
|
72
|
+
|
|
73
|
+
> 上表 6 个工具覆盖所有场景,**不得以任何理由跳过**。§6 仅为记录 MCP 内部调用的底层接口,供后端/运维联调参考,AI 禁止据此自行发起 HTTP 调用。
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 1. role-manage(角色管理)
|
|
78
|
+
|
|
79
|
+
### 输入示例
|
|
80
|
+
|
|
81
|
+
> "创建一个测试角色,code 是 test_qa,描述:QA 测试用"
|
|
82
|
+
|
|
83
|
+
### 流程
|
|
84
|
+
|
|
85
|
+
1. AI 调用 `wls_role_query` 检查 `code=test_qa` 是否已存在
|
|
86
|
+
2. 若不存在,调用 `wls_role_upsert`:
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"items": [
|
|
90
|
+
{ "roleName": "测试角色(QA)", "code": "test_qa", "configDesc": "QA 测试用" }
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
3. 输出表格:角色名 / code / 状态(✅ 创建成功 / ⏭ 已存在)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 2. role-assign(角色授权)
|
|
99
|
+
|
|
100
|
+
### 输入示例
|
|
101
|
+
|
|
102
|
+
> "给『档案普通人员』角色挂上『客户档案』『客户申请』两个菜单"
|
|
103
|
+
|
|
104
|
+
### 流程
|
|
105
|
+
|
|
106
|
+
1. **查询角色 id**:`wls_role_query` → 找到 `roleName="档案普通人员"` 对应的 `id`
|
|
107
|
+
2. **查询可授权菜单**:`wls_assignable_menus_query` → 获取全部菜单清单
|
|
108
|
+
3. **匹配 menuIds**:在结果中找到「客户档案」「客户申请」对应的 menu id
|
|
109
|
+
4. **⚠️ 二次确认**:在 Pre-flight 中列出"将给角色 X 分配菜单 [A, B]",得到用户 yes 才执行
|
|
110
|
+
5. **调用授权**:`wls_role_assign_menus`
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"roleId": "VERUFQ77SS0BCCE6GJVU21IFEP1EKFBQ",
|
|
114
|
+
"menuIds": ["2049380552157999105", "2049388746804604929"]
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### ⚠️ 全量覆盖式陷阱
|
|
119
|
+
|
|
120
|
+
后端 `saveRoleMenus` 是**全量覆盖**:
|
|
121
|
+
- 传 `[A, B]` 后,原先 `[A, B, C]` 中的 C 会被移除
|
|
122
|
+
- AI 在执行前**必须先告知用户**:"此操作会替换该角色全部菜单,原有未列出的将被移除"
|
|
123
|
+
- 若用户只是想"追加 C",AI 应自行合并:取出旧 menuIds + 新增的 → 一起传
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 3. action-attach(挂动作 + 加 v-permission)
|
|
128
|
+
|
|
129
|
+
### 输入示例
|
|
130
|
+
|
|
131
|
+
> "给『客户档案』页面挂上 新增/编辑/删除/导出 四个动作按钮"
|
|
132
|
+
|
|
133
|
+
### 流程
|
|
134
|
+
|
|
135
|
+
#### 3.1 服务端注册动作
|
|
136
|
+
|
|
137
|
+
1. **查询页面菜单 id**:先用 `wls_menu_query` 或 `wls_assignable_menus_query` 找到「客户档案」页面菜单 id(type=C)
|
|
138
|
+
2. **查询已有动作**:`wls_action_query({ menuId: <页面id> })` 看哪些已存在
|
|
139
|
+
3. **批量新增**:`wls_action_upsert`
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"parentId": "<页面菜单 id>",
|
|
143
|
+
"items": [
|
|
144
|
+
{ "menuName": "新增", "permission": "customer_add", "orderNum": 1 },
|
|
145
|
+
{ "menuName": "编辑", "permission": "customer_edit", "orderNum": 2 },
|
|
146
|
+
{ "menuName": "删除", "permission": "customer_remove", "orderNum": 3 },
|
|
147
|
+
{ "menuName": "导出", "permission": "customer_export", "orderNum": 4 }
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### 3.2 在 `data.ts` 中给对应按钮加 `permission` 字段
|
|
153
|
+
|
|
154
|
+
本项目使用 `@jhlc/common-core` 的 `ActionButtonDesc` 类型,`BaseToolbar` 内部根据 `permission` 字段做权限拦截——**这是数据驱动方式,无需修改模板,无需 `v-permission` 指令**。
|
|
155
|
+
|
|
156
|
+
由于 page-codegen 保证 `data.ts` 结构一致,toolbar 按钮配置始终在 `data.ts` 内。注册动作后,AI 找到对应按钮对象,添加 `permission` 数组字段:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
// data.ts — 工具栏按钮配置(ActionButtonDesc[])
|
|
160
|
+
{
|
|
161
|
+
name: 'add',
|
|
162
|
+
label: '新增',
|
|
163
|
+
type: 'primary',
|
|
164
|
+
permission: ['customer_add'], // ← 新增此字段
|
|
165
|
+
onClick: () => modalRef.value?.open()
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: 'edit',
|
|
169
|
+
label: '编辑',
|
|
170
|
+
permission: ['customer_edit'], // ← 新增此字段
|
|
171
|
+
onClick: (row: any) => modalRef.value?.edit(row.id)
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: 'remove',
|
|
175
|
+
label: '删除',
|
|
176
|
+
type: 'danger',
|
|
177
|
+
permission: ['customer_remove'], // ← 新增此字段
|
|
178
|
+
onClick: (row: any) => handleRemove(row.id)
|
|
179
|
+
},
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
`permission` 值与 §3.1 中注册到后端的动作 `permission` 字段**完全一致**,直接复制使用。`BaseToolbar` 内部读取当前用户权限列表(由登录态注入),自动控制按钮显示/隐藏——无需任何额外处理。
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 4. 权限码命名规范(项目内统一)
|
|
187
|
+
|
|
188
|
+
两种风格,优先沿用项目现有风格;无既定风格时用短形式:
|
|
189
|
+
|
|
190
|
+
| 风格 | 格式 | 示例 |
|
|
191
|
+
| --- | --- | --- |
|
|
192
|
+
| 短形式(主流)| `{资源}_{动作}` | `customer_add` / `customer_edit` / `customer_remove` |
|
|
193
|
+
| 长形式(通用)| `{模块}:{资源}:{动作}` | `mmwr:customer:add` |
|
|
194
|
+
|
|
195
|
+
常用动作:`add` / `edit` / `remove` / `export` / `import` / `submit` / `approve` / `reject`。自定义动作驼峰命名(如 `customer_convertToFormal`)。
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 5. 安全约束(强制)
|
|
200
|
+
|
|
201
|
+
- ✅ **生产环境拒绝直接 push**:`gatewayPath` 含 `prod` / `.com` 时切换为"导出 SQL/JSON"模式,不直接调接口
|
|
202
|
+
- ✅ **角色分配全量覆盖处理**:`role-assign` 模式下,AI 内部自动"查旧 menuIds + 合并新增"再调用,防止漏带原有菜单。平台侧已防重复分配,无需额外备份机制
|
|
203
|
+
- ✅ **仅新增不删除**:所有 upsert 工具按唯一键去重跳过;删除走人工 SQL(防误删导致大面积失权)
|
|
204
|
+
- ✅ **审计报告**:每次执行后,在 `reports/PERMISSION_SYNC_<YYYYMMDD>.md` 追加日志(角色/动作变更、接口调用、data.ts 修改行位置)
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 6. 后端接口参考(MCP 内部实现,AI 不得调用)
|
|
209
|
+
|
|
210
|
+
> 本节仅供后端联调 / 运维排查 / kit 维护者参考。**AI 不得据此自行发起 HTTP 请求。**
|
|
211
|
+
|
|
212
|
+
| 操作 | 方法 | 路径 |
|
|
213
|
+
| --- | --- | --- |
|
|
214
|
+
| 查询角色列表 | GET | `/system/role/list?current=1&size=100` |
|
|
215
|
+
| 新增角色 | POST | `/system/role/save` |
|
|
216
|
+
| 查询可授权菜单 | GET | `/system/menu/get/subMenu?size=999` |
|
|
217
|
+
| 角色分配菜单 | POST | `/system/role/saveRoleMenus`(`menuIds` 逗号字符串)|
|
|
218
|
+
| 查询页面下动作 | GET | `/system/menu/children?menuId=X` |
|
|
219
|
+
| 新增动作 type=A | POST | `/system/menu/save` |
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 7. 与其他 Skill 联动
|
|
224
|
+
|
|
225
|
+
- **page-codegen**:生成 toolbar 按钮时,若 api.md 中声明了操作集,在 `data.ts` 的 `ActionButtonDesc` 中预留 `permission: []`(空数组占位),等待 permission-sync 后续填入真实权限码
|
|
226
|
+
- **menu-sync**:菜单注册成功后,AI 应主动询问"是否给该页面挂动作?" → 触发 action-attach
|
|
227
|
+
- **convention-audit**:审计 `data.ts` 工具栏按钮是否都设置了非空的 `permission` 字段(字段缺失或为 `[]` 视为偏差)
|
|
228
|
+
- **prototype-scan**:扫描原型时识别按钮操作 → 写入 `reports/SYS_PERMISSION_INFO.md` 基线
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## 8. 报告输出(reports/PERMISSION_SYNC_<日期>.md)
|
|
233
|
+
|
|
234
|
+
每次执行在 `.github/reports/PERMISSION_SYNC_YYYYMMDD.md` 追加:模式(role-manage/role-assign/action-attach)、变更摘要(新增/已存在/失败)、data.ts 修改行位置、回滚提示。
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 9. MCP 不可用或调用失败时怎么办
|
|
239
|
+
|
|
240
|
+
见 `../_mcp-guardrail.md` §2 自愈闭环剧本。**原则**:先帮用户完善 `env.local.json` 里的 token / gatewayPath,重试 MCP 工具。**绝不允许** AI 用 curl/PowerShell/fetch 绕开 MCP 手拼 HTTP。
|