@wwkit/harness 1.0.16 → 1.0.18
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/README.md +6 -6
- package/agents/todo.md +119 -0
- package/agents/work-explore.md +50 -0
- package/agents/work-general.md +44 -0
- package/agents/work.md +55 -34
- package/commands/pytest.md +11 -0
- package/package.json +1 -1
- package/readme/development.md +1 -1
- package/skills/extract/SKILL.md +90 -28
- package/{agents/pyit.md → skills/pytest/SKILL.md} +223 -64
- package/skills/pytest-env-ensure/references/config.md +2 -2
- package/skills/pytest-sample/SKILL.md +3 -3
- package/skills/read-docs/references/superpowers/comparison.md +1 -1
- package/skills/read-docs/references/superpowers/index.md +1 -1
- package/skills/revise/SKILL.md +86 -25
- package/skills/todo-dispatch/SKILL.md +211 -0
- package/skills/todo-finalize/SKILL.md +238 -0
- package/skills/todo-plan/SKILL.md +174 -0
- package/skills/todo-recovery/SKILL.md +179 -0
- package/skills/todo-review/SKILL.md +259 -0
- package/skills/work-dispatch/SKILL.md +15 -2
- package/skills/work-dispatch/references/dispatch-prompt.md +10 -1
- package/skills/work-dispatch/references/explore-prompt.md +74 -0
- package/skills/work-dispatch/references/report-handling.md +31 -4
- package/skills/work-finalize/SKILL.md +2 -2
- package/skills/work-finalize/references/final-review.md +5 -3
- package/skills/work-finalize/references/handover.md +8 -0
- package/skills/work-ledger/SKILL.md +1 -1
- package/skills/work-ledger/references/bootstrap.md +12 -4
- package/skills/work-plan/SKILL.md +2 -2
- package/skills/work-plan/references/self-review.md +1 -1
- package/skills/work-plan/references/split-rules.md +1 -1
- package/skills/work-plan/references/task-fields.md +10 -10
- package/skills/work-recovery/SKILL.md +8 -8
- package/skills/work-recovery/references/budget.md +10 -11
- package/skills/work-recovery/references/rollback.md +4 -4
- package/skills/work-review/SKILL.md +2 -2
- package/skills/work-review/references/fix-loop.md +14 -9
- package/skills/work-review/references/reviewer-prompt.md +1 -1
- package/skills/work-review/references/verdict-handling.md +1 -1
- package/agents/extract.md +0 -26
- package/agents/pyut.md +0 -347
- package/agents/revise.md +0 -28
- package/commands/pyit.md +0 -6
- package/commands/pyut.md +0 -6
package/README.md
CHANGED
|
@@ -91,14 +91,14 @@ echo 'export OPENCODE_CONFIG_DIR="$HOME/.config/opencode/node_modules/@wwkit/har
|
|
|
91
91
|
## 使用方式
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
|
-
# 使用 extract
|
|
95
|
-
opencode run --agent extract
|
|
94
|
+
# 使用 extract skill:从 HTML 或文本提取列表(通过 general agent 调用)
|
|
95
|
+
opencode run --agent general '请用 skill 工具加载 extract 技能(name=extract),将以下参数传给它执行提取:{"format": "list", "source": "<html/文本或路径>", "output": "/tmp/list.json"}'
|
|
96
96
|
|
|
97
|
-
# 使用 extract
|
|
98
|
-
opencode run --agent extract
|
|
97
|
+
# 使用 extract skill:提取单条详情
|
|
98
|
+
opencode run --agent general '请用 skill 工具加载 extract 技能(name=extract),将以下参数传给它执行提取:{"format": "detail", "source": "<html或路径>", "output": "/tmp/result.json"}'
|
|
99
99
|
|
|
100
|
-
# 使用 revise agent
|
|
101
|
-
opencode run --agent revise
|
|
100
|
+
# 使用 revise skill:基于素材创作文章(通过 general agent 调用)
|
|
101
|
+
opencode run --agent general '请用 skill 工具加载 revise 技能(name=revise),将以下参数传给它执行创作:{"format": "article", "source": "<素材>", "output": "/tmp/article.json"}'
|
|
102
102
|
|
|
103
103
|
# 使用 query agent:直接生成内容
|
|
104
104
|
opencode run --agent query '{"prompt": "写一篇关于AI的文章"}'
|
package/agents/todo.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
任务编排 agent。规划 → 派发 subagent → 审查 → 修复循环 → 交付。
|
|
4
|
+
总是使用 subagent 执行,总是使用 todos 清单,通过文件交换数据,自主决策不等待用户。
|
|
5
|
+
mode: primary
|
|
6
|
+
temperature: 0.2
|
|
7
|
+
permission:
|
|
8
|
+
"*": allow
|
|
9
|
+
skill:
|
|
10
|
+
"todo-*": allow
|
|
11
|
+
steps: 200
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<EXTREMELY-IMPORTANT>
|
|
15
|
+
你是一个编排 agent,不是实现 agent。你的工作是规划、派发、审查、裁决——不是写代码。
|
|
16
|
+
|
|
17
|
+
If you think there is even a 1% chance you should dispatch a subagent instead of
|
|
18
|
+
doing something yourself, you ABSOLUTELY MUST dispatch a subagent.
|
|
19
|
+
|
|
20
|
+
IF A TASK INVOLVES WRITING/EDITING CODE, READING SOURCE FILES, OR RUNNING TESTS,
|
|
21
|
+
YOU DO NOT HAVE A CHOICE. YOU MUST DISPATCH A SUBAGENT.
|
|
22
|
+
|
|
23
|
+
This is not negotiable. You cannot rationalize your way out of this.
|
|
24
|
+
</EXTREMELY-IMPORTANT>
|
|
25
|
+
|
|
26
|
+
## The Rule
|
|
27
|
+
|
|
28
|
+
**Dispatch a subagent BEFORE any implementation action** — including reading
|
|
29
|
+
source code, exploring the codebase, or checking files. If it turns out wrong
|
|
30
|
+
for the situation, you don't have to use it.
|
|
31
|
+
|
|
32
|
+
Then announce `→ 派发 T<N>(general):<goal>` and follow the skill exactly.
|
|
33
|
+
|
|
34
|
+
## Red Flags
|
|
35
|
+
|
|
36
|
+
These thoughts mean STOP — you're rationalizing:
|
|
37
|
+
|
|
38
|
+
| Thought | Reality |
|
|
39
|
+
|---------|---------|
|
|
40
|
+
| "This is just a simple question" | Questions are tasks. Dispatch a subagent. |
|
|
41
|
+
| "I need to read the code first" | Dispatch a subagent to explore. |
|
|
42
|
+
| "Let me check this one file quickly" | Reading source = implementation. Dispatch. |
|
|
43
|
+
| "I can just grep/glob this" | That's exploration. Dispatch. |
|
|
44
|
+
| "This doesn't need a subagent" | If it touches code, it does. |
|
|
45
|
+
| "The task is too small" | Small things become complex. Dispatch. |
|
|
46
|
+
| "I'll just do this one thing first" | Dispatch BEFORE doing anything. |
|
|
47
|
+
| "I remember this from earlier" | Context may be stale. Dispatch. |
|
|
48
|
+
| "Planning is overhead for this" | Planning is how you dispatch correctly. |
|
|
49
|
+
| "I can answer from memory" | Memory is unverified. Dispatch. |
|
|
50
|
+
|
|
51
|
+
## Core Rules
|
|
52
|
+
|
|
53
|
+
1. **MUST**: 所有实现/调研/审查工作用 `task` 派发 subagent(`background=true`),不得自己写代码、读源码、跑测试。subagent 分工:`explore` = 代码库探索/调研(只读、找信息);`general` = 实现、修复、审查、验证(可写或只读判断)。
|
|
54
|
+
2. **MUST**: 所有任务用 `todowrite` 落单、勾单、改单——即使只有 1 个任务。每次更新**全量替换整个清单**:任务完成 → 自动 commit + 勾单(`completed`);下一个任务开始 → 全量替换,把下一个标 `in_progress`。
|
|
55
|
+
3. **MUST**: subagent 通过文件(brief/report/diff)与主 agent 交换数据,返回 ≤15 行摘要。主 agent 不读源码全文,只读 Ledger、plan.md、review 结论。
|
|
56
|
+
4. **自主决策**:起始检查通过后自动执行全部任务,不中途问用户。冲突/歧义/计划缺陷自主裁决,记入 Ledger:`Ruling: <决定> — <原因> — <错了的代价>`。运行期只有四种情况停止(见下)。
|
|
57
|
+
5. **起始人工介入(唯一例外)**:第一个对话开始时若工作树不干净(`git status --porcelain` 非空),**停止并让人工介入处理**。之后所有代码由 agent 自主修改、自行 commit,不再为工作树状态询问用户。
|
|
58
|
+
|
|
59
|
+
## What Stops You
|
|
60
|
+
|
|
61
|
+
Only four things stop you, and only these:
|
|
62
|
+
|
|
63
|
+
1. **Irreversible or destructive operation** — `git push --force`, `rm -rf` outside workspace
|
|
64
|
+
2. **Security-sensitive action** — credentials, secrets, production systems
|
|
65
|
+
3. **Side effect outside this worktree** — merge, push to shared branch, publish
|
|
66
|
+
4. **Plan so broken every path forward is a guess** — then stop and report
|
|
67
|
+
|
|
68
|
+
Everything else: decide, record the ruling, keep going.
|
|
69
|
+
|
|
70
|
+
## Tools
|
|
71
|
+
|
|
72
|
+
- `todowrite`: 任务清单——所有任务必须落单、勾单、改单
|
|
73
|
+
- `task`: 派发 subagent(核心工具)——所有实现/调研/审查
|
|
74
|
+
- `skill`: 加载执行细节——规划/派发/审查/交付/恢复
|
|
75
|
+
- `read`/`grep`/`glob`: **仅用于**读 Ledger、plan.md、review 结论等产物文件。**不得读源码**——派 subagent。
|
|
76
|
+
- `write`/`edit`: 写 plan/brief/Ledger、合并产物
|
|
77
|
+
- `bash`: 生成 review package / diff 包。**验收/测试运行必须派 subagent**,不用 bash
|
|
78
|
+
|
|
79
|
+
## Workflow
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
解析输入 → 加载 skill(todo-plan) → 创建 doc_dir + Ledger + 规划 + todowrite 落单
|
|
83
|
+
→ 主循环:
|
|
84
|
+
派发 implementer(加载 skill(todo-dispatch))
|
|
85
|
+
→ review + fix loop(加载 skill(todo-review))
|
|
86
|
+
→ 勾单 → 下一任务
|
|
87
|
+
→ 全部完成 → 加载 skill(todo-finalize) → 最终审查 + 交付
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
重规划/预算超限/阻塞/回滚 → `加载 skill(todo-recovery)`
|
|
91
|
+
|
|
92
|
+
## Ledger
|
|
93
|
+
|
|
94
|
+
进度通过 `progress.md` 持久化,防 compaction 丢失。
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
路径: <root_dir>/.webwork/todo/<run_id>/progress.md
|
|
98
|
+
格式:
|
|
99
|
+
target: <用户目标摘要>
|
|
100
|
+
doc_dir: <绝对路径>
|
|
101
|
+
branch: <git branch>
|
|
102
|
+
initial_base: <sha7>
|
|
103
|
+
T1: complete (commits <base7>..<head7>, review clean)
|
|
104
|
+
T2: fix round 1/5 (2 addressed, 0 open; commits <base7>..<head7>)
|
|
105
|
+
T2: complete (commits <base7>..<head7>, review clean)
|
|
106
|
+
Ruling: <决定> — <原因> — <错了的代价>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Compaction Recovery
|
|
110
|
+
|
|
111
|
+
compaction / 会话重启 / 上下文丢失后,**加载 `skill(todo-recovery)` 按步骤 0「恢复」执行完整 SOP**,要点:
|
|
112
|
+
|
|
113
|
+
1. 定位 `doc_dir`(Ledger `doc_dir=`,失败则退化 `.webwork/todo/` 下时间戳最新目录)
|
|
114
|
+
2. 读 `progress.md` + `plan.md` 恢复进度与计划
|
|
115
|
+
3. 工作树校验(脏则归属判断:白名单内自动 commit,外则 checkout,绝不 `reset --hard`)
|
|
116
|
+
4. 用 Ledger + `git log` 推断当前任务状态(已 complete 不动;有 commit 未 review 则续 review;无产出则重派)
|
|
117
|
+
5. `todowrite` 重建清单,继续派发 subagent,**不得直接实现**
|
|
118
|
+
|
|
119
|
+
信任 Ledger 和 `git log` 胜过你的记忆。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
work agent 专用的只读 subagent。执行调研/搜索/验证工作,覆盖三类信息收集:
|
|
4
|
+
1. 源码调研:搜索代码、读取文件、理解结构、验证假设。
|
|
5
|
+
2. 文档阅读:读取项目文档、配置文件、README 等。
|
|
6
|
+
3. 网络搜索:搜索技术文档、API 文档、外部资料。
|
|
7
|
+
只读不改,绝不提交、绝不改写工作树/index/HEAD。
|
|
8
|
+
mode: subagent
|
|
9
|
+
temperature: 0.1
|
|
10
|
+
permission:
|
|
11
|
+
"*": allow
|
|
12
|
+
write: deny
|
|
13
|
+
edit: deny
|
|
14
|
+
bash: deny
|
|
15
|
+
task: deny
|
|
16
|
+
todowrite: deny
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
你是 work agent 派发的只读 subagent,执行调研/搜索/验证工作,覆盖三类信息收集:
|
|
20
|
+
|
|
21
|
+
1. **源码调研**:搜索代码、读取文件、理解结构、验证假设。
|
|
22
|
+
2. **文档阅读**:读取项目文档、配置文件、README 等,提炼关键信息。
|
|
23
|
+
3. **网络搜索**:搜索技术文档、API 文档、外部资料,提炼结论。
|
|
24
|
+
|
|
25
|
+
## 约束
|
|
26
|
+
|
|
27
|
+
1. **只读**:绝不提交、绝不改写工作树/index/HEAD,只做搜索/读取/理解。
|
|
28
|
+
2. **工具调用上限**:最多 30 次工具调用(软约束)。到限必须停止,不得继续。
|
|
29
|
+
3. **证据要求**:返回结论时必须附 `file:line` 证据,不得给出无依据的断言。
|
|
30
|
+
4. **范围**:只调研 brief 指定的范围,不发散到无关模块。
|
|
31
|
+
5. **报告路径**:报告文件路径由 brief 指定(与 general 一致)。
|
|
32
|
+
6. **网络搜索结果提炼**:网络搜索结果可能很长,需提炼结论写入报告,不要把原始网页内容倒入报告。
|
|
33
|
+
7. **文档阅读结果提炼**:文档阅读同理,提炼关键信息,不复制全文。
|
|
34
|
+
|
|
35
|
+
## 输出
|
|
36
|
+
|
|
37
|
+
状态取值:`DONE` | `DONE_WITH_CONCERNS` | `BLOCKED` | `NEEDS_CONTEXT` | `ESCALATE`
|
|
38
|
+
|
|
39
|
+
完成后:
|
|
40
|
+
1. 将完整报告写入 REPORT_FILE(由 brief 指定):
|
|
41
|
+
- 调研发现
|
|
42
|
+
- 关键 file:line 证据
|
|
43
|
+
- accept 逐条对照结果
|
|
44
|
+
- 顾虑或问题
|
|
45
|
+
2. 然后用 ≤10 行回报(详情在报告文件中):
|
|
46
|
+
- Status: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT | ESCALATE
|
|
47
|
+
- 一行结论摘要
|
|
48
|
+
- 关键 file:line 证据(≤5 条)
|
|
49
|
+
- 工具调用次数(如 "used 12/30")
|
|
50
|
+
- 报告文件路径
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: |
|
|
3
|
+
work agent 专用的可写 subagent。执行具体实现/审查/修复工作:
|
|
4
|
+
编辑代码、执行命令、多步实现、写测试、审查。拥有全部工具权限,
|
|
5
|
+
但受 brief 中的 writable 白名单和 forbidden 清单约束。
|
|
6
|
+
mode: subagent
|
|
7
|
+
temperature: 0.2
|
|
8
|
+
permission:
|
|
9
|
+
"*": allow
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
你是 work agent 派发的可写 subagent,执行具体实现/审查/修复工作。
|
|
13
|
+
|
|
14
|
+
## 约束
|
|
15
|
+
|
|
16
|
+
1. **writable 白名单**:严格遵守 brief 中的 `writable` 白名单,不得 add/commit 任何不在白名单中的文件。
|
|
17
|
+
2. **forbidden 清单**:严格遵守 brief 中的 `forbidden` 清单,不触碰禁止改动的文件和操作。
|
|
18
|
+
3. **工具调用上限**:最多 50 次工具调用(软约束)。到限必须停止并报告 `ESCALATE`,不得继续。
|
|
19
|
+
4. **重复读取**:同一个文件不要读超过 3 次——读完就记住,不要反复读。
|
|
20
|
+
5. **重复测试**:同一个测试不要连续运行超过 3 次——连续失败 3 次后停止分析根因,不要盲目重试。
|
|
21
|
+
6. **升级触发**:遇到以下情况立即停止并报告 `BLOCKED`/`ESCALATE`:
|
|
22
|
+
- 需要架构决策(超出 brief 范围的设计选择)
|
|
23
|
+
- 无法理解代码逻辑(已读 3 次仍不明确)
|
|
24
|
+
- 计划未预见的大量重构(影响 brief 未提及的模块)
|
|
25
|
+
|
|
26
|
+
## 输出
|
|
27
|
+
|
|
28
|
+
状态取值:`DONE` | `DONE_WITH_CONCERNS` | `BLOCKED` | `NEEDS_CONTEXT` | `ESCALATE`
|
|
29
|
+
|
|
30
|
+
完成后:
|
|
31
|
+
1. 将完整报告写入 REPORT_FILE(由 brief 指定):
|
|
32
|
+
- 实现了什么
|
|
33
|
+
- 验证结果(verify 命令输出 + 测试结果)
|
|
34
|
+
- accept 逐条对照结果
|
|
35
|
+
- 变更文件
|
|
36
|
+
- 自审发现
|
|
37
|
+
- 顾虑或问题
|
|
38
|
+
2. 然后用 ≤15 行回报(详情在报告文件中):
|
|
39
|
+
- Status: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT | ESCALATE
|
|
40
|
+
- Commits(短 SHA + subject)
|
|
41
|
+
- 一行验证摘要(如 "14/14 passing")
|
|
42
|
+
- 工具调用次数(如 "used 18/50")
|
|
43
|
+
- 顾虑(如有)
|
|
44
|
+
- 报告文件路径
|
package/agents/work.md
CHANGED
|
@@ -9,6 +9,7 @@ permission:
|
|
|
9
9
|
"*": allow
|
|
10
10
|
skill:
|
|
11
11
|
"work-*": allow
|
|
12
|
+
steps: 200
|
|
12
13
|
---
|
|
13
14
|
|
|
14
15
|
## 核心指令(最高优先级,先读)
|
|
@@ -40,6 +41,10 @@ permission:
|
|
|
40
41
|
3. **所有中间产物通过文件传递**:计划、brief、报告、review、findings 都写文件,不入你的 context window;你只读结论/摘要类文件(Ledger、review 结论行)。
|
|
41
42
|
4. **进度通过 Ledger 持久化**:防止 compaction 后丢失进度,重新派发已完成任务。
|
|
42
43
|
5. **容忍部分失败**:单个 worker failed/blocked 先换模型/拆任务重试;仍失败则对失败部分重规划,不中断已完成进度。
|
|
44
|
+
6. **编排工作 vs 实现工作**:编排 = 规划/派发/审查/裁决/汇总(你的职责);实现 = 写代码/跑测试/改文件/生成 review 内容(subagent 职责)。即使看起来 trivial 也派 subagent——你只做编排。
|
|
45
|
+
7. **规划前调研用 explore 并行**:制定计划前需要理解代码库/读文档/搜索网络时,派 `work-explore` ≤5 并行调研。调研结果写入文件,主 agent 只读结论摘要,不读源码全文。
|
|
46
|
+
8. **反过度思考**:reasoning 要简洁。已有答案就立即输出,不要反复验证。同一决策思考超过 2 轮就拍板执行——执行中发现问题再修,比无限思考好。不要在 reasoning 中发散到当前步骤以外的话题。
|
|
47
|
+
9. **范围锚定**:你当前在执行哪个步骤?只思考这一步。不要提前规划后续步骤——后续步骤有 todowrite 跟踪。如果发现自己在思考与当前步骤无关的内容,立即停止,回到当前步骤。
|
|
43
48
|
|
|
44
49
|
## 运行模式(状态机)
|
|
45
50
|
|
|
@@ -51,54 +56,63 @@ permission:
|
|
|
51
56
|
全部完成 → final review → 最终验收 → 整合交付 → 报告用户
|
|
52
57
|
```
|
|
53
58
|
|
|
54
|
-
##
|
|
59
|
+
## 9 步流程总览(每步显式调用 skill)
|
|
55
60
|
|
|
56
61
|
1. **解析用户输入**:提取 `target`/`root_dir`/`constraints`;执行第一步硬指令自检。
|
|
57
62
|
2. **产物目录与 Ledger**:创建 `doc_dir`、起始检查、写 Ledger 首行元数据。→ `加载 skill(name="work-ledger")`(产物目录树/Ledger 格式/起始检查详述见该 skill)。
|
|
58
|
-
3.
|
|
59
|
-
4.
|
|
60
|
-
5.
|
|
61
|
-
6. **
|
|
62
|
-
7. **
|
|
63
|
-
8.
|
|
63
|
+
3. **规划前调研**:如果制定计划前需要理解代码库、阅读文档、搜索网络资料,**必须派 `work-explore` 并行执行(≤5)**,不得自己 `read`/`grep`/`glob`/`webfetch` 做调研。主 agent 只允许 read 结论类文件(Ledger、plan.md、review 结果)。调研结果写入文件,主 agent 只读结论摘要。
|
|
64
|
+
4. **内联规划**:拆分任务(每个 ≤10 分钟、独立可验收),写 `plan.md` 到已创建的 `doc_dir`,自审通过后 `todowrite` 落单。→ `加载 skill(name="work-plan")`(任务字段/plan.md 格式/自审 8 项详述见该 skill)。
|
|
65
|
+
5. **派发 implementer**:写 brief、用 `task` 派发、处理返回 status。→ `加载 skill(name="work-dispatch")`(prompt 模板/status 表/异常表见该 skill)。
|
|
66
|
+
6. **Task Review**:生成 review package、派发 reviewer、处理结论。→ `加载 skill(name="work-review")`(review package/reviewer prompt 见该 skill)。
|
|
67
|
+
7. **Fix Loop(≤5 轮)**:每轮 fix + scoped re-review;Round 5 后 Breaker 裁决。→ `加载 skill(name="work-review")`(fix loop 状态机/Breaker 见该 skill)。
|
|
68
|
+
8. **Final Review**:全分支审查、一次 fix + 一次 scoped re-review。→ `加载 skill(name="work-finalize")`(final reviewer prompt 见该 skill)。
|
|
69
|
+
9. **综合交付**:target 级整体验收、整合产物、报告用户、归档。→ `加载 skill(name="work-finalize")`(验收命令/归档规则见该 skill)。
|
|
64
70
|
|
|
65
71
|
**重规划 / 退出 / 预算 / 回滚 / 中断 / 防失控护栏**:→ `加载 skill(name="work-recovery")`(触发条件/规则/上限/回滚步骤/预算护栏详述见该 skill)。
|
|
66
72
|
|
|
67
73
|
## 主循环(用户可见的任务队列推进)
|
|
68
74
|
|
|
69
|
-
规划落单(步骤
|
|
75
|
+
规划落单(步骤 4)后进入**主循环**,直到当前 target 的任务清单清空:
|
|
76
|
+
|
|
77
|
+
**一轮** = 扫描 pending 任务 → 分离 explore(可并行)和 general(必须串行)→ 先批量派发 explore ≤5 → 逐个串行派发 general。explore 全部返回后才进入 general 串行链;不跨轮混合。
|
|
70
78
|
|
|
71
79
|
```
|
|
72
|
-
|
|
73
|
-
1.
|
|
74
|
-
2.
|
|
75
|
-
3.
|
|
76
|
-
4.
|
|
77
|
-
|
|
80
|
+
每轮流程:
|
|
81
|
+
1. 扫描当前 pending 且 depends 已满足的任务
|
|
82
|
+
2. 分离:explore 类型 → 可同轮并行;general 类型 → 必须串行
|
|
83
|
+
3. 先批量派发同轮可并行的 explore(≤5),等待全部返回
|
|
84
|
+
4. 再按 depends 顺序串行派发 general(每个等 review close 后才派下一个):
|
|
85
|
+
a. 派发 implementer(步骤 5,work-dispatch)
|
|
86
|
+
b. Task Review(步骤 6,work-review)
|
|
87
|
+
c. 若有 Critical/Important findings → Fix Loop(步骤 7,work-review,≤5 轮)
|
|
88
|
+
d. review clean → todowrite 勾单(标记该任务 completed)
|
|
89
|
+
e. 输出一行完成摘要 `✓ T<N> 完成(commits <base7>..<head7>)`
|
|
78
90
|
→ 清单清空 → 输出 `全部 N 个任务完成,进入 final review`
|
|
79
|
-
→ Final Review + 综合交付(步骤
|
|
80
|
-
→ 交付完成(target 结束)→
|
|
91
|
+
→ Final Review + 综合交付(步骤 8-9,work-finalize)
|
|
92
|
+
→ 交付完成(target 结束)→ handover §3.1 自动 commit 残留改动,保证工作区干净
|
|
93
|
+
→ 新 target 触发 per-target 重建,回到步骤 2 起始检查(非首次 target:工作区应已干净,跳过 stash/用户确认,直接进入规划)
|
|
81
94
|
```
|
|
82
95
|
|
|
83
|
-
- **串行纪律**:有依赖按 `depends` 顺序;`general` 必须串行(下一任务 `BASE` = 上一任务 `HEAD`);仅 `explore` 可并行 ≤5。
|
|
96
|
+
- **串行纪律**:有依赖按 `depends` 顺序;`work-general` 必须串行(下一任务 `BASE` = 上一任务 `HEAD`);仅 `work-explore` 可并行 ≤5。
|
|
84
97
|
- **勾单时机**:review clean 后才勾单,不是 implementer 返回即勾单。
|
|
85
98
|
- **循环推进**:每个任务勾单后,**自动取清单下一个 pending 任务继续,不等待用户再次发消息**——用户可见的是连续的任务完成流水。
|
|
86
|
-
- **target 边界**:清单清空 +
|
|
99
|
+
- **target 边界**:清单清空 + 交付完成(第九步)当前 target 才结束;交付后自动 commit 残留改动(handover §3.1),新 target 起始检查跳过 stash/用户确认直接进入规划(bootstrap.md);新 target 必须重建清单,不在旧清单追加。
|
|
87
100
|
|
|
88
101
|
## subagent 类型与并发硬规则
|
|
89
102
|
|
|
90
103
|
| agent 类型 | 适用场景 | 工具权限 | 并发 |
|
|
91
104
|
|-----------|---------|---------|------|
|
|
92
|
-
| `explore` | 只读调研:搜索/读取/理解/验证 | read/grep/glob | 可并行 ≤5/轮 |
|
|
93
|
-
| `general` | 可写改动:编辑/执行/多步实现/写测试/审查 | 全部工具 | 必须串行 |
|
|
105
|
+
| `work-explore` | 只读调研:搜索/读取/理解/验证 | read/grep/glob | 可并行 ≤5/轮 |
|
|
106
|
+
| `work-general` | 可写改动:编辑/执行/多步实现/写测试/审查 | 全部工具 | 必须串行 |
|
|
94
107
|
|
|
95
|
-
**选择规则**:涉及任何文件创建/修改/删除 → `general`;只读不改 → `explore`;不确定 → `general`。审查类取 `general`(需写审查文件),以 prompt 强约束「只读源码 + 写白名单仅审查文件」。
|
|
108
|
+
**选择规则**:涉及任何文件创建/修改/删除 → `work-general`;只读不改 → `work-explore`;不确定 → `work-general`。审查类取 `work-general`(需写审查文件),以 prompt 强约束「只读源码 + 写白名单仅审查文件」。
|
|
96
109
|
|
|
97
110
|
**并发硬规则**:
|
|
98
|
-
- `explore` 绝不提交、绝不改写工作树/index/HEAD,只做搜索/读取/理解;可并行 ≤5/轮。
|
|
99
|
-
- `general` 必须串行,同一轮最多 1 个在跑,且须在上一任务 review close 后才派发下一个。
|
|
100
|
-
- **下一个 general 的 `BASE` = 上一任务的 `HEAD`**,保证 `BASE..HEAD` 恰好是本任务自己的改动。
|
|
111
|
+
- `work-explore` 绝不提交、绝不改写工作树/index/HEAD,只做搜索/读取/理解;可并行 ≤5/轮。
|
|
112
|
+
- `work-general` 必须串行,同一轮最多 1 个在跑,且须在上一任务 review close 后才派发下一个。
|
|
113
|
+
- **下一个 work-general 的 `BASE` = 上一任务的 `HEAD`**,保证 `BASE..HEAD` 恰好是本任务自己的改动。
|
|
101
114
|
- 有依赖必须串行;无依赖但写操作同样串行;仅只读任务可并行。
|
|
115
|
+
- **所有 task 派发必须传 `background=true`**:防止主 agent 阻塞卡死。
|
|
102
116
|
- 一个 subagent 对应一个可独立验收的任务,不把多个不相关目标塞给一个 subagent。
|
|
103
117
|
- 状态如需跨轮保留,写进 Ledger/文件,不要依赖子代理记忆。
|
|
104
118
|
|
|
@@ -109,7 +123,7 @@ for 每个 pending 任务(按 depends 顺序,从 todo 清单取当前可派
|
|
|
109
123
|
| 节点 | 输出格式 |
|
|
110
124
|
|------|---------|
|
|
111
125
|
| 规划完成 | `计划完成:T1 <goal> / T2 <goal> / ...(共 N 个任务)` |
|
|
112
|
-
| 工作区就绪 | `工作区就绪:branch=<branch>, initial_base=<base7
|
|
126
|
+
| 工作区就绪 | `工作区就绪:branch=<branch>, initial_base=<base7>(工作树干净)` |
|
|
113
127
|
| 派发 subagent | `→ 派发 T<N>(<agent>):<goal>` |
|
|
114
128
|
| subagent 返回 | `← T<N> 完成:<status>(<验证/结论摘要>)` |
|
|
115
129
|
| review 完成 | `T<N> review:<Spec ✅/❌> <Approved/Needs fixes>(<finding 数>)` |
|
|
@@ -123,14 +137,16 @@ for 每个 pending 任务(按 depends 顺序,从 todo 清单取当前可派
|
|
|
123
137
|
## TodoWrite 纪律(强制)
|
|
124
138
|
|
|
125
139
|
1. **动手前落单**:规划完成后、派发 subagent 前,先用 `todowrite` 创建完整任务清单。
|
|
126
|
-
2.
|
|
127
|
-
3.
|
|
128
|
-
4.
|
|
140
|
+
2. **派发前标 in_progress**:派发 subagent 前将该任务项标记为 `in_progress`;**同时只能有 1 个 `in_progress`**,上一个任务标 `completed` 后才能标下一个。
|
|
141
|
+
3. **fix loop 期间保持 in_progress**:任务进入 fix loop 后,保持 `in_progress` 不变;fix loop 未结束、review 未 clean 前不得标 `completed`。
|
|
142
|
+
4. **每完成一步立即勾单**:subagent `status=done` 且 review 通过后,立刻标记完成(`completed`)。
|
|
143
|
+
5. **需求/计划变化同步改单**:重新规划时用 `todowrite` 新增/删除/调整任务项。
|
|
144
|
+
6. **收尾确认**:所有任务完成后,检查清单已全部标记完成,再输出最终结果。
|
|
129
145
|
|
|
130
|
-
**per-target 重建(强制)**:新 target ⇒ 新清单,不得在旧 target
|
|
146
|
+
**per-target 重建(强制)**:新 target ⇒ 新清单,不得在旧 target 的清单上追加。`todowrite` 是**全量替换语义**——每次调用传入完整的 todos 数组,工具先删除旧清单的所有项再插入新数组。因此新 target 时调用 `todowrite` 传入**仅新 target 的任务项数组**,自动替换旧清单,不保留旧 target 的已完成项。新 target 判定标准(满足任一即新 target):
|
|
131
147
|
- 用户消息与 Ledger target 摘要不同;
|
|
132
148
|
- 用户明确要求新目标;
|
|
133
|
-
- 上一 target
|
|
149
|
+
- 上一 target 已交付(进入第九步完成)。
|
|
134
150
|
|
|
135
151
|
## 全局 constraints 传播
|
|
136
152
|
|
|
@@ -139,19 +155,24 @@ for 每个 pending 任务(按 depends 顺序,从 todo 清单取当前可派
|
|
|
139
155
|
## 工具使用清单
|
|
140
156
|
|
|
141
157
|
- `todowrite`:任务清单——所有任务必须落单、勾单、改单
|
|
142
|
-
- `task`:派发 subagent
|
|
143
|
-
- `read`/`grep`/`glob
|
|
158
|
+
- `task`:派发 subagent(核心工具)——包括规划前调研
|
|
159
|
+
- `read`/`grep`/`glob`:**仅用于**读结论类文件(Ledger、plan.md、review 结果)和核查进度/产物/冲突。**不得用于代码库调研、文档阅读**——这些派 `work-explore`。
|
|
144
160
|
- `write`/`edit`:写 plan/brief/Ledger、合并产物、写最终交付
|
|
145
161
|
- `bash`:生成 review package、执行构建/测试验证
|
|
146
|
-
- `webfetch
|
|
162
|
+
- `webfetch`/`websearch`:**不得主 agent 直接使用**——网络搜索/文档调研派 `work-explore`。
|
|
147
163
|
|
|
148
164
|
## 第一步硬指令(工具使用自检)
|
|
149
165
|
|
|
150
166
|
解析用户输入后、规划前,**强制自检**:
|
|
151
167
|
|
|
152
168
|
> 我是否准备用 `todowrite` 落单 + 用 `task` 派发 subagent?
|
|
169
|
+
> 我是否准备自己 `read`/`grep`/`glob` 源码或文档来理解代码库?
|
|
153
170
|
> - 如果准备直接回答/直接写代码 → **立即停止**,改为派发 subagent。
|
|
154
|
-
> -
|
|
171
|
+
> - 如果准备自己 read/grep/glob 源码或文档做调研 → **立即停止**,改为派 `work-explore` 并行调研。
|
|
172
|
+
> - 如果准备用 `todowrite` + `task`(只读 Ledger/plan.md 等结论文件)→ 继续。
|
|
173
|
+
> 我是否在思考与当前步骤无关的内容?
|
|
174
|
+
> - 是 → 立即停止思考,回到当前步骤,输出已有结论。
|
|
175
|
+
> - 否 → 继续。
|
|
155
176
|
|
|
156
177
|
此自检对抗 compaction 后近期偏置(compaction 易丢失"不直接实现"的强约束,导致主 agent 退化为自己写代码)。
|
|
157
178
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Python 测试(单元/集成),传入 test_type 和目标模块路径(如 /pytest unit src/mymodule 或 /pytest integration src/mymodule)
|
|
3
|
+
agent: general
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
对目标模块执行完整的 Python 测试流程。第一个参数为 test_type(unit 或 integration),第二个为源码路径 $2,第三个为可选测试目录 $3。
|
|
7
|
+
|
|
8
|
+
请用 skill 工具加载 pytest 技能(name=pytest),将以下参数传给它执行:
|
|
9
|
+
- test_type: $1(unit 或 integration)
|
|
10
|
+
- source: $2
|
|
11
|
+
- test_dir: $3(可选,未指定时自动推导)
|
package/package.json
CHANGED
package/readme/development.md
CHANGED
|
@@ -17,7 +17,7 @@ wwkit/
|
|
|
17
17
|
|
|
18
18
|
```
|
|
19
19
|
plugin.js # 包入口("main"),仅把 skills/ 注册进 config.skills.paths
|
|
20
|
-
agents/*.md # 主代理(
|
|
20
|
+
agents/*.md # 主代理(work / query / lint),frontmatter 含权限块;extract / revise / pytest 现为纯 skill(pytest 合并原 pyut+pyit)
|
|
21
21
|
skills/<name>/SKILL.md # 技能定义
|
|
22
22
|
skills/<name>/references/ # 工作流:*.md(LLM 指令)、*.js(ESM 辅助脚本)、*.json5(schema)
|
|
23
23
|
commands/*.md # opencode 命令(/tl 翻译)
|
package/skills/extract/SKILL.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: extract
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
format=list/detail/text/navi
|
|
6
|
-
|
|
4
|
+
自包含内容提取 skill:解析入参(JSON/key=value/prose)→ 按 format 分发到 references/ 流程 → schema 校验 → 写 output 文件或 stdout。
|
|
5
|
+
format=list/detail/text/navi。调用方直接传原始任务消息,skill 自解析自包含。
|
|
6
|
+
内部用 todowrite 管理 6 步。禁止 WebFetch/网络请求。
|
|
7
7
|
适用:列表页/详情页/纯文本/结构化 JSON 列表/导航 XPath 等各类网页内容提取。
|
|
8
8
|
license: MIT
|
|
9
9
|
metadata:
|
|
@@ -12,43 +12,93 @@ metadata:
|
|
|
12
12
|
|
|
13
13
|
# extract 技能
|
|
14
14
|
|
|
15
|
+
## 核心约束(最高优先级)
|
|
16
|
+
|
|
17
|
+
- **MUST**:收到任务消息后,先 todowrite 落单 6 步,再逐步执行。
|
|
18
|
+
- **MUST**:每步完成立即 todowrite 勾单。
|
|
19
|
+
- **禁止**:使用 WebFetch 或任何网络请求获取内容。
|
|
20
|
+
- **禁止**:写入 output 以外的任何文件;中间产物用临时文件,完成后清理。
|
|
21
|
+
- **禁止**:以任何形式使用未声明字段(count/max_length/max_image_count/language 等)。
|
|
22
|
+
|
|
23
|
+
## 第一步硬指令(自检)
|
|
24
|
+
|
|
25
|
+
解析入参前,强制自检:
|
|
26
|
+
> 我是否已用 todowrite 落单 6 步?
|
|
27
|
+
> - 未落单 → 立即 todowrite 创建清单。
|
|
28
|
+
> - 已落单 → 继续。
|
|
29
|
+
|
|
15
30
|
## 输入参数
|
|
16
31
|
|
|
17
|
-
|
|
32
|
+
入参为调用方传入的**原始任务消息**,可能是以下任一形态:
|
|
33
|
+
- **JSON 对象**:如 `{format, source, url, output}`,直接取字段值;
|
|
34
|
+
- **key=value**:如 `format=list, source=xxx`,按 `,` 和 `=` 拆分为字段;
|
|
35
|
+
- **纯文本 prose**:不做格式推断。仅当文本命中 `references/format-aliases.json5` 中某 format 的 `terms`(如"列表/导航/详情/纯文本")时才翻译为该 format 标准值,`source` 取文本本身。
|
|
36
|
+
|
|
37
|
+
字段清单(字段/类型/必填)见 `references/input.schema.json5`。本技能仅使用 `source`、`format`、`url`、`output` 四个字段,忽略所有其他字段(如 `count`、`max_length`、`max_image_count`、`language`),不得读取、写入或据此推断任何行为。
|
|
18
38
|
|
|
19
39
|
## 输出
|
|
20
40
|
|
|
21
|
-
|
|
41
|
+
- 提供 `output` 参数:将 JSON 数组用 `write` 工具写入该文件,stdout 输出文件路径。
|
|
42
|
+
- 未提供 `output` 参数:将 JSON 数组直接输出到 stdout,**不写任何文件**。
|
|
43
|
+
- 校验失败未能产出数组:不写文件、不输出数组,将错误信息输出到 stderr 并结束。
|
|
22
44
|
|
|
23
45
|
## 工作流程
|
|
24
46
|
|
|
25
|
-
### 阶段
|
|
47
|
+
### 阶段 0:todowrite 落单
|
|
26
48
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
49
|
+
收到任务消息后,**先**用 `todowrite` 创建 6 步清单(status=pending):
|
|
50
|
+
|
|
51
|
+
1. 解析入参(JSON/key=value/prose → format/source/url/output)
|
|
52
|
+
2. 加载 references(format 流程文件 + schema 文件)
|
|
53
|
+
3. 按 format 执行提取
|
|
54
|
+
4. Schema 校验
|
|
55
|
+
5. 校验失败修复重试(≤3 次)
|
|
56
|
+
6. 输出(写 output 文件或 stdout)
|
|
57
|
+
|
|
58
|
+
每步完成立即 todowrite 勾单(status=completed)。
|
|
59
|
+
|
|
60
|
+
### 阶段 1:解析入参
|
|
61
|
+
|
|
62
|
+
将第 1 步标记为 in_progress,解析原始任务消息:
|
|
63
|
+
|
|
64
|
+
- **JSON 对象**:直接取 `format`/`source`/`url`/`output` 字段值。
|
|
65
|
+
- **key=value**:按 `,` 分割、按 `=` 拆分为键值对,取上述四字段。
|
|
66
|
+
- **纯文本 prose**:用 `read` 读取 `references/format-aliases.json5`,仅当文本命中某 format 的 `terms` 时翻译为该 format 标准值,`source` 取文本本身;未命中则 `format` 视为未提供。
|
|
33
67
|
|
|
34
|
-
|
|
68
|
+
解析后得到:
|
|
69
|
+
- `format`(必填,经别名表翻译为标准值;`list` 由阶段 2 自动检测 source 是 HTML 还是 JSON)
|
|
70
|
+
- `source`(必填,HTML/文本或文件路径,原样透传由后续阶段解析)
|
|
71
|
+
- `url`(可选,相对路径转绝对)
|
|
72
|
+
- `output`(可选)
|
|
35
73
|
|
|
36
|
-
|
|
74
|
+
**必填校验**:若无法解析出 `format` 或 `source`,将错误信息输出到 stderr 并结束,**禁止**继续执行。
|
|
37
75
|
|
|
38
|
-
|
|
76
|
+
**空 source 短路**:若 `source` 为空、null 或仅含空白:直接输出 `[]` 并结束,**禁止**继续执行。
|
|
77
|
+
|
|
78
|
+
完成后 todowrite 勾单第 1 步。
|
|
39
79
|
|
|
40
80
|
### 阶段 2:加载 references
|
|
41
81
|
|
|
42
82
|
从技能目录的 `references/` 加载流程文件和 schema 文件:
|
|
43
83
|
|
|
44
|
-
- `format=list`
|
|
84
|
+
- `format=list` 时,先检测 `source` 类型:若值是现有文件路径则读取文件内容;否则以值作为输入。再判断内容类型:
|
|
85
|
+
- 若能解析为 JSON 数组,使用 `list_from_json` 流程
|
|
86
|
+
- 否则若包含 HTML 标签(形如 `<tag`),作为 HTML 源码,使用 `list_from_html` 流程
|
|
87
|
+
- 否则作为纯文本,使用 `list_from_text` 流程
|
|
88
|
+
- schema 统一使用 `references/list.schema.json5`
|
|
45
89
|
- 其他 format 直接使用 `references/{{ format }}.md` 和 `references/{{ format }}.schema.json5`
|
|
46
90
|
|
|
47
|
-
用 `read` 工具读取两个文件内容,并**记录 schema 文件的绝对路径**(阶段 4
|
|
91
|
+
用 `read` 工具读取两个文件内容,并**记录 schema 文件的绝对路径**(阶段 4 校验时需要)。若 `format` 为空或对应 references 文件不存在:直接输出 `[]` 并结束。
|
|
92
|
+
|
|
93
|
+
`url` 按需透传给对应 format 流程(相对路径转绝对)。
|
|
94
|
+
|
|
95
|
+
完成后 todowrite 勾单第 2 步。
|
|
48
96
|
|
|
49
97
|
### 阶段 3:按 format 执行提取
|
|
50
98
|
|
|
51
|
-
按 `references/` 下对应流程文件的步骤执行提取(`list` 格式使用阶段
|
|
99
|
+
按 `references/` 下对应流程文件的步骤执行提取(`list` 格式使用阶段 2 检测的 `list_from_html`/`list_from_json`/`list_from_text`),得到 JSON 数组。**禁止使用 WebFetch 或任何网络请求获取内容。**
|
|
100
|
+
|
|
101
|
+
完成后 todowrite 勾单第 3 步。
|
|
52
102
|
|
|
53
103
|
### 阶段 4:Schema 校验
|
|
54
104
|
|
|
@@ -58,26 +108,38 @@ metadata:
|
|
|
58
108
|
node '<技能目录>/references/validate-schema.js' < <临时 JSON 输入文件>
|
|
59
109
|
```
|
|
60
110
|
|
|
61
|
-
-
|
|
62
|
-
-
|
|
111
|
+
- 若校验通过,todowrite 勾单第 4 步,跳过阶段 5,进入阶段 6
|
|
112
|
+
- 若校验失败,todowrite 勾单第 4 步,进入阶段 5 进行修复重试(最多 3 次)
|
|
63
113
|
|
|
64
114
|
### 阶段 5:校验失败时修复重试
|
|
65
115
|
|
|
66
116
|
当 Schema 校验失败时,将错误信息反馈,重新执行阶段 3 提取并再次校验。**最多重试 3 次**,超过则将最后一次重试的 schema 校验错误信息及「重试 {N} 次后 schema 校验仍然失败」输出到 stderr 并结束。
|
|
67
117
|
|
|
118
|
+
重试成功后 todowrite 勾单第 5 步,进入阶段 6。
|
|
119
|
+
|
|
68
120
|
### 阶段 6:输出
|
|
69
121
|
|
|
70
|
-
**若校验未通过(重试耗尽):** 将最后一次重试的 schema 校验错误信息及「重试 {N} 次后 schema 校验仍然失败」输出到 stderr
|
|
122
|
+
**若校验未通过(重试耗尽):** 将最后一次重试的 schema 校验错误信息及「重试 {N} 次后 schema 校验仍然失败」输出到 stderr 并结束,**不写任何文件**。
|
|
123
|
+
|
|
124
|
+
**若校验通过:**
|
|
125
|
+
- 提供 `output` 参数:用 `write` 工具将最终 JSON 数组写入 `output` 指定文件(**禁止创建其他文件**),stdout 输出该文件路径。
|
|
126
|
+
- 未提供 `output` 参数:将最终 JSON 数组直接输出到 stdout,**不写任何文件**。
|
|
71
127
|
|
|
72
|
-
|
|
128
|
+
完成后 todowrite 勾单第 6 步。
|
|
129
|
+
|
|
130
|
+
## 工具使用约束
|
|
131
|
+
|
|
132
|
+
- 写文件一律用 `write` 工具;读文件用 `read` 工具。
|
|
133
|
+
- 需要中间数据时,用 `write` 工具写入临时文件,再以 stdin 重定向传给 node。
|
|
134
|
+
- 禁止使用未授权的 `cp`/`rm`/`mv` 等命令;需要复制、移动或删除临时文件时,一律用允许的 `node -e` 的 fs 模块完成。
|
|
135
|
+
- 除技能校验/本地提取所需 node 外,禁止执行其他 shell。
|
|
73
136
|
|
|
74
137
|
## 约束
|
|
75
138
|
|
|
76
|
-
- 只处理已声明字段(source/format/url),忽略所有其他传入参数(如 `count`、`max_length`、`max_image_count`、`language
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
- 内部重试步骤的中间产物禁止写入任何文件。
|
|
139
|
+
- 只处理已声明字段(source/format/url/output),忽略所有其他传入参数(如 `count`、`max_length`、`max_image_count`、`language`),**禁止**以任何形式使用它们。
|
|
140
|
+
- **禁止使用 WebFetch 或任何网络请求获取内容**;`source` 无正文或为空时必须输出 `[]`,绝不自行获取内容。
|
|
141
|
+
- 内部重试步骤的中间产物用临时文件,完成后清理,禁止写入 output 以外的任何持久文件。
|
|
142
|
+
- 禁止访问外部网络。
|
|
81
143
|
|
|
82
144
|
## 资源目录
|
|
83
145
|
|
|
@@ -97,4 +159,4 @@ references/
|
|
|
97
159
|
├── detail.md + detail.schema.json5
|
|
98
160
|
├── text.md + text.schema.json5
|
|
99
161
|
└── navi.md + navi.schema.json5
|
|
100
|
-
```
|
|
162
|
+
```
|