@wwkit/harness 1.0.21 → 1.0.22

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.
Files changed (35) hide show
  1. package/package.json +2 -2
  2. package/readme/development.md +1 -1
  3. package/{agents/lint.md → skills/lint/SKILL.md} +92 -27
  4. package/skills/{lint-ai-fix/SKILL.md → lint/references/ai-fix.md} +7 -10
  5. package/skills/{lint-config-setup/SKILL.md → lint/references/config-setup.md} +8 -11
  6. package/skills/{lint-env-ensure/SKILL.md → lint/references/env-ensure.md} +7 -10
  7. package/skills/{lint-language-detect/SKILL.md → lint/references/language-detect.md} +6 -9
  8. package/skills/{lint-rules-analyze/SKILL.md → lint/references/rules-analyze.md} +5 -8
  9. package/skills/{lint-suitability-check/SKILL.md → lint/references/suitability-check.md} +5 -7
  10. package/skills/{lint-tool-fix/SKILL.md → lint/references/tool-fix.md} +7 -10
  11. package/skills/pytest/SKILL.md +44 -16
  12. package/skills/{pytest-case-create/SKILL.md → pytest/references/case-create.md} +9 -11
  13. package/skills/{pytest-case-fix/SKILL.md → pytest/references/case-fix.md} +7 -9
  14. package/skills/{pytest-coverage-analyze/SKILL.md → pytest/references/coverage-analyze.md} +8 -10
  15. package/skills/{pytest-env-ensure/SKILL.md → pytest/references/env-ensure.md} +7 -9
  16. package/skills/{pytest-execute/SKILL.md → pytest/references/execute.md} +8 -10
  17. package/skills/{pytest-sample/SKILL.md → pytest/references/sample.md} +8 -12
  18. package/skills/{pytest-suitability-check/SKILL.md → pytest/references/suitability-check.md} +5 -8
  19. package/skills/read-docs/references/superpowers/comparison.md +1 -1
  20. package/skills/read-docs/references/superpowers/index.md +1 -1
  21. package/agents/scrum.md +0 -65
  22. /package/skills/{lint-env-ensure → lint}/references/config.md +0 -0
  23. /package/skills/{lint-language-detect → lint}/references/detect-language.js +0 -0
  24. /package/skills/{lint-config-setup → lint}/references/languages/js.md +0 -0
  25. /package/skills/{lint-config-setup → lint}/references/languages/py.md +0 -0
  26. /package/skills/{pytest-env-ensure → pytest}/references/config.md +0 -0
  27. /package/skills/{pytest-coverage-analyze → pytest}/references/scoring-rules.md +0 -0
  28. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/Calculator.py +0 -0
  29. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/ConfigManager.py +0 -0
  30. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/FileProcessor.py +0 -0
  31. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/OrderService.py +0 -0
  32. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/TokenGenerator.py +0 -0
  33. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/UserService.py +0 -0
  34. /package/skills/{pytest-sample → pytest}/references/src/pytest-sample/__init__.py +0 -0
  35. /package/skills/{pytest-case-create → pytest}/references/test-standards.md +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wwkit/harness",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "author": "bluesliu <langcai163@163.com>",
5
5
  "description": "WebWork abilities for opencode",
6
6
  "type": "module",
@@ -44,7 +44,7 @@
44
44
  "ajv": "^8.17.0",
45
45
  "cheerio": "^1.0.0",
46
46
  "json5": "^2.2.3",
47
- "@wwkit/shared": "1.0.16"
47
+ "@wwkit/shared": "1.0.17"
48
48
  },
49
49
  "devDependencies": {
50
50
  "jest": "^29.7.0"
@@ -17,7 +17,7 @@ wwkit/
17
17
 
18
18
  ```
19
19
  plugin.js # 包入口("main"),仅把 skills/ 注册进 config.skills.paths
20
- agents/*.md # 主代理(lint / scrum / fastcode),frontmatter 含权限块;extract / revise / query / pytest 现为纯 skill(pytest 合并原 pyut+pyit);旧 work/work-explore/work-general、work-* skill、todo agent、todo-* skill 均已删除
20
+ agents/*.md # 主代理(scrum / fastcode),frontmatter 含权限块;extract / revise / query / pytest / lint 现为纯 skill(pytest 合并原 pyut+pyit;lint 合并原 lint agent + 7 个 lint-* skill);旧 work/work-explore/work-general、work-* skill、todo agent、todo-* skill 均已删除
21
21
  skills/<name>/SKILL.md # 技能定义
22
22
  skills/<name>/references/ # 工作流:*.md(LLM 指令)、*.js(ESM 辅助脚本)、*.json5(schema)
23
23
  commands/*.md # opencode 命令(/tl 翻译)
@@ -1,20 +1,56 @@
1
1
  ---
2
+ name: lint
2
3
  description: |
3
- 通用多语言语法检查指挥官。协调语言探测→适用性检查→环境检查→配置生成→规则分析→自动修复→AI修复的完整流程。
4
+ 自包含多语言语法检查 skill:协调语言探测→适用性检查→环境检查→配置生成→规则分析→自动修复→AI修复的完整流程。
4
5
  二元制评分:0 违规=100(达标),1+ 违规=0(不达标)。v1 支持 JS/TS 和 Python。
5
- 触发词:lint、语法检查、代码规范、eslint、ruff。
6
- mode: subagent
6
+ 子工作流(language-detect/suitability-check/env-ensure/config-setup/rules-analyze/tool-fix/ai-fix)位于 references/ 下,由主流程用 read 加载并按其指令执行,不再调用独立 skill。
7
+ 调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite 管理 8 步。触发词:lint、语法检查、代码规范、eslint、ruff。
8
+ license: MIT
9
+ metadata:
10
+ workflow: sequential
7
11
  ---
8
12
 
9
- 你是通用多语言语法检查指挥官(lint)。你负责协调一套完整的 lint 检查-修复-复检流程,确保目标代码的语法规范达到 100% 通过率。
13
+ # lint 技能
14
+
15
+ ## 核心约束(最高优先级)
16
+
17
+ - **MUST**:收到任务消息后,先 todowrite 落单 8 步,再逐步执行。
18
+ - **MUST**:每步完成立即 todowrite 勾单。
19
+ - **MUST**:子工作流通过 `read` 加载 `references/xxx.md` 并按其指令执行,**不再调用独立 skill**(原 lint-* 子 skill 已合并入 references/)。
20
+ - **禁止**:混合语言(v1 按主语言处理,不支持混合)。
21
+ - **禁止**:修改 lint 配置文件(配置生成由 references/config-setup.md 负责)。
22
+ - **禁止**:使用 WebFetch 或任何网络请求。
23
+
24
+ ## 第一步硬指令(自检)
25
+
26
+ 解析入参前,强制自检:
27
+ > 我是否已用 todowrite 落单 8 步?
28
+ > - 未落单 → 立即 todowrite 创建清单。
29
+ > - 已落单 → 继续。
30
+
31
+ ## 输入参数(自包含)
32
+
33
+ 入参为调用方传入的**原始任务消息**,可能是以下任一形态:
34
+
35
+ - **JSON 对象**:`{root_dir, target_dir}`,直接取字段值。
36
+ - **key=value**:`root_dir=/path/to/project, target_dir=/path/to/project/src`,按 `,` 和 `=` 拆分为字段。
37
+ - **纯文本 prose**:从文本中出现的路径推断 root_dir/target_dir。
38
+ - **命令风格**:`lint /path/to/project` 或 `lint /path/to/project /path/to/project/src`,第一段为 root_dir,第二段(可选)为 target_dir。
39
+
40
+ 字段清单:
41
+
42
+ | 字段 | 类型 | 必填 | 说明 |
43
+ |------|------|------|------|
44
+ | root_dir | string | 否 | 工程根目录,默认当前工作目录 |
45
+ | target_dir | string | 否 | 检查目标目录,默认 root_dir 全量 |
10
46
 
11
47
  ## 你的职责
12
48
 
13
49
  1. 接收用户输入的工程根目录和检查目标目录
14
- 2. 调用 lint-language-detect 探测主语言
15
- 3. 调用 lint-suitability-check 筛选可 lint 文件
16
- 4. 调用 lint-env-ensure 检查并安装 linter 工具
17
- 5. 调用 lint-config-setup 生成或补全 lint 配置文件
50
+ 2. 读取 references/language-detect.md 探测主语言
51
+ 3. 读取 references/suitability-check.md 筛选可 lint 文件
52
+ 4. 读取 references/env-ensure.md 检查并安装 linter 工具
53
+ 5. 读取 references/config-setup.md 生成或补全 lint 配置文件
18
54
  6. 协调规则分析 → 工具修复 → AI 修复的外层 loop
19
55
  7. 管理 loop 次数和退出条件(轮尾独立验证)
20
56
  8. 输出最终检查报告并写入 `{report_dir}/lint_report-{HHMMSS}.md`
@@ -23,7 +59,7 @@ mode: subagent
23
59
 
24
60
  - target_score: **100**(二元制:0 违规=100,1+ 违规=0)
25
61
  - outer_max: **3**(外层 loop 最大轮次)
26
- - inner_max: **3**(lint-ai-fix 内部 loop 最大轮次,skill 内部管理)
62
+ - inner_max: **3**(references/ai-fix.md 内部 loop 最大轮次,自管理)
27
63
 
28
64
  ## TodoWrite 任务清单纪律(强制)
29
65
 
@@ -73,7 +109,7 @@ Step 1 入参校验通过后,立即用 `todowrite` 一次性创建以下 8 项
73
109
 
74
110
  #### 产出
75
111
 
76
- Step 1 结束后,确定以下变量,传递给后续所有 skill:
112
+ Step 1 结束后,确定以下变量,传递给后续所有子工作流:
77
113
  - `root_dir`:工程根目录
78
114
  - `target_dir`:检查目标目录
79
115
  - `report_dir`:报告输出目录,格式为 `{root_dir}/.webwork/harness/lint/{YYYY-MM-DD}/`
@@ -89,11 +125,11 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
89
125
 
90
126
  ### Step 2:语言探测
91
127
 
92
- 调用 **lint-language-detect** 技能,传入参数:
128
+ 读取 `references/language-detect.md` 并按其指令执行,传入参数:
93
129
  - root_dir: 工程根目录路径
94
130
 
95
131
  **产出**:
96
- - `primary_language`:主语言(`jsts` 或 `python`),传递给后续所有 skill
132
+ - `primary_language`:主语言(`jsts` 或 `python`),传递给后续所有子工作流
97
133
 
98
134
  **退出条件**:
99
135
  - 检测到主语言 → 继续 Step 3
@@ -101,7 +137,7 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
101
137
 
102
138
  ### Step 3:适用性检查
103
139
 
104
- 调用 **lint-suitability-check** 技能,传入参数:
140
+ 读取 `references/suitability-check.md` 并按其指令执行,传入参数:
105
141
  - root_dir: 工程根目录路径
106
142
  - target_dir: 检查目标目录路径
107
143
  - primary_language: 从 Step 2 获得的主语言
@@ -116,7 +152,7 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
116
152
 
117
153
  ### Step 4:环境检查
118
154
 
119
- 调用 **lint-env-ensure** 技能,传入参数:
155
+ 读取 `references/env-ensure.md` 并按其指令执行,传入参数:
120
156
  - root_dir: 工程根目录路径
121
157
  - primary_language: 主语言
122
158
 
@@ -134,7 +170,7 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
134
170
 
135
171
  ### Step 5:配置生成
136
172
 
137
- 调用 **lint-config-setup** 技能,传入参数:
173
+ 读取 `references/config-setup.md` 并按其指令执行,传入参数:
138
174
  - root_dir: 工程根目录路径
139
175
  - primary_language: 主语言
140
176
 
@@ -152,7 +188,7 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
152
188
 
153
189
  ### Step 6:规则分析(外层 loop 开始)
154
190
 
155
- 调用 **lint-rules-analyze** 技能,传入参数:
191
+ 读取 `references/rules-analyze.md` 并按其指令执行,传入参数:
156
192
  - target_dir: 检查目标目录路径
157
193
  - root_dir: 工程根目录路径
158
194
  - primary_language: 主语言
@@ -166,7 +202,7 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
166
202
 
167
203
  #### 轮尾调用(所有 Round,独立验证)
168
204
 
169
- - 在 tool-fix + ai-fix 完成后,agent **独立调用** lint-rules-analyze 获取 `final_count`
205
+ - 在 tool-fix + ai-fix 完成后,主流程**独立调用** references/rules-analyze.md 获取 `final_count`
170
206
  - 此调用是权威验证,不信任 tool-fix/ai-fix 的内部 linter 结果
171
207
 
172
208
  **退出条件**(仅在轮尾调用时检查):
@@ -180,13 +216,13 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
180
216
 
181
217
  ### Step 7:工具修复
182
218
 
183
- 调用 **lint-tool-fix** 技能,传入参数:
219
+ 读取 `references/tool-fix.md` 并按其指令执行,传入参数:
184
220
  - target_dir: 检查目标目录路径
185
221
  - root_dir: 工程根目录路径
186
222
  - primary_language: 主语言
187
223
  - config_file_path: 配置文件路径
188
224
 
189
- skill 内部执行 `--fix`,然后复跑 linter 获取 `remaining_violations`。
225
+ 子工作流内部执行 `--fix`,然后复跑 linter 获取 `remaining_violations`。
190
226
 
191
227
  **产出**:
192
228
  - `tool_fixed_count`:自动修复数
@@ -198,14 +234,14 @@ skill 内部执行 `--fix`,然后复跑 linter 获取 `remaining_violations`
198
234
 
199
235
  ### Step 8:AI 修复(内部 loop,skill 自管理)
200
236
 
201
- 调用 **lint-ai-fix** 技能,传入参数:
237
+ 读取 `references/ai-fix.md` 并按其指令执行,传入参数:
202
238
  - remaining_violations: 从 Step 7 获得的剩余违规列表
203
239
  - target_dir: 检查目标目录路径
204
240
  - root_dir: 工程根目录路径
205
241
  - primary_language: 主语言
206
242
  - config_file_path: 配置文件路径
207
243
 
208
- skill 内部管理 fix→语法验证→linter 复检 的 loop(max 3),agent 不关心内部 loop 状态。
244
+ 子工作流内部管理 fix→语法验证→linter 复检 的 loop(max 3),主流程不关心内部 loop 状态。
209
245
 
210
246
  **产出**:
211
247
  - `ai_fixed_count`:AI 修复数
@@ -213,7 +249,7 @@ skill 内部管理 fix→语法验证→linter 复检 的 loop(max 3),agen
213
249
  - `manual_items`:人工处理项列表
214
250
 
215
251
  **退出条件**:
216
- - 输出后 → 标记第 7 项 `completed`,标记第 8 项 `in_progress`,回到 Step 6 轮尾评分(agent 独立调用 lint-rules-analyze 做权威验证)
252
+ - 输出后 → 标记第 7 项 `completed`,标记第 8 项 `in_progress`,回到 Step 6 轮尾评分(主流程独立调用 references/rules-analyze.md 做权威验证)
217
253
 
218
254
  ## Loop 控制状态机
219
255
 
@@ -224,7 +260,7 @@ skill 内部管理 fix→语法验证→linter 复检 的 loop(max 3),agen
224
260
  round 3: tool-fix → ai-fix → rules-analyze(轮尾,独立验证)
225
261
 
226
262
  注意:round 1 基线检查 violation_count=0 时直接达标退出,不进入 loop。
227
- 注意:轮尾 rules-analyze 是 agent 独立调用,不信任 tool-fix/ai-fix 的内部 linter 结果。
263
+ 注意:轮尾 rules-analyze 是主流程独立调用,不信任 tool-fix/ai-fix 的内部 linter 结果。
228
264
  注意:round 2+ 的 round_start_count 由上一轮轮尾退出条件设置(round_start_count = final_count),
229
265
  无需单独的轮首 rules-analyze 调用。
230
266
 
@@ -241,7 +277,7 @@ skill 内部管理 fix→语法验证→linter 复检 的 loop(max 3),agen
241
277
 
242
278
  内层 loop (lint-ai-fix 内部, max 3):
243
279
  fix → 语法验证 → linter 复检 → fix → ...
244
- skill 自管理,agent 只接收最终输出
280
+ 子工作流自管理,主流程只接收最终输出
245
281
  ```
246
282
 
247
283
  ## 状态跟踪
@@ -361,8 +397,37 @@ skill 内部管理 fix→语法验证→linter 复检 的 loop(max 3),agen
361
397
 
362
398
  1. v1 只处理 JS/TS(含 Vue)和 Python,按主语言处理,不支持混合语言
363
399
  2. 二元制评分:0 违规=100(达标),1+ 违规=0(不达标)
364
- 3. 轮尾必须独立调用 lint-rules-analyze 做权威验证(方案 B)
365
- 4. lint-ai-fix 的内部 loop 由 skill 自管理,agent 只接收最终输出
400
+ 3. 轮尾必须独立调用 references/rules-analyze.md 做权威验证(方案 B)
401
+ 4. references/ai-fix.md 的内部 loop 自管理,主流程只接收最终输出
366
402
  5. 修复对象是源码自身,必须有语法验证 + git 回滚保护
367
- 6. 不修改 lint 配置文件(配置生成由 lint-config-setup 负责)
403
+ 6. 不修改 lint 配置文件(配置生成由 references/config-setup.md 负责)
368
404
  7. 遵循 AGENTS.md:ESM 脚本、CommonJS e2e 测试、无网络请求
405
+
406
+ ## references/ 目录结构
407
+
408
+ 子工作流与资源文件均位于 `references/` 下,由主流程用 `read` 加载:
409
+
410
+ ```
411
+ references/
412
+ ├── language-detect.md # Step 2 语言探测子工作流
413
+ ├── detect-language.js # 语言探测 ESM 脚本(language-detect.md 引用)
414
+ ├── suitability-check.md # Step 3 适用性检查子工作流
415
+ ├── env-ensure.md # Step 4 环境检查子工作流
416
+ ├── config.md # 环境检查配置清单(env-ensure.md 引用)
417
+ ├── config-setup.md # Step 5 配置生成子工作流
418
+ ├── languages/
419
+ │ ├── js.md # JS/TS ESLint 规则清单(config-setup.md 引用)
420
+ │ └── py.md # Python Ruff 规则清单(config-setup.md 引用)
421
+ ├── rules-analyze.md # Step 6 规则分析子工作流
422
+ ├── tool-fix.md # Step 7 工具修复子工作流
423
+ └── ai-fix.md # Step 8 AI 修复子工作流
424
+ ```
425
+
426
+ 子工作流 .md 之间互不直接调用,均由主流程在对应 Step 用 `read` 加载后按其指令执行。子工作流内部对其他子工作流的引用以 `references/xxx.md` 路径或 Step 编号形式标注。
427
+
428
+ ## 工具使用约束
429
+
430
+ - 写文件一律用 `write` 工具;读文件用 `read` 工具。
431
+ - 加载子工作流用 `read` 读取 `references/xxx.md`,按其指令执行(**不再通过 skill tool 调用独立子 skill**)。
432
+ - 需要中间数据时,用 `write` 工具写入临时文件,再以 stdin 重定向传给 node。
433
+ - 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时,一律用允许的 `node -e` 的 fs 模块完成。
@@ -1,10 +1,7 @@
1
- ---
2
- name: lint-ai-fix
3
- description: |
4
- 对 linter 无法自动修复的违规进行 AI 语义修复。内部管理 fix→验证→复检 的 loop(max 3),
5
- 每次修改后做语法验证,失败则 git checkout 回滚并记人工处理项。agent 只接收最终输出。
6
- 适用:lint agent 的 AI 修复阶段,处理 lint-tool-fix 的剩余违规。
7
- 不适用:linter --fix 可修复的违规(使用 lint-tool-fix)、规则检查(使用 lint-rules-analyze)。
1
+ > **原 skill**: `lint-ai-fix`(已合并入 lint)
2
+ > **适用**: lint agent 的 AI 修复阶段,处理 Step 7(references/tool-fix.md)的剩余违规。
3
+ > **不适用**: linter --fix 可修复的违规(Step 7 / references/tool-fix.md)、规则检查(Step 6 / references/rules-analyze.md)。
4
+
8
5
  ---
9
6
 
10
7
  # Lint AI 语义修复
@@ -17,7 +14,7 @@ description: |
17
14
 
18
15
  | 参数 | 必填 | 类型 | 说明 |
19
16
  |------|------|------|------|
20
- | remaining_violations | 是 | array | lint-tool-fix 输出的剩余违规列表 |
17
+ | remaining_violations | 是 | array | Step 7(references/tool-fix.md)输出的剩余违规列表 |
21
18
  | target_dir | 是 | string | 检查目标目录路径 |
22
19
  | root_dir | 是 | string | 工程根目录路径 |
23
20
  | primary_language | 是 | string | 主语言(`jsts` 或 `python`) |
@@ -77,7 +74,7 @@ inner_round 3: 逐条修复 → 语法验证 → linter 复检
77
74
 
78
75
  ## 阶段三:linter 复检
79
76
 
80
- 对所有修改的文件重新执行 linter 检查(同 lint-rules-analyze 命令),获取当前违规数。
77
+ 对所有修改的文件重新执行 linter 检查(同 references/rules-analyze.md 命令),获取当前违规数。
81
78
 
82
79
  ## 阶段四:退出判断
83
80
 
@@ -138,4 +135,4 @@ inner_round 3: 逐条修复 → 语法验证 → linter 复检
138
135
  2. 不要修改非违规文件的代码
139
136
  3. 不要跳过语法验证
140
137
  4. 不要在语法验证失败时不回滚
141
- 5. 不要执行网络请求
138
+ 5. 不要执行网络请求
@@ -1,10 +1,7 @@
1
- ---
2
- name: lint-config-setup
3
- description: |
4
- 生成或补全 lint 配置文件。读取语言规则清单,按初始启用规则生成 eslint.config.js 或 ruff.toml。
5
- 已有配置文件时只追加缺失的启用规则,不覆盖用户自定义规则。
6
- 适用:lint agent 的配置生成阶段,在规则分析前确保配置文件存在且包含初始规则集。
7
- 不适用:非 lint 场景的配置生成、手动配置调优。
1
+ > **原 skill**: `lint-config-setup`(已合并入 lint)
2
+ > **适用**: lint agent 的配置生成阶段,在规则分析前确保配置文件存在且包含初始规则集。
3
+ > **不适用**: 非 lint 场景的配置生成、手动配置调优。
4
+
8
5
  ---
9
6
 
10
7
  # Lint 配置生成
@@ -29,12 +26,12 @@ description: |
29
26
 
30
27
  ## 阶段一:加载规则清单
31
28
 
32
- 读取 `references/languages/{primary_language}.md`,解析规则清单表格:
29
+ 读取 `languages/{primary_language}.md`,解析规则清单表格:
33
30
 
34
31
  | 主语言 | 规则文件 | 配置文件名 |
35
32
  |--------|---------|-----------|
36
- | jsts | `references/languages/js.md` | `eslint.config.js` |
37
- | python | `references/languages/py.md` | `ruff.toml` |
33
+ | jsts | `languages/js.md` | `eslint.config.js` |
34
+ | python | `languages/py.md` | `ruff.toml` |
38
35
 
39
36
  提取所有"初始启用"标记为 ✓ 的规则。
40
37
 
@@ -103,4 +100,4 @@ select = ["F401", "F811", "F841", "E711"]
103
100
  1. 不要覆盖用户已有的自定义规则
104
101
  2. 不要修改非配置文件
105
102
  3. 不要写入初始未启用的规则
106
- 4. 不要执行网络请求
103
+ 4. 不要执行网络请求
@@ -1,10 +1,7 @@
1
- ---
2
- name: lint-env-ensure
3
- description: |
4
- 检查 lint 工具可用性,缺失时在项目内自动安装。按主语言检查对应 linter(jsts→eslint,python→ruff),
5
- 安装失败重试 3 次。加载配置清单供后续 skill 共享。
6
- 适用:lint agent 的环境检查阶段,在配置生成和规则分析前确保工具可用。
7
- 不适用:非 lint 场景的环境检查、系统级工具安装。
1
+ > **原 skill**: `lint-env-ensure`(已合并入 lint)
2
+ > **适用**: lint agent 的环境检查阶段,在配置生成和规则分析前确保工具可用。
3
+ > **不适用**: 非 lint 场景的环境检查、系统级工具安装。
4
+
8
5
  ---
9
6
 
10
7
  # Lint 环境检查
@@ -25,7 +22,7 @@ description: |
25
22
  - `linter_name`:linter 名称(`eslint` 或 `ruff`)
26
23
  - `linter_version`:linter 版本号
27
24
  - `linter_installed`:是否已安装且可用(bool)
28
- - `config`:从 references/config.md 加载的配置对象
25
+ - `config`:从 config.md 加载的配置对象
29
26
 
30
27
  ## 阶段一:检查工具可用性
31
28
 
@@ -58,7 +55,7 @@ description: |
58
55
 
59
56
  ## 阶段四:加载配置
60
57
 
61
- 读取 `references/config.md`,输出配置对象供后续 skill 使用。
58
+ 读取 `config.md`,输出配置对象供后续 skill 使用。
62
59
 
63
60
  ## 决策
64
61
 
@@ -89,4 +86,4 @@ description: |
89
86
  1. 不要全局安装工具(`npm install -g`)
90
87
  2. 不要跳过安装验证步骤
91
88
  3. 不要修改项目配置文件(package.json 等)
92
- 4. 不要使用 webfetch 下载工具,仅通过包管理器(npm/pip/uv)安装
89
+ 4. 不要使用 webfetch 下载工具,仅通过包管理器(npm/pip/uv)安装
@@ -1,10 +1,7 @@
1
- ---
2
- name: lint-language-detect
3
- description: |
4
- 探测工程主语言。优先检查 manifest 文件(package.json → jsts,pyproject.toml/setup.py → python),
5
- 无 manifest 时按源码文件扩展名计数,多者为主语言。JS/TS 视为一种语言。
6
- 适用:lint agent 的语言探测阶段,在环境检查和配置生成前确定主语言。
7
- 不适用:非 lint 场景的语言检测、混合语言项目(v1 按主语言处理,不支持混合)。
1
+ > **原 skill**: `lint-language-detect`(已合并入 lint)
2
+ > **适用**: lint agent 的语言探测阶段,在环境检查和配置生成前确定主语言。
3
+ > **不适用**: 非 lint 场景的语言检测、混合语言项目(v1 按主语言处理,不支持混合)。
4
+
8
5
  ---
9
6
 
10
7
  # 主语言探测
@@ -39,7 +36,7 @@ description: |
39
36
 
40
37
  ## 阶段二:文件计数检测
41
38
 
42
- 无 manifest 时,调用 `references/detect-language.js` 的 `detectLanguage(rootDir)` 函数扫描源码文件:
39
+ 无 manifest 时,调用 `detect-language.js` 的 `detectLanguage(rootDir)` 函数扫描源码文件:
43
40
 
44
41
  1. 递归扫描 `root_dir`(最大深度 10 层)
45
42
  2. 排除目录:`node_modules/`、`dist/`、`build/`、`.git/`、`__pycache__/`、`.venv/`、`venv/`、`.webwork/`、`reports/`、`coverage/`
@@ -76,4 +73,4 @@ description: |
76
73
  1. 不要返回多个语言(v1 只返回主语言)
77
74
  2. 不要扫描 `node_modules/` 等依赖目录
78
75
  3. 不要修改任何文件
79
- 4. 不要执行网络请求
76
+ 4. 不要执行网络请求
@@ -1,10 +1,7 @@
1
- ---
2
- name: lint-rules-analyze
3
- description: |
4
- 执行 linter 检查并解析 JSON 输出,产出违规清单。按主语言调用对应 linter(eslint/ruff),
5
- 解析输出为统一的 violations 结构。二元制评分:0 违规=100,1+违规=0。
6
- 适用:lint agent 的规则分析阶段,用于基线检查和轮尾独立验证。
7
- 不适用:修复违规(使用 lint-tool-fix / lint-ai-fix)、非 lint 场景的代码分析。
1
+ > **原 skill**: `lint-rules-analyze`(已合并入 lint)
2
+ > **适用**: lint agent 的规则分析阶段,用于基线检查和轮尾独立验证。
3
+ > **不适用**: 修复违规(Step 7 / references/tool-fix.md、Step 8 / references/ai-fix.md)、非 lint 场景的代码分析。
4
+
8
5
  ---
9
6
 
10
7
  # Lint 规则分析
@@ -126,4 +123,4 @@ Ruff 输出 JSON 数组,每元素含 `code`、`filename`、`location`:
126
123
  1. 不要修复任何违规(只检查)
127
124
  2. 不要修改源码文件
128
125
  3. 不要省略 warning 级别的违规
129
- 4. 不要执行网络请求
126
+ 4. 不要执行网络请求
@@ -1,9 +1,7 @@
1
- ---
2
- name: lint-suitability-check
3
- description: |
4
- 扫描目标目录,筛选出可 lint 的源码文件列表。按主语言扩展名过滤,排除依赖/构建/缓存目录。
5
- 适用:lint agent 的适用性检查阶段,在环境检查前确定可检查的文件范围。
6
- 不适用:非 lint 场景的文件筛选、语言检测(使用 lint-language-detect)。
1
+ > **原 skill**: `lint-suitability-check`(已合并入 lint)
2
+ > **适用**: lint agent 的适用性检查阶段,在环境检查前确定可检查的文件范围。
3
+ > **不适用**: 非 lint 场景的文件筛选、语言检测(Step 2 / references/language-detect.md)。
4
+
7
5
  ---
8
6
 
9
7
  # 可 Lint 文件筛选
@@ -81,4 +79,4 @@ description: |
81
79
  1. 不要扫描 node_modules 等排除目录
82
80
  2. 不要返回非目标语言的文件
83
81
  3. 不要修改任何文件
84
- 4. 不要执行网络请求
82
+ 4. 不要执行网络请求
@@ -1,10 +1,7 @@
1
- ---
2
- name: lint-tool-fix
3
- description: |
4
- 执行 linter 的 --fix 自动修复,然后内部复跑 linter 获取剩余违规清单。
5
- 只处理 linter 可自动修复的规则,不可修复的规则交由 lint-ai-fix 处理。
6
- 适用:lint agent 的工具修复阶段,在 AI 修复前先自动修复可修复项。
7
- 不适用:AI 语义修复(使用 lint-ai-fix)、规则检查(使用 lint-rules-analyze)。
1
+ > **原 skill**: `lint-tool-fix`(已合并入 lint)
2
+ > **适用**: lint agent 的工具修复阶段,在 AI 修复前先自动修复可修复项。
3
+ > **不适用**: AI 语义修复(Step 8 / references/ai-fix.md)、规则检查(Step 6 / references/rules-analyze.md)。
4
+
8
5
  ---
9
6
 
10
7
  # Lint 工具自动修复
@@ -25,7 +22,7 @@ description: |
25
22
  ## 输出
26
23
 
27
24
  - `tool_fixed_count`:自动修复的违规数
28
- - `remaining_violations`:修复后剩余的违规列表(结构同 lint-rules-analyze 的 violations)
25
+ - `remaining_violations`:修复后剩余的违规列表(结构同 references/rules-analyze.md 的 violations)
29
26
 
30
27
  ## 阶段一:执行 --fix
31
28
 
@@ -40,7 +37,7 @@ description: |
40
37
 
41
38
  ## 阶段二:复跑 linter 获取剩余违规
42
39
 
43
- 修复后重新执行 linter 检查(同 lint-rules-analyze 的命令),获取剩余违规:
40
+ 修复后重新执行 linter 检查(同 references/rules-analyze.md 的命令),获取剩余违规:
44
41
 
45
42
  | 主语言 | 命令 |
46
43
  |--------|------|
@@ -91,4 +88,4 @@ description: |
91
88
  1. 不要执行 AI 语义修复(那是 lint-ai-fix 的职责)
92
89
  2. 不要修改 linter 配置文件
93
90
  3. 不要跳过复跑 linter 步骤
94
- 4. 不要执行网络请求
91
+ 4. 不要执行网络请求
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: pytest
3
3
  description: |
4
- 自包含 Python 测试 skill:合并原 pyut(单元测试)和 pyit(集成测试)。
5
- 通过 test_type=unit|integration 区分:unit 全 Mock 目标覆盖率 90%,integration 最少 Mock 目标覆盖率 70%。
6
- 协调适用性评估→环境检查→覆盖率分析→用例创建→测试执行→用例修复的完整流程,内外两层 loop。
4
+ 自包含 Python 测试 skill:合并原 pyut(单元测试)和 pyit(集成测试),并将所有子工作流收入 references/。
5
+ 通过 test_type=unit|integration|sample 区分:unit 全 Mock 目标覆盖率 90%,integration 最少 Mock 目标覆盖率 70%,sample 注入 demo 样例代码。
6
+ unit/integration 协调适用性评估→环境检查→覆盖率分析→用例创建→测试执行→用例修复的完整流程,内外两层 loop;sample 读取 references/sample.md 注入 demo。
7
+ 子工作流(suitability-check/env-ensure/coverage-analyze/case-create/execute/case-fix/sample)位于 references/ 下,由主流程用 read 加载并按其指令执行,不再调用独立 skill。
7
8
  调用方直接传原始任务消息,skill 自解析自包含。内部用 todowrite 管理 7 步。适用于 uv 管理的 Python 项目。
8
9
  license: MIT
9
10
  metadata:
@@ -16,9 +17,10 @@ metadata:
16
17
 
17
18
  - **MUST**:收到任务消息后,先 todowrite 落单 7 步,再逐步执行。
18
19
  - **MUST**:每步完成立即 todowrite 勾单。
19
- - **MUST**:test_type 只能是 unit 或 integration,其他值报错退出。
20
+ - **MUST**:test_type 只能是 unit、integration 或 sample,其他值报错退出。
20
21
  - **禁止**:混合测试类型(unit 不混合 integration,反之亦然)。
21
22
  - **禁止**:修改 conftest.py(除非直接导致失败)。
23
+ - **MUST**:子工作流通过 `read` 加载 `references/xxx.md` 并按其指令执行,**不再调用独立 skill**(原 pytest-* 子 skill 已合并入 references/)。
22
24
 
23
25
  ## 第一步硬指令(自检)
24
26
 
@@ -45,7 +47,9 @@ metadata:
45
47
  | 报告标题 | pytest unit 测试质量报告 | pytest integration 测试质量报告 |
46
48
  | 退出达标 | score ≥ 90 | score ≥ 70 |
47
49
 
48
- 通用配置(两种 test_type 共享):
50
+ **sample 分支**:test_type=sample 时不走 7 步 loop,Step 1 解析后直接读取 `references/sample.md` 按 demo 注入流程执行(在当前工程 src/ 下创建 pytest-sample 包,写入 7 个 demo 类,含 15 个故意 bug 用于端到端验证),完成后结束。
51
+
52
+ 通用配置(unit/integration 共享):
49
53
 
50
54
  - outer_max: **3**(外层 loop 最大轮次)
51
55
  - inner_max: **3**(内层 loop 最大轮次)
@@ -64,13 +68,13 @@ metadata:
64
68
 
65
69
  | 字段 | 类型 | 必填 | 说明 |
66
70
  |------|------|------|------|
67
- | test_type | string | 是 | `unit` 或 `integration`,其他值报错退出 |
71
+ | test_type | string | 是 | `unit`、`integration` 或 `sample`,其他值报错退出 |
68
72
  | source | string | 是 | 源码包目录或 .py 文件路径 |
69
73
  | test_dir | string | 否 | 测试目录;未指定时按 `tests/{test_type}/{归一化路径}/` 自动推导 |
70
74
 
71
75
  **必填校验**:若无法解析出 `test_type` 或 `source`,将错误信息输出到 stderr 并结束,**禁止**继续执行。
72
76
 
73
- **test_type 校验**:解析后若 `test_type` 不在 `{unit, integration}` 中,输出 "test_type 只能是 unit 或 integration,得到: {value}" 并结束。
77
+ **test_type 校验**:解析后若 `test_type` 不在 `{unit, integration, sample}` 中,输出 "test_type 只能是 unit、integration 或 sample,得到: {value}" 并结束。
74
78
 
75
79
  ## 输出
76
80
 
@@ -102,8 +106,8 @@ metadata:
102
106
 
103
107
  | 检查项 | 失败提示 |
104
108
  |--------|---------|
105
- | 为空 | "请提供 test_type(unit 或 integration)" |
106
- | 非 unit/integration | "test_type 只能是 unit 或 integration,得到: {value}" |
109
+ | 为空 | "请提供 test_type(unit、integration 或 sample)" |
110
+ | 非 unit/integration/sample | "test_type 只能是 unit、integration 或 sample,得到: {value}" |
107
111
 
108
112
  #### 参数 source 校验(源码路径)
109
113
 
@@ -163,11 +167,13 @@ Step 1 结束后,确定以下变量,传递给后续所有 skill:
163
167
 
164
168
  **退出条件**:参数校验失败 → 直接退出,不进入后续流程。
165
169
 
170
+ **sample 分支**:若 `test_type == sample`,Step 1 完成后**直接读取 `references/sample.md`** 并按其指令执行 demo 注入流程(创建 src/pytest-sample/ 包 + 7 个 demo 类 + 语法验证),完成后 todowrite 勾单第 1 步并输出创建报告,**跳过 Step 2~7**,流程结束。
171
+
166
172
  完成后 todowrite 勾单第 1 步。
167
173
 
168
174
  ### Step 2:模块适用性评估
169
175
 
170
- 调用 **pytest-suitability-check** 技能,传入参数:
176
+ 读取 `references/suitability-check.md` 并按其指令执行,传入参数:
171
177
 
172
178
  - target: 源码包目录路径
173
179
  - test_type: 当前 test_type
@@ -197,12 +203,12 @@ IT 仅适合有外部依赖的类(Service Class / Integration Point / External
197
203
 
198
204
  ### Step 3:环境检查
199
205
 
200
- 调用 **pytest-env-ensure** 技能:
206
+ 读取 `references/env-ensure.md` 并按其指令执行:
201
207
 
202
208
  - 检查是否为 uv 项目
203
209
  - 检查并安装依赖(test_type=unit: pytest, pytest-cov;test_type=integration: pytest, pytest-cov, pytest-timeout)
204
210
  - test_type=integration 时:检查 pytest marker 注册(unit, integration)
205
- - 加载配置清单(references/config.md)
211
+ - 加载配置清单(`references/config.md`)
206
212
 
207
213
  **分支:test_type == integration 的环境补充检查**(env-ensure 之后执行)
208
214
 
@@ -239,7 +245,7 @@ IT 仅适合有外部依赖的类(Service Class / Integration Point / External
239
245
 
240
246
  #### 覆盖率分析(非首轮或有已有测试时执行)
241
247
 
242
- 调用 **pytest-coverage-analyze** 技能,传入参数:
248
+ 读取 `references/coverage-analyze.md` 并按其指令执行,传入参数:
243
249
  - target: 用户指定的模块路径
244
250
  - test_dir: 从 Step 1 确定的测试目录路径
245
251
  - report_dir: 从 Step 1 确定的报告输出目录
@@ -270,7 +276,7 @@ IT 仅适合有外部依赖的类(Service Class / Integration Point / External
270
276
 
271
277
  ### Step 5:用例创建
272
278
 
273
- 调用 **pytest-case-create** 技能,传入参数:
279
+ 读取 `references/case-create.md` 并按其指令执行,传入参数:
274
280
  - uncovered_areas: 从 Step 4 获得的未覆盖区域清单(首轮为 "all")
275
281
  - testable_classes: 从 Step 2 获得的可测试类清单
276
282
  - target: 目标模块路径
@@ -289,7 +295,7 @@ IT 仅适合有外部依赖的类(Service Class / Integration Point / External
289
295
 
290
296
  ### Step 6:测试执行
291
297
 
292
- 调用 **pytest-execute** 技能,传入参数:
298
+ 读取 `references/execute.md` 并按其指令执行,传入参数:
293
299
  - target: 目标模块路径
294
300
  - test_dir: 从 Step 1 确定的测试目录路径
295
301
  - test_type: 当前 test_type
@@ -304,7 +310,7 @@ IT 仅适合有外部依赖的类(Service Class / Integration Point / External
304
310
 
305
311
  ### Step 7:用例修复(内层 loop)
306
312
 
307
- 调用 **pytest-case-fix** 技能,传入参数:
313
+ 读取 `references/case-fix.md` 并按其指令执行,传入参数:
308
314
  - failed_tests: 从 Step 6 获得的失败用例清单
309
315
  - test_dir: 从 Step 1 确定的测试目录路径
310
316
  - report_dir: 从 Step 1 确定的报告输出目录
@@ -513,8 +519,30 @@ integration:
513
519
  - 按业务场景组织用例,不按函数
514
520
  - 验证端到端数据流完整性
515
521
 
522
+ ## references/ 目录结构
523
+
524
+ 子工作流与资源文件均位于 `references/` 下,由主流程用 `read` 加载:
525
+
526
+ ```
527
+ references/
528
+ ├── suitability-check.md # Step 2 模块适用性评估子工作流
529
+ ├── env-ensure.md # Step 3 环境检查子工作流
530
+ ├── config.md # 环境检查配置清单(env-ensure.md 引用)
531
+ ├── coverage-analyze.md # Step 4 覆盖率分析子工作流
532
+ ├── scoring-rules.md # 评分规则(coverage-analyze.md 引用)
533
+ ├── case-create.md # Step 5 用例创建子工作流
534
+ ├── test-standards.md # 测试用例规范(case-create.md 引用)
535
+ ├── execute.md # Step 6 测试执行子工作流
536
+ ├── case-fix.md # Step 7 用例修复子工作流
537
+ ├── sample.md # test_type=sample 时 demo 注入子工作流
538
+ └── src/pytest-sample/*.py # demo 样例源码模板(sample.md 引用,7 个文件)
539
+ ```
540
+
541
+ 子工作流 .md 之间互不直接调用,均由主流程在对应 Step 用 `read` 加载后按其指令执行。子工作流内部对其他子工作流的引用以 `references/xxx.md` 路径或 Step 编号形式标注。
542
+
516
543
  ## 工具使用约束
517
544
 
518
545
  - 写文件一律用 `write` 工具;读文件用 `read` 工具。
546
+ - 加载子工作流用 `read` 读取 `references/xxx.md`,按其指令执行(**不再通过 skill tool 调用独立子 skill**)。
519
547
  - 需要中间数据时,用 `write` 工具写入临时文件,再以 stdin 重定向传给 node。
520
548
  - 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时,一律用允许的 `node -e` 的 fs 模块完成。
@@ -1,9 +1,7 @@
1
- ---
2
- name: pytest-case-create
3
- description: |
4
- 按测试规范创建 pytest 测试用例。根据 test_type 切换 Mock 策略,分析源码识别未覆盖区域,按 AAA/FIRST/边界值规范创建用例。
5
- 适用:测试代理外层 loop 的用例创建阶段,为未覆盖代码创建测试用例。
6
- 不适用:修复已有失败用例(使用 pytest-case-fix)、非 pytest 框架的用例创建。
1
+ > **原 skill**: `pytest-case-create`(已合并入 pytest)
2
+ > **适用**: 测试代理外层 loop 的用例创建阶段,为未覆盖代码创建测试用例。
3
+ > **不适用**: 修复已有失败用例(使用 pytest-case-fix)、非 pytest 框架的用例创建。
4
+
7
5
  ---
8
6
 
9
7
  # 测试用例创建
@@ -23,12 +21,12 @@ description: |
23
21
 
24
22
  | 参数 | 必填 | 类型 | 说明 |
25
23
  |------|------|------|------|
26
- | uncovered_areas | 是 | list/string | 未覆盖区域清单(来自 pytest-coverage-analyze,首轮为 "all") |
27
- | testable_classes | 否 | list | 可测试类清单(来自 pytest-suitability-check,含文件路径+类名+分类) |
24
+ | uncovered_areas | 是 | list/string | 未覆盖区域清单(来自 Step 4(references/coverage-analyze.md),首轮为 "all") |
25
+ | testable_classes | 否 | list | 可测试类清单(来自 Step 2(references/suitability-check.md),含文件路径+类名+分类) |
28
26
  | target | 是 | string | 被测模块路径 |
29
27
  | test_dir | 是 | string | 测试目录路径(由 agent Step 1 统一解析) |
30
28
  | test_type | 是 | string | 测试类型:unit 或 integration |
31
- | config | 是 | object | 来自 pytest-env-ensure 的配置对象 |
29
+ | config | 是 | object | 来自 Step 3(references/env-ensure.md) 的配置对象 |
32
30
 
33
31
  ## 输出
34
32
 
@@ -65,7 +63,7 @@ description: |
65
63
 
66
64
  ## 阶段一:加载规范
67
65
 
68
- **操作**:读取 `references/test-standards.md`,加载:
66
+ **操作**:读取 `test-standards.md`,加载:
69
67
  - 通用规范(AAA、FIRST、命名)
70
68
  - Python/pytest 特定规范(fixture、mock、parametrize)
71
69
  - test_type 对应的专属规范
@@ -324,4 +322,4 @@ agent 收到此标记后,应跳过 execute + fix,直接回到 coverage-analy
324
322
  5. 不要修改已存在的 conftest.py
325
323
  6. 不要导入项目特定的三方库到 conftest.py
326
324
  7. 不要跳过语法验证
327
- 8. 不要使用 Test 前缀的类名(统一用 test_ 前缀)
325
+ 8. 不要使用 Test 前缀的类名(统一用 test_ 前缀)
@@ -1,9 +1,7 @@
1
- ---
2
- name: pytest-case-fix
3
- description: |
4
- 分析测试失败原因并修复。按失败类型分类处理:断言错误修复测试或源码、Mock 配置错误修正 patch、环境问题标记人工处理。
5
- 适用:测试代理内层 loop 的修复阶段,修复 pytest-execute 报告的失败用例。
6
- 不适用:创建新用例(使用 pytest-case-create)、覆盖率分析(使用 pytest-coverage-analyze)。
1
+ > **原 skill**: `pytest-case-fix`(已合并入 pytest)
2
+ > **适用**: 测试代理内层 loop 的修复阶段,修复 pytest-execute 报告的失败用例。
3
+ > **不适用**: 创建新用例(使用 pytest-case-create)、覆盖率分析(使用 pytest-coverage-analyze)。
4
+
7
5
  ---
8
6
 
9
7
  # 用例修复
@@ -22,7 +20,7 @@ description: |
22
20
 
23
21
  | 参数 | 必填 | 类型 | 说明 |
24
22
  |------|------|------|------|
25
- | failed_tests | 是 | list | 失败用例清单(来自 pytest-execute) |
23
+ | failed_tests | 是 | list | 失败用例清单(来自 Step 6(references/execute.md)) |
26
24
  | test_dir | 是 | string | 测试目录路径(由 agent Step 1 统一解析) |
27
25
  | report_dir | 是 | string | 报告输出目录(由 agent Step 1 统一解析) |
28
26
  | test_type | 是 | string | 测试类型:unit 或 integration |
@@ -236,7 +234,7 @@ uv run pytest "<对应测试文件>" -v --tb=short --timeout=60 -m {test_type}
236
234
 
237
235
  | 条件 | 动作 |
238
236
  |------|------|
239
- | 有修复(修复数 > 0) | 输出修复记录,回到 pytest-execute 重新执行 |
237
+ | 有修复(修复数 > 0) | 输出修复记录,回到 Step 6(按 references/execute.md 执行) 重新执行 |
240
238
  | 无修复(全部标记人工处理) | 输出人工处理项,内层 loop 提前退出 |
241
239
 
242
240
  ## 失败处理
@@ -271,4 +269,4 @@ uv run pytest "<对应测试文件>" -v --tb=short --timeout=60 -m {test_type}
271
269
  5. 不要跳过源码修复后的快速测试
272
270
  6. 不要忽略语法验证或快速测试失败(必须回滚)
273
271
  7. 不要尝试修复导入错误(标记人工处理)
274
- 8. 不要在未保存原始内容的情况下修改源码(无法回滚)
272
+ 8. 不要在未保存原始内容的情况下修改源码(无法回滚)
@@ -1,9 +1,7 @@
1
- ---
2
- name: pytest-coverage-analyze
3
- description: |
4
- 运行 pytest 覆盖率分析并按评分规则计算质量得分。解析 coverage.json 提取覆盖率数据,扫描测试文件检查质量维度。
5
- 适用:测试代理外层 loop 的分析阶段,评估当前测试覆盖范围和质量。
6
- 不适用:非 pytest 项目、非覆盖率相关的代码分析。
1
+ > **原 skill**: `pytest-coverage-analyze`(已合并入 pytest)
2
+ > **适用**: 测试代理外层 loop 的分析阶段,评估当前测试覆盖范围和质量。
3
+ > **不适用**: 非 pytest 项目、非覆盖率相关的代码分析。
4
+
7
5
  ---
8
6
 
9
7
  # 覆盖率与质量分析
@@ -86,7 +84,7 @@ uv run pytest "{test_dir}" --cov="{target}" --cov-report=term --cov-report=json:
86
84
  - 函数覆盖率 = num_functions > 0 ? covered_functions / num_functions × 100% : 100%
87
85
 
88
86
  > **除零保护**:当分母为 0 时(源码无分支/无函数/无语句),该项覆盖率记为 100%(满分)。
89
- > 这与 `references/scoring-rules.md` 的"分母为 0 时该项给满分"规则一致。
87
+ > 这与 `scoring-rules.md` 的"分母为 0 时该项给满分"规则一致。
90
88
 
91
89
  ---
92
90
 
@@ -125,7 +123,7 @@ uv run pytest "{test_dir}" --cov="{target}" --cov-report=term --cov-report=json:
125
123
 
126
124
  **输入**:覆盖率数据 + 质量检查结果
127
125
 
128
- **操作**:按 `references/scoring-rules.md` 的评分规则计算总分
126
+ **操作**:按 `scoring-rules.md` 的评分规则计算总分
129
127
 
130
128
  **评分公式**:
131
129
 
@@ -192,7 +190,7 @@ uv run pytest "{test_dir}" --cov="{target}" --cov-report=term --cov-report=json:
192
190
  | 条件 | 动作 |
193
191
  |------|------|
194
192
  | score ≥ coverage_threshold | 输出"达标",流程结束 |
195
- | score < coverage_threshold | 输出未覆盖区域,交给 pytest-case-create |
193
+ | score < coverage_threshold | 输出未覆盖区域,交给 Step 5(按 references/case-create.md 执行) |
196
194
  | score ≤ previous_score(非首轮) | 输出"无改进",提前退出外层 loop |
197
195
 
198
196
  ## 失败处理
@@ -223,4 +221,4 @@ uv run pytest "{test_dir}" --cov="{target}" --cov-report=term --cov-report=json:
223
221
  2. 不要修改源码或测试文件
224
222
  3. 不要跳过质量检查只看覆盖率
225
223
  4. 不要主观判断测试质量,只做可程序化检查的判断
226
- 5. 不要忽略 coverage.json 解析错误
224
+ 5. 不要忽略 coverage.json 解析错误
@@ -1,9 +1,7 @@
1
- ---
2
- name: pytest-env-ensure
3
- description: |
4
- 检查 Python uv 项目环境并加载测试代理配置。验证 uv 项目结构、检查并安装依赖插件、读取配置清单。
5
- 适用:测试代理启动前的环境准备,任何需要验证 pytest 运行环境的场景。
6
- 不适用:非 uv 管理的 Python 项目、非测试相关的环境检查。
1
+ > **原 skill**: `pytest-env-ensure`(已合并入 pytest)
2
+ > **适用**: 测试代理启动前的环境准备,任何需要验证 pytest 运行环境的场景。
3
+ > **不适用**: 非 uv 管理的 Python 项目、非测试相关的环境检查。
4
+
7
5
  ---
8
6
 
9
7
  # 环境检查与配置加载
@@ -50,7 +48,7 @@ description: |
50
48
 
51
49
  ## 阶段二:依赖检查与安装
52
50
 
53
- **输入**:读取 `references/config.md` 的 dependencies 清单
51
+ **输入**:读取 `config.md` 的 dependencies 清单
54
52
 
55
53
  **操作**:
56
54
 
@@ -136,7 +134,7 @@ markers = [
136
134
 
137
135
  **操作**:
138
136
 
139
- 1. 读取 `references/config.md`
137
+ 1. 读取 `config.md`
140
138
  2. 解析配置项:dependencies、env、loops、metrics(unit + integration)、naming、types
141
139
  3. 输出配置对象给调用方(agent)
142
140
 
@@ -195,4 +193,4 @@ markers = [
195
193
  2. 不要安装 install 为 null 的依赖(系统级工具)
196
194
  3. 不要忽略 required 依赖的失败
197
195
  4. 不要修改 config.md 文件内容
198
- 5. 不要预设任何项目特定的依赖或配置
196
+ 5. 不要预设任何项目特定的依赖或配置
@@ -1,9 +1,7 @@
1
- ---
2
- name: pytest-execute
3
- description: |
4
- 执行 pytest 测试用例并输出测试报告。根据 test_type 选择对应测试目录,运行用例并解析结果。
5
- 适用:测试代理的测试执行阶段,运行已创建的用例并收集结果。
6
- 不适用:创建测试用例(使用 pytest-case-create)、修复失败用例(使用 pytest-case-fix)。
1
+ > **原 skill**: `pytest-execute`(已合并入 pytest)
2
+ > **适用**: 测试代理的测试执行阶段,运行已创建的用例并收集结果。
3
+ > **不适用**: 创建测试用例(使用 pytest-case-create)、修复失败用例(使用 pytest-case-fix)。
4
+
7
5
  ---
8
6
 
9
7
  # 测试执行
@@ -32,7 +30,7 @@ description: |
32
30
 
33
31
  - 测试报告(通过数/失败数/跳过数)
34
32
  - 失败详情列表(文件路径、用例名、错误类型、错误信息、堆栈)
35
- - 决策结论(全部通过 → 回到 coverage-analyze;有失败 → 交给 case-fix)
33
+ - 决策结论(全部通过 → 回到 Step 4(按 references/coverage-analyze.md 执行);有失败 → 交给 case-fix)
36
34
 
37
35
  ---
38
36
 
@@ -126,8 +124,8 @@ tests/unit/xxx/test_MyService.py:15
126
124
 
127
125
  | 条件 | 动作 |
128
126
  |------|------|
129
- | 全部通过(failed=0, error=0) | 输出"全部通过",回到 coverage-analyze |
130
- | 有失败(failed>0 或 error>0) | 输出失败详情,交给 pytest-case-fix |
127
+ | 全部通过(failed=0, error=0) | 输出"全部通过",回到 Step 4(按 references/coverage-analyze.md 执行) |
128
+ | 有失败(failed>0 或 error>0) | 输出失败详情,交给 Step 7(按 references/case-fix.md 执行) |
131
129
 
132
130
  ## 失败处理
133
131
 
@@ -152,4 +150,4 @@ tests/unit/xxx/test_MyService.py:15
152
150
  2. 不要跳过失败的用例
153
151
  3. 不要混合 unit 和 integration 的测试
154
152
  4. 不要忽略 pytest 执行错误
155
- 5. 不要使用 --tb=long(堆栈过长影响分析)
153
+ 5. 不要使用 --tb=long(堆栈过长影响分析)
@@ -1,11 +1,7 @@
1
- ---
2
- name: pytest-sample
3
- description: |
4
- 在当前工程 src/ 下创建 pytest-sample 目录,注入一批 demo 类代码。
5
- 覆盖纯函数、HTTP Mock、DB Mock、文件系统、时间依赖、随机值、环境变量、状态机等多种测试场景。
6
- demo 代码中故意注入了 15 个 bug(分 3 个难度梯度),用于触发测试代理的 create→test→fix 循环。
7
- 适用:首次使用 pytest skill 前的演示验证、测试流程的端到端测试。
8
- 不适用:生产代码、非测试目的的代码生成。
1
+ > **原 skill**: `pytest-sample`(已合并入 pytest,通过 test_type=sample 触发)
2
+ > **适用**: 首次使用 pytest skill 前的演示验证、测试流程的端到端测试。
3
+ > **不适用**: 生产代码、非测试目的的代码生成。
4
+
9
5
  ---
10
6
 
11
7
  # Demo 样例代码注入
@@ -15,7 +11,7 @@ description: |
15
11
  本 Skill 采用 **顺序执行** 工作流:
16
12
 
17
13
  1. **创建目录**:在 src/ 下创建 pytest-sample 包目录
18
- 2. **写入文件**:从 references/src/pytest-sample/ 读取模板,写入到 src/pytest-sample/
14
+ 2. **写入文件**:从 src/pytest-sample/ 读取模板,写入到 src/pytest-sample/
19
15
  3. **验证**:检查所有文件语法正确
20
16
 
21
17
  ## 输入
@@ -40,7 +36,7 @@ description: |
40
36
 
41
37
  ## 阶段二:写入文件
42
38
 
43
- 从 `references/src/pytest-sample/` 目录读取以下模板文件,写入到 `src/pytest-sample/`:
39
+ 从 `src/pytest-sample/` 目录读取以下模板文件,写入到 `src/pytest-sample/`:
44
40
 
45
41
  | 文件 | 覆盖场景 |
46
42
  |------|---------|
@@ -151,7 +147,7 @@ demo 代码中故意注入了 15 个 bug,分为 3 个难度梯度,用于尽
151
147
  ## 一定要做
152
148
 
153
149
  1. 必须在 src/pytest-sample/ 目录下创建文件
154
- 2. 必须从 references/src/pytest-sample/ 读取模板内容写入
150
+ 2. 必须从 src/pytest-sample/ 读取模板内容写入
155
151
  3. 创建后必须验证语法正确
156
152
  4. 必须输出场景覆盖说明
157
153
  5. 必须保留 demo 中的故意 bug,不要修复
@@ -161,4 +157,4 @@ demo 代码中故意注入了 15 个 bug,分为 3 个难度梯度,用于尽
161
157
  1. 不要修改 src/ 下已有的其他文件
162
158
  2. 不要在 demo 代码中导入项目特定的三方库
163
159
  3. 不要跳过语法验证
164
- 4. 不要修复 demo 中的故意 bug(它们是设计意图)
160
+ 4. 不要修复 demo 中的故意 bug(它们是设计意图)
@@ -1,10 +1,7 @@
1
- ---
2
- name: pytest-suitability-check
3
- description: |
4
- 分析源码包目录中的每个类,判断是否适合创建指定类型的测试(ut/it)。
5
- 递归扫描子目录,逐个类分类判定,返回可测试类清单。
6
- 适用:测试代理的适用性评估阶段,在创建用例前过滤不适合的类。
7
- 不适用:非 Python 项目、非测试类型判断。
1
+ > **原 skill**: `pytest-suitability-check`(已合并入 pytest)
2
+ > **适用**: 测试代理的适用性评估阶段,在创建用例前过滤不适合的类。
3
+ > **不适用**: 非 Python 项目、非测试类型判断。
4
+
8
5
  ---
9
6
 
10
7
  # 模块适用性评估
@@ -221,4 +218,4 @@ IT 仅适合有外部依赖可集成的类。
221
218
  3. 不要按文件/模块整体判断(必须逐个类)
222
219
  4. 不要对 ut 类型做过滤
223
220
  5. 不要将空类或纯 ABC 纳入清单
224
- 6. 不要主观臆断分类,必须基于信号规则
221
+ 6. 不要主观臆断分类,必须基于信号规则
@@ -7,7 +7,7 @@
7
7
  | **编排者** | 宿主内置 agent + 技能 prompt | 自定义 `work` agent(`mode: primary`) |
8
8
  | **编排指令来源** | `using-superpowers` bootstrap + 技能 | agent 定义文件本身 |
9
9
  | **Worker** | 宿主内置 `general-purpose` | 宿主内置 `explore` / `general` |
10
- | **自定义 agent** | 无 | 3 个(lint/scrum/fastcode) |
10
+ | **自定义 agent** | 无 | 2 个(scrum/fastcode);lint 已改为纯 skill |
11
11
  | **技能系统** | 14 个技能,通过 `skill` 工具加载 | harness 自己的技能系统 |
12
12
  | **平台** | 跨平台(11+ harness) | 仅 opencode |
13
13
 
@@ -44,7 +44,7 @@ Superpowers 是一个跨平台的 coding agent 增强插件,通过 **skills(
44
44
  |------|------------|-------------------|
45
45
  | 编排者 | 宿主内置 agent + 技能 prompt | 自定义 `work` agent(`mode: primary`) |
46
46
  | Worker | 宿主内置 `general-purpose` | 宿主内置 `explore` / `general` |
47
- | 自定义 agent | 无 | 3 个(lint/scrum/fastcode) |
47
+ | 自定义 agent | 无 | 2 个(scrum/fastcode);lint 已改为纯 skill |
48
48
  | 平台 | 跨平台(11+ harness) | 仅 opencode |
49
49
 
50
50
  ## 模块索引
package/agents/scrum.md DELETED
@@ -1,65 +0,0 @@
1
- ---
2
- description: |
3
- 将用户需求转化为敏捷用户故事,并使用Scrum理念开发并交付制品
4
- 适用场景:任意需求,特别适合多步骤任务场景。
5
- 不适用场景:无
6
- mode: primary
7
- temperature: 0.2
8
- permission: allow
9
- steps: 200
10
- ---
11
-
12
- <EXTREMELY-IMPORTANT>
13
- 你是一个编排 agent,不是实现 agent。你的工作是规划、派发、审查、裁决——不是写代码。
14
-
15
- If you think there is even a 1% chance you should dispatch a subagent instead of
16
- doing something yourself, you ABSOLUTELY MUST dispatch a subagent.
17
-
18
- IF A TASK INVOLVES WRITING/EDITING CODE, READING SOURCE FILES, OR RUNNING TESTS,
19
- YOU DO NOT HAVE A CHOICE. YOU MUST DISPATCH A SUBAGENT.
20
-
21
- This is not negotiable. You cannot rationalize your way out of this.
22
- </EXTREMELY-IMPORTANT>
23
-
24
- ## 角色
25
- 你是一个敏捷团队的Scrum Master (简称 SM),负责协调团队成员,分解需求、执行任务、交付制品。成员信息:
26
- - subagent : `@general` 有读写权限
27
- - 数量 : 10个,可并发执行
28
-
29
- ## 术语对照表
30
- - Release : 对应一次完整对话,可能包含一轮或多伦对话,可能提出一个或多个用户故事
31
- - Sprint : 对应一轮对话,直接对应我们的工作流,一轮对话就是一轮完整的Scrum Sprint,需要交付制品
32
- - User Story : 用户的每一轮输入对我们来说就是一个用户故事,可能是全新需求,已有功能补充,缺陷修复,这些故事可能密切相关,也可能独立存在
33
- - Increment : 每一轮对话(sprint)交付的制品,可能是直接答复,可能是源代码,可能是文档
34
- - Backlog : 一次完整对话中(Release), 基于用户故事拆分的所有任务列表
35
- - Todos : 每一轮对话(sprint),基于用户故事拆分的任务列表
36
- - Review : 每一轮对话(sprint)任务完成,最终交付制品前的审查, 用于评估制品质量,发现并修复问题
37
-
38
- ## 变量
39
- - root_dir : 项目根目录
40
- - session_id : 会话ID,用于标识当前对话
41
- - doc_dir : 文档目录,所有文档制品都存储在这个目录下,绝对路径为:<`root_dir>/.webwork/harness/scrum/<session_id>`>
42
-
43
- ## Sprint 工作流
44
- 每一轮对话都严格按照以下工作(Sprint):
45
- 1. 需求分析 : 产品经理 @general PM 将用户输入分解为用户故事,写入`<doc_dir>/backlog.md`中 (包含状态信息)
46
- 2. Todos创建: SM 分析用户故事,将任务分配给团队成员(最多10个 @general subagent),使用工具 `todowrite` 生成todos列表(如果有上一轮todos,完全覆盖)
47
- - 每一项todo都确定了执行先后顺序,分配的subagent数量,是否可并发执行
48
- - 无论本次用户故事是否与上一轮用户故事相关,都需要重新生成todos列表,不能直接使用上一轮todos列表
49
- 3. 任务执行: 按照任务顺序,优先并行执行,执行后自己更新 todos列表状态
50
- 4. 任务审查: 所有任务执行完成后, SM 审查所有任务执行结果,取人todos状态 ,如发现异常,则协调任务分配给多个 @general subagent 并发修复问题
51
- - 修复后再检查,最多检查3次
52
- 5. 总结与交付,交付制品包括:
53
- - 回复总结
54
- - review报告 `<doc_dir>/review.md`
55
- - commit代码改动(如果有)
56
- - backlog列表状态(更新)
57
-
58
- ## 流程图
59
- 每一轮对话都严格按照以下工作流进行:
60
- - 用户输入(用户故事)
61
- - SM 分析用户输入,生成todos列表
62
- - SM 分发todos列表给subagent执行
63
- - SM 监控subagent执行进度,协调任务分配
64
- - SM 汇总所有发现,生成审计报告
65
- - SM 交付制品