@agile-team/wl-skills-kit 2.3.6 → 2.3.7
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
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.7] - 2026-04-29
|
|
4
|
+
|
|
5
|
+
### 🔐 permission-sync 闭环完善(数据驱动权限)
|
|
6
|
+
|
|
7
|
+
- **修正权限落地方式**:`action-attach` 模式改为在 `data.ts` 的 `ActionButtonDesc` 上加 `permission: []` 字段,而非错误的 `v-permission` 指令(`BaseToolbar` 内部已做权限拦截)
|
|
8
|
+
- **简化角色授权备份说明**:平台侧已防重复分配;AI 内部做"查旧 menuIds + 合并",不再建议额外备份
|
|
9
|
+
- **联动说明更新**:`page-codegen` 预留 `permission: []` 占位;`convention-audit` 改为审计 `data.ts` 按钮是否有非空 `permission` 字段
|
|
10
|
+
- `USAGE.md` 补充"为什么不用 v-permission 指令"说明 + Q2 权限码写法示例
|
|
11
|
+
|
|
3
12
|
## [2.3.6] - 2026-04-29
|
|
4
13
|
|
|
5
14
|
### 🔐 permission-sync Skill 正式激活
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: permission-sync
|
|
3
|
-
description: "Use when: managing roles, authorizing menus to roles, attaching action buttons (type=A) to page menus, or wiring
|
|
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
4
|
---
|
|
5
5
|
|
|
6
6
|
# Skill: 权限同步(permission-sync)
|
|
7
7
|
|
|
8
|
-
将系统的**角色 → 菜单授权 → 动作按钮 →
|
|
8
|
+
将系统的**角色 → 菜单授权 → 动作按钮 → `data.ts` 权限码字段**串成一条链路,覆盖从权限注册到代码落地的全流程。
|
|
9
9
|
|
|
10
10
|
> **与 menu-sync / dict-sync 的关系**:完全对称,统一从 `.github/skills/sync/env.local.json` 读取配置。`menu-sync` 负责页面菜单(type=M/C),`permission-sync` 负责其上的角色与动作(type=A)。
|
|
11
11
|
|
|
@@ -29,11 +29,11 @@ description: "Use when: managing roles, authorizing menus to roles, attaching ac
|
|
|
29
29
|
|
|
30
30
|
## 三种工作模式
|
|
31
31
|
|
|
32
|
-
| 模式 | 触发关键词
|
|
33
|
-
| ---------------- |
|
|
34
|
-
| `role-manage` | 创建角色 / 角色管理 / 列出角色
|
|
35
|
-
| `role-assign` | 角色授权 / 给 XX 角色分配菜单
|
|
36
|
-
| `action-attach` | 挂动作 / 给页面加按钮 / 注册权限码 |
|
|
32
|
+
| 模式 | 触发关键词 | 动作 |
|
|
33
|
+
| ---------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------- |
|
|
34
|
+
| `role-manage` | 创建角色 / 角色管理 / 列出角色 | 查询/新增角色(按 `code` 去重,幂等) |
|
|
35
|
+
| `role-assign` | 角色授权 / 给 XX 角色分配菜单 | 查询全量可授权菜单 → 选定 menuIds → 调用 `saveRoleMenus` 批量分配 |
|
|
36
|
+
| `action-attach` | 挂动作 / 给页面加按钮 / 注册权限码 | 注册 type=A 动作到后端 + 在 `data.ts` 对应按钮的 `ActionButtonDesc` 加 `permission` 字段,形成完整闭环 |
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
@@ -141,18 +141,37 @@ permission-sync 通过 6 个 MCP 工具完成所有操作(无需手动 fetch
|
|
|
141
141
|
}
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
#### 3.2 在
|
|
144
|
+
#### 3.2 在 `data.ts` 中给对应按钮加 `permission` 字段
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
本项目使用 `@jhlc/common-core` 的 `ActionButtonDesc` 类型,`BaseToolbar` 内部根据 `permission` 字段做权限拦截——**这是数据驱动方式,无需修改模板,无需 `v-permission` 指令**。
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
148
|
+
由于 page-codegen 保证 `data.ts` 结构一致,toolbar 按钮配置始终在 `data.ts` 内。注册动作后,AI 找到对应按钮对象,添加 `permission` 数组字段:
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
// data.ts — 工具栏按钮配置(ActionButtonDesc[])
|
|
152
|
+
{
|
|
153
|
+
name: 'add',
|
|
154
|
+
label: '新增',
|
|
155
|
+
type: 'primary',
|
|
156
|
+
permission: ['customer_add'], // ← 新增此字段
|
|
157
|
+
onClick: () => modalRef.value?.open()
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'edit',
|
|
161
|
+
label: '编辑',
|
|
162
|
+
permission: ['customer_edit'], // ← 新增此字段
|
|
163
|
+
onClick: (row: any) => modalRef.value?.edit(row.id)
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'remove',
|
|
167
|
+
label: '删除',
|
|
168
|
+
type: 'danger',
|
|
169
|
+
permission: ['customer_remove'], // ← 新增此字段
|
|
170
|
+
onClick: (row: any) => handleRemove(row.id)
|
|
171
|
+
},
|
|
153
172
|
```
|
|
154
173
|
|
|
155
|
-
|
|
174
|
+
`permission` 值与 §3.1 中注册到后端的动作 `permission` 字段**完全一致**,直接复制使用。`BaseToolbar` 内部读取当前用户权限列表(由登录态注入),自动控制按钮显示/隐藏——无需任何额外处理。
|
|
156
175
|
|
|
157
176
|
---
|
|
158
177
|
|
|
@@ -182,9 +201,9 @@ permission-sync 通过 6 个 MCP 工具完成所有操作(无需手动 fetch
|
|
|
182
201
|
## 5. 安全约束(强制)
|
|
183
202
|
|
|
184
203
|
- ✅ **生产环境拒绝直接 push**:`gatewayPath` 含 `prod` / `.com` 时切换为"导出 SQL/JSON"模式,不直接调接口
|
|
185
|
-
- ✅
|
|
204
|
+
- ✅ **角色分配全量覆盖处理**:`role-assign` 模式下,AI 内部自动"查旧 menuIds + 合并新增"再调用,防止漏带原有菜单。平台侧已防重复分配,无需额外备份机制
|
|
186
205
|
- ✅ **仅新增不删除**:所有 upsert 工具按唯一键去重跳过;删除走人工 SQL(防误删导致大面积失权)
|
|
187
|
-
- ✅ **审计报告**:每次执行后,在 `reports/PERMISSION_SYNC_<YYYYMMDD>.md`
|
|
206
|
+
- ✅ **审计报告**:每次执行后,在 `reports/PERMISSION_SYNC_<YYYYMMDD>.md` 追加日志(角色/动作变更、接口调用、data.ts 修改行位置)
|
|
188
207
|
|
|
189
208
|
---
|
|
190
209
|
|
|
@@ -210,10 +229,10 @@ Authorization: Bearer <token>
|
|
|
210
229
|
|
|
211
230
|
## 7. 与其他 Skill 联动
|
|
212
231
|
|
|
213
|
-
- **page-codegen**:生成 toolbar
|
|
232
|
+
- **page-codegen**:生成 toolbar 按钮时,若 api.md 中声明了操作集,在 `data.ts` 的 `ActionButtonDesc` 中预留 `permission: []`(空数组占位),等待 permission-sync 后续填入真实权限码
|
|
214
233
|
- **menu-sync**:菜单注册成功后,AI 应主动询问"是否给该页面挂动作?" → 触发 action-attach
|
|
215
|
-
- **convention-audit
|
|
216
|
-
- **prototype-scan
|
|
234
|
+
- **convention-audit**:审计 `data.ts` 工具栏按钮是否都设置了非空的 `permission` 字段(字段缺失或为 `[]` 视为偏差)
|
|
235
|
+
- **prototype-scan**:扫描原型时识别按钮操作 → 写入 `reports/SYS_PERMISSION_INFO.md` 基线
|
|
217
236
|
|
|
218
237
|
---
|
|
219
238
|
|
|
@@ -38,18 +38,24 @@ AI : 调用 wls_role_assign_menus
|
|
|
38
38
|
✅ 角色授权成功
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
### 3. 给页面挂动作 +
|
|
41
|
+
### 3. 给页面挂动作 + 加权限字段(数据驱动,无需改模板)
|
|
42
42
|
|
|
43
43
|
```
|
|
44
44
|
用户:给『客户档案』页面加上 新增/编辑/删除 三个按钮
|
|
45
45
|
AI : [触发 permission-sync]
|
|
46
46
|
[Pre-flight] 模式 = action-attach
|
|
47
47
|
1. wls_action_query 查询已有动作 → 无
|
|
48
|
-
2. wls_action_upsert
|
|
49
|
-
3.
|
|
48
|
+
2. wls_action_upsert 注册到后端:customer_add / customer_edit / customer_remove
|
|
49
|
+
3. 在 src/views/customer/list/data.ts 找到工具栏按钮配置,
|
|
50
|
+
给每个对应按钮的 ActionButtonDesc 添加 permission 字段:
|
|
51
|
+
{ name: 'add', label: '新增', permission: ['customer_add'], ... }
|
|
50
52
|
✅ 完成(已写报告 reports/PERMISSION_SYNC_20260429.md)
|
|
51
53
|
```
|
|
52
54
|
|
|
55
|
+
> **为什么不用 v-permission 指令?**
|
|
56
|
+
> 本项目 `BaseToolbar` 内部读取 `ActionButtonDesc.permission` 字段做权限控制,
|
|
57
|
+
> 只需在 `data.ts` 的按钮配置对象里加字段,不需要改 `.vue` 模板,也不依赖全局指令注册。
|
|
58
|
+
|
|
53
59
|
---
|
|
54
60
|
|
|
55
61
|
## 常见问题
|
|
@@ -60,13 +66,21 @@ AI : [触发 permission-sync]
|
|
|
60
66
|
|
|
61
67
|
**正确做法**:先查角色现有菜单 → 合并新菜单 → 一起传。
|
|
62
68
|
|
|
63
|
-
### Q2
|
|
69
|
+
### Q2:权限码写在 `data.ts` 哪里?不需要改模板吗?
|
|
70
|
+
|
|
71
|
+
对,**不需要改模板(`.vue` 文件)**。`BaseToolbar` 从 `ActionButtonDesc` 的 `permission` 字段读取权限码,在渲染时内部做拦截,标准结构如下:
|
|
64
72
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
73
|
+
```ts
|
|
74
|
+
// data.ts
|
|
75
|
+
{
|
|
76
|
+
name: 'edit',
|
|
77
|
+
label: '编辑',
|
|
78
|
+
permission: ['qmmcProcessCodeMain_update'], // ← 就加这一行
|
|
79
|
+
onClick: (row: any) => modalRef.value?.edit(row.id)
|
|
80
|
+
}
|
|
68
81
|
```
|
|
69
|
-
|
|
82
|
+
|
|
83
|
+
`permission` 是数组,支持多权限码 OR 逻辑(有其中任意一个权限码即显示按钮)。
|
|
70
84
|
|
|
71
85
|
### Q3:权限码用短形式还是长形式?
|
|
72
86
|
|