@lark-apaas/coding-miaoda-sandbox-skills 0.1.34 → 0.1.36
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.
|
@@ -217,17 +217,17 @@ CREATE TABLE IF NOT EXISTS authz_role_permissions (
|
|
|
217
217
|
|
|
218
218
|
```sql
|
|
219
219
|
-- 按「权限点位定义」表
|
|
220
|
-
INSERT INTO authz_permissions (action, subject, description) VALUES
|
|
221
|
-
('read', 'Task', '查看任务'),
|
|
222
|
-
('create', 'Task', '创建任务'),
|
|
223
|
-
('update', 'Task', '编辑任务'),
|
|
224
|
-
('delete', 'Task', '删除任务');
|
|
220
|
+
INSERT INTO authz_permissions (action, subject, description, creator) VALUES
|
|
221
|
+
('read', 'Task', '查看任务', ROW('<当前妙搭 user_id>')::user_profile),
|
|
222
|
+
('create', 'Task', '创建任务', ROW('<当前妙搭 user_id>')::user_profile),
|
|
223
|
+
('update', 'Task', '编辑任务', ROW('<当前妙搭 user_id>')::user_profile),
|
|
224
|
+
('delete', 'Task', '删除任务', ROW('<当前妙搭 user_id>')::user_profile);
|
|
225
225
|
|
|
226
226
|
-- 按「角色-点位初始映射」表
|
|
227
|
-
INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
|
|
228
|
-
('admin', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task')),
|
|
229
|
-
('admin', (SELECT id FROM authz_permissions WHERE action='create' AND subject='Task')),
|
|
230
|
-
('member', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task'));
|
|
227
|
+
INSERT INTO authz_role_permissions (role_key, permission_id, creator) VALUES
|
|
228
|
+
('admin', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task'), ROW('<当前妙搭 user_id>')::user_profile),
|
|
229
|
+
('admin', (SELECT id FROM authz_permissions WHERE action='create' AND subject='Task'), ROW('<当前妙搭 user_id>')::user_profile),
|
|
230
|
+
('member', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task'), ROW('<当前妙搭 user_id>')::user_profile);
|
|
231
231
|
```
|
|
232
232
|
|
|
233
233
|
> 以上 SQL 仅为示例,实际数据根据权限设计方案生成。
|
|
@@ -238,12 +238,12 @@ INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
|
|
|
238
238
|
|
|
239
239
|
```sql
|
|
240
240
|
-- 1. 新增点位定义(authz_permissions 表)
|
|
241
|
-
INSERT INTO authz_permissions (action, subject, description) VALUES
|
|
242
|
-
('export', 'Task', '导出任务');
|
|
241
|
+
INSERT INTO authz_permissions (action, subject, description, creator) VALUES
|
|
242
|
+
('export', 'Task', '导出任务', ROW('<当前妙搭 user_id>')::user_profile);
|
|
243
243
|
|
|
244
244
|
-- 2. 为需要该权限的角色添加映射(authz_role_permissions 表)
|
|
245
|
-
INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
|
|
246
|
-
('admin', (SELECT id FROM authz_permissions WHERE action='export' AND subject='Task'));
|
|
245
|
+
INSERT INTO authz_role_permissions (role_key, permission_id, creator) VALUES
|
|
246
|
+
('admin', (SELECT id FROM authz_permissions WHERE action='export' AND subject='Task'), ROW('<当前妙搭 user_id>')::user_profile);
|
|
247
247
|
```
|
|
248
248
|
|
|
249
249
|
> **必须同步**:
|
|
@@ -218,18 +218,24 @@ lark-cli apps +role-member-remove --app-id "$app_id" --role-id <role_id> --all -
|
|
|
218
218
|
按权限设计方案的「权限点位定义」和「角色-点位初始映射」表预填:
|
|
219
219
|
|
|
220
220
|
```sql
|
|
221
|
-
--
|
|
222
|
-
INSERT INTO authz_permissions (action, subject, description)
|
|
221
|
+
-- 权限点位
|
|
222
|
+
INSERT INTO authz_permissions (action, subject, description, creator)
|
|
223
|
+
SELECT action, subject, description, ROW('<当前妙搭 user_id>')::user_profile
|
|
224
|
+
FROM (VALUES
|
|
223
225
|
('read', 'Task', '查看任务'),
|
|
224
226
|
('create', 'Task', '创建任务'),
|
|
225
227
|
('update', 'Task', '编辑任务'),
|
|
226
|
-
('delete', 'Task', '删除任务')
|
|
228
|
+
('delete', 'Task', '删除任务')
|
|
229
|
+
) AS v(action, subject, description);
|
|
227
230
|
|
|
228
|
-
--
|
|
229
|
-
INSERT INTO authz_role_permissions (role_key, permission_id)
|
|
231
|
+
-- 角色-点位映射
|
|
232
|
+
INSERT INTO authz_role_permissions (role_key, permission_id, creator)
|
|
233
|
+
SELECT role_key, permission_id, ROW('<当前妙搭 user_id>')::user_profile
|
|
234
|
+
FROM (VALUES
|
|
230
235
|
('admin', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task')),
|
|
231
236
|
('admin', (SELECT id FROM authz_permissions WHERE action='create' AND subject='Task')),
|
|
232
|
-
('member', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task'))
|
|
237
|
+
('member', (SELECT id FROM authz_permissions WHERE action='read' AND subject='Task'))
|
|
238
|
+
) AS v(role_key, permission_id);
|
|
233
239
|
```
|
|
234
240
|
|
|
235
241
|
> 以上 SQL 仅为示例,实际数据根据权限设计方案生成。
|
|
@@ -239,13 +245,13 @@ INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
|
|
|
239
245
|
新功能上线时,新增点位 + 初始映射 + 同步鉴权代码:
|
|
240
246
|
|
|
241
247
|
```sql
|
|
242
|
-
--
|
|
243
|
-
INSERT INTO authz_permissions (action, subject, description) VALUES
|
|
244
|
-
('export', 'Task', '导出任务');
|
|
248
|
+
-- 新增权限点位
|
|
249
|
+
INSERT INTO authz_permissions (action, subject, description, creator) VALUES
|
|
250
|
+
('export', 'Task', '导出任务', ROW('<当前妙搭 user_id>')::user_profile);
|
|
245
251
|
|
|
246
|
-
--
|
|
247
|
-
INSERT INTO authz_role_permissions (role_key, permission_id) VALUES
|
|
248
|
-
('admin', (SELECT id FROM authz_permissions WHERE action='export' AND subject='Task'));
|
|
252
|
+
-- 新增角色-点位映射
|
|
253
|
+
INSERT INTO authz_role_permissions (role_key, permission_id, creator) VALUES
|
|
254
|
+
('admin', (SELECT id FROM authz_permissions WHERE action='export' AND subject='Task'), ROW('<当前妙搭 user_id>')::user_profile);
|
|
249
255
|
```
|
|
250
256
|
|
|
251
257
|
> **必须同步**:
|
|
@@ -9,54 +9,24 @@ gate-tools:
|
|
|
9
9
|
subagent_type: E2E
|
|
10
10
|
---
|
|
11
11
|
{% if visualCheckEnabled %}
|
|
12
|
-
#
|
|
13
|
-
|
|
14
|
-
静态页面检查和功能验收使用不同工具。向用户只说「页面检查」或「用浏览器操作验证」,不要解释内部工具或 agent 名称。
|
|
15
|
-
|
|
16
|
-
## 决策规则
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
改完代码或用户想确认应用是否正常
|
|
20
|
-
├─ 明确要求验证后端接口 / API / 请求响应 → api_request
|
|
21
|
-
├─ 满足下方「派 E2E 的条件」任一条 → Task(subagent_type="E2E")
|
|
22
|
-
└─ 其他情况(默认)→ 只对改动涉及的路由调用 visual_check,全部通过即交付
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
- **静态视觉检查**:调用 `visual_check`,一条路由一次调用;互不依赖的路由可同时发起。它只检查指定路由的最终静态画面,不用来点击、填写、提交或验证接口。
|
|
26
|
-
- **功能验收**:派 `Task(subagent_type="E2E")` 时一律按标准语义执行,调用时不要额外指定运行方式。
|
|
27
|
-
- **接口验收**:只在用户明确要检查接口、API、请求或响应时调用 `api_request`;完成浏览器验收后不追加接口调用。
|
|
28
|
-
- **E2E 不可用时(Legacy)**:Task 的 `subagent_type` 没有 E2E 选项时,交互、业务、数据和网络验收改用 `api_request`、读代码和读运行时日志;不要尝试派 E2E。静态视觉仍使用 `visual_check`。
|
|
12
|
+
# 浏览器验收(E2E)用法
|
|
29
13
|
|
|
30
|
-
|
|
14
|
+
向用户只说「用浏览器操作验证」,不要解释内部工具或 agent 名称。
|
|
31
15
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- 用户在本轮明确要求验证某个功能或流程;
|
|
35
|
-
- 本轮改了提交、保存、删除这类写操作,或改了权限逻辑;
|
|
36
|
-
- visual_check 发现了视觉以外的问题,例如数据为空或出现报错弹窗。
|
|
16
|
+
- 派 `Task(subagent_type="E2E")` 时一律按标准语义执行,调用时不要额外指定运行方式。
|
|
17
|
+
- E2E 结束后不追加 `api_request` 调用。
|
|
37
18
|
|
|
38
19
|
## 调用方式
|
|
39
20
|
|
|
40
|
-
```js
|
|
41
|
-
visual_check({
|
|
42
|
-
relative_path: "<路由相对路径>",
|
|
43
|
-
})
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
`relative_path` 只填一个路由。一条路由检查完成后再根据结果决定是否修复;多个互不依赖的路由可以分别同时调用。
|
|
47
|
-
|
|
48
21
|
```js
|
|
49
22
|
Task({
|
|
50
23
|
subagent_type: "E2E",
|
|
51
|
-
{
|
|
52
|
-
agent_options: { test_plan_file_path: ".spark/e2e-test/standard/<语义名>.json"{% if e2eStructuredCases %}, retest_all: true{% endif %} },
|
|
53
|
-
{% endif %}
|
|
24
|
+
agent_options: { test_plan_file_path: ".spark/e2e-test/standard/<语义名>.json", retest_all: true },
|
|
54
25
|
description: "验收<功能名称>",
|
|
55
26
|
prompt: "执行<具体交互或业务闭环>,断言<可观察终态>。",
|
|
56
27
|
})
|
|
57
28
|
```
|
|
58
29
|
|
|
59
|
-
{% if e2eSemanticPlan %}
|
|
60
30
|
### 验收计划文件
|
|
61
31
|
|
|
62
32
|
每次派发都必须带 `agent_options.test_plan_file_path`,不传不执行。先列出 `.spark/e2e-test/standard/` 目录并**读**可能覆盖本需求的那份;同需求有变化就编辑那份,换功能或页面则新建。计划只包含交互、业务、数据和网络的可观察终态;`prompt` 只说明本轮执行范围和 Case 编号。
|
|
@@ -66,15 +36,12 @@ Task({
|
|
|
66
36
|
```json
|
|
67
37
|
{"cases":[{"id":1,"priority":"p0","description":"打开首页,预期工单列表渲染出至少 1 行"}]}
|
|
68
38
|
```
|
|
69
|
-
{% if e2eStructuredCases %}
|
|
70
39
|
|
|
71
40
|
本轮跑哪些用例只认结构化字段,写在 `prompt` 里的自然语言范围不生效:刚写好或刚改过的计划首次验收带 `agent_options.retest_all: true`,跑全部用例;修复后复验带 `agent_options.retest_case_ids: [1, 2]`,只列失败或受这次修复影响的用例(编号取计划文件里的 `id`,必须是正整数,不是 `"case-1"` 这类字符串)。
|
|
72
|
-
{% endif %}
|
|
73
|
-
{% endif %}
|
|
74
41
|
|
|
75
42
|
## 验收要求
|
|
76
43
|
|
|
77
|
-
-
|
|
44
|
+
- 检查视觉的用例写清可观察结果,例如「首页标题完整可见、卡片两列排列、主图不是裂图」,不要只写「看起来正常」。
|
|
78
45
|
- 功能验收必须走到终态:提交后记录出现、跳转后内容正确、删除后记录消失或 AI 输出出现;不要停在弹窗、按钮或表单字段出现。
|
|
79
46
|
- 写操作和资源加载要核对网络结果;非 2xx、空结果、错误兜底或白屏都应报失败。
|
|
80
47
|
- 不测试登录、认证、CAPTCHA,或会造成真实外部副作用的行为。
|
|
@@ -142,45 +109,29 @@ Task({
|
|
|
142
109
|
|
|
143
110
|
> **核心原则:agent 只「机械执行 + 报判断」,不做推理。** 判定标准全写死在断言里——别让它自己推断"该测什么"或定义"什么算正常 / 好看"。它的活只有:执行动作 → 看现象 → 报通过 / 不通过。
|
|
144
111
|
|
|
145
|
-
{% if e2eSemanticPlan %}
|
|
146
112
|
### 验收计划文件:先写文件,再派发(首次与后续同一套)
|
|
147
113
|
|
|
148
114
|
每次派发都必须带 `agent_options.test_plan_file_path`,不传不执行。**两种 mode 各一份卷**,目录必须与派发 mode 一致(串卷不执行):standard 卷写 `.spark/e2e-test/standard/<语义名>.json`(含点击 / 输入 / 提交),lite 卷写 `.spark/e2e-test/lite/<语义名>.json`(只放看得见的检查点)。
|
|
149
115
|
|
|
150
116
|
1. **先看已有的**:`glob .spark/e2e-test/<mode>/*.json` → **读**可能覆盖本需求的那份(没读过不要传)
|
|
151
117
|
2. **改还是新建**:同需求用例有变化 → 编辑那份;换了功能 / 页面 → 新建一份
|
|
152
|
-
{%- if e2eStructuredCases %}
|
|
153
118
|
3. **派发**:standard 卷跑哪些用例只认结构化字段,写在 `prompt` 里的自然语言范围不生效:刚写好或刚改过的卷首次验收带 `agent_options.retest_all: true`,跑全部用例;修复后复验带 `agent_options.retest_case_ids: [1, 2]`,只列失败或受这次修复影响的用例(编号取计划文件里的 `id`,必须是正整数,不是 `"case-1"` 这类字符串)。lite 卷不带这两个字段,`prompt` 只说跑哪些(`跑 Case 1、2` / `测试全部用例`),不点名默认只跑 p0
|
|
154
119
|
|
|
155
120
|
格式(一条用例一行,优先级小写,每卷 ≤10 条):
|
|
156
|
-
{%- else %}
|
|
157
|
-
3. **派发**:`prompt` 只说跑哪些(`跑 Case 1、2` / `复测 p0 和 p1` / `测试全部用例`),**不点名默认只跑 p0**;一轮点名 ≤5 条
|
|
158
|
-
|
|
159
|
-
格式(一条用例一行,优先级小写,每卷 ≤10 条;一轮只跑其中 ≤5 条):
|
|
160
|
-
{%- endif %}
|
|
161
121
|
|
|
162
122
|
```json
|
|
163
123
|
{"cases":[{"id":1,"priority":"p0","description":"打开首页,预期工单列表渲染出至少 1 行"}]}
|
|
164
124
|
```
|
|
165
125
|
|
|
166
126
|
- **用例正文只写在计划文件里**:本模式下 `prompt` 不写 `## 测试用例`(下面示例里的用例正文改为写进卷),只留应用结构与本次范围——两处都写会让计划外用例一条不跑、报告却全绿
|
|
167
|
-
{%- if e2eStructuredCases %}
|
|
168
127
|
- **复测只选编号、不删用例**:「只传 failed + 未完成的 Case」指 standard 用 `retest_case_ids` 列出这些编号(lite 在 `prompt` 里点名),不是从卷里删掉已通过的用例
|
|
169
|
-
{%- else %}
|
|
170
|
-
- **复测只点名、不删用例**:「只传 failed + 未完成的 Case」指在 `prompt` 里点名,不是从卷里删掉已通过的用例
|
|
171
|
-
{%- endif %}
|
|
172
|
-
{% endif %}
|
|
173
128
|
|
|
174
129
|
### 调用结构
|
|
175
130
|
|
|
176
131
|
```js
|
|
177
132
|
task({
|
|
178
133
|
subagent_type: "E2E",
|
|
179
|
-
{%- if e2eSemanticPlan and e2eStructuredCases %}
|
|
180
134
|
agent_options: { mode: "standard", test_plan_file_path: ".spark/e2e-test/standard/<语义名>.json", retest_all: true }, // 首次验收;lite 卷改 mode: "lite" + lite 目录,不带 retest_*
|
|
181
|
-
{%- else %}
|
|
182
|
-
agent_options: { mode: "standard" }, // standard=可点击/输入,lite=只截图
|
|
183
|
-
{%- endif %}
|
|
184
135
|
description: "验收创作工具", // 一句话任务名
|
|
185
136
|
prompt: `
|
|
186
137
|
对<被测应用一句话描述>进行端到端验收测试。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/coding-miaoda-sandbox-skills",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"description": "Miaoda 合并沙箱 skills 包(包含原 miaoda-skills 的 miaoda / miaoda-modern / miaoda-design / shared 四条业务线);发布公网 npm,随沙箱运行时经 update-skills 同步到 .agent/skills/",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|