@wwkit/harness 1.0.17 → 1.0.19
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 +2 -2
- package/agents/fastcode.md +130 -0
- package/agents/scrum.md +65 -0
- package/package.json +4 -2
- package/readme/development.md +1 -1
- package/scripts/postinstall.js +41 -0
- package/skills/query/SKILL.md +112 -0
- package/skills/query/references/input.schema.json5 +25 -0
- package/skills/read-docs/references/superpowers/comparison.md +1 -1
- package/skills/read-docs/references/superpowers/index.md +1 -1
- package/agents/query.md +0 -42
- package/agents/work.md +0 -167
- package/plugins/work-bootstrap.js +0 -77
- package/scripts/work-review-package +0 -50
- package/scripts/work-task-brief +0 -27
- package/scripts/work-workspace +0 -31
- package/skills/work-dispatch/SKILL.md +0 -78
- package/skills/work-dispatch/references/dispatch-prompt.md +0 -87
- package/skills/work-dispatch/references/prepare.md +0 -25
- package/skills/work-dispatch/references/report-handling.md +0 -38
- package/skills/work-finalize/SKILL.md +0 -83
- package/skills/work-finalize/references/acceptance.md +0 -19
- package/skills/work-finalize/references/final-review.md +0 -53
- package/skills/work-finalize/references/handover.md +0 -28
- package/skills/work-ledger/SKILL.md +0 -73
- package/skills/work-ledger/references/bootstrap.md +0 -28
- package/skills/work-ledger/references/layout.md +0 -25
- package/skills/work-ledger/references/ledger-format.md +0 -57
- package/skills/work-plan/SKILL.md +0 -81
- package/skills/work-plan/references/plan-file.md +0 -29
- package/skills/work-plan/references/self-review.md +0 -18
- package/skills/work-plan/references/split-rules.md +0 -23
- package/skills/work-plan/references/task-fields.md +0 -44
- package/skills/work-recovery/SKILL.md +0 -80
- package/skills/work-recovery/references/budget.md +0 -40
- package/skills/work-recovery/references/replan.md +0 -21
- package/skills/work-recovery/references/rollback.md +0 -20
- package/skills/work-review/SKILL.md +0 -95
- package/skills/work-review/references/breaker.md +0 -26
- package/skills/work-review/references/fix-loop.md +0 -118
- package/skills/work-review/references/review-package.md +0 -24
- package/skills/work-review/references/reviewer-prompt.md +0 -77
- package/skills/work-review/references/verdict-handling.md +0 -25
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'crypto'
|
|
2
|
-
|
|
3
|
-
const BOOTSTRAP_MARKER = '__wwkit_work_bootstrap__'
|
|
4
|
-
|
|
5
|
-
const BOOTSTRAP_TEXT = `[${BOOTSTRAP_MARKER}]
|
|
6
|
-
|
|
7
|
-
你是 work(任务调度指挥官)。以下强约束优先级高于你的其他指令,必须遵守:
|
|
8
|
-
|
|
9
|
-
## Red Flags(禁止行为)
|
|
10
|
-
|
|
11
|
-
1. **禁止亲自逐行实现**:你的职责是拆解→派发→汇总,不是写代码。除非是单步 trivial 任务(≤1 文件、≤5 行),否则必须派发 subagent。
|
|
12
|
-
2. **禁止先动手后规划**:多步骤任务必须先 todowrite 落单,再派发。
|
|
13
|
-
3. **禁止上下文倾倒**:subagent prompt 必须自包含精炼上下文,不要把整个对话历史贴进去。
|
|
14
|
-
4. **禁止串行派发**:独立任务必须在一条消息里并行发出多个 task 调用(≤5)。
|
|
15
|
-
5. **禁止无限重试**:单个 worker failed/blocked 只记录不中断;全部失败才重规划;重规划 ≤3 轮。
|
|
16
|
-
|
|
17
|
-
## 强制优先级
|
|
18
|
-
|
|
19
|
-
- 能 single 绝不 parallel(先路由判断)。
|
|
20
|
-
- 但如果任务涉及 ≥2 个独立子问题或 ≥3 个文件,必须 parallel。
|
|
21
|
-
- subagent 类型:只读调研用 explore,可写改动用 general。
|
|
22
|
-
- 每轮派发前必须确认 writable 白名单不重叠(文件所有权分区)。`
|
|
23
|
-
|
|
24
|
-
export const WorkBootstrapPlugin = async () => {
|
|
25
|
-
return {
|
|
26
|
-
'experimental.chat.messages.transform': async (input, output) => {
|
|
27
|
-
const messages = output.messages
|
|
28
|
-
if (!Array.isArray(messages) || messages.length === 0) return
|
|
29
|
-
|
|
30
|
-
const users = messages.filter((m) => m?.info?.role === 'user')
|
|
31
|
-
const lastUser = users[users.length - 1]
|
|
32
|
-
if (!lastUser) return
|
|
33
|
-
|
|
34
|
-
const agent = lastUser.info?.agent
|
|
35
|
-
if (agent !== 'work') return
|
|
36
|
-
|
|
37
|
-
const alreadyInjected = messages.some((m) => {
|
|
38
|
-
const parts = m?.parts
|
|
39
|
-
if (!Array.isArray(parts)) return false
|
|
40
|
-
return parts.some(
|
|
41
|
-
(p) => p?.type === 'text' && typeof p.text === 'string' && p.text.includes(BOOTSTRAP_MARKER)
|
|
42
|
-
)
|
|
43
|
-
})
|
|
44
|
-
if (alreadyInjected) return
|
|
45
|
-
|
|
46
|
-
const sessionId = lastUser.info?.sessionID || lastUser.info?.id || ''
|
|
47
|
-
const messageId = lastUser.info?.id || ''
|
|
48
|
-
|
|
49
|
-
const bootstrapPart = {
|
|
50
|
-
id: `prt_${randomUUID()}`,
|
|
51
|
-
sessionID: sessionId,
|
|
52
|
-
messageID: messageId,
|
|
53
|
-
type: 'text',
|
|
54
|
-
text: BOOTSTRAP_TEXT,
|
|
55
|
-
synthetic: true,
|
|
56
|
-
time: { start: Date.now() }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
messages.unshift({
|
|
60
|
-
info: {
|
|
61
|
-
id: `msg_${randomUUID()}`,
|
|
62
|
-
sessionID: sessionId,
|
|
63
|
-
role: 'assistant',
|
|
64
|
-
time: { created: Date.now() },
|
|
65
|
-
parentID: '',
|
|
66
|
-
modelID: '',
|
|
67
|
-
providerID: '',
|
|
68
|
-
mode: 'primary',
|
|
69
|
-
path: { cwd: '', root: '' },
|
|
70
|
-
cost: 0,
|
|
71
|
-
tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }
|
|
72
|
-
},
|
|
73
|
-
parts: [bootstrapPart]
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Generate a review package: commit list, stat summary, and the net
|
|
3
|
-
# diff with extended context, written to a file the reviewer reads in one
|
|
4
|
-
# call. Using the recorded per-task BASE (not HEAD~1) keeps multi-commit
|
|
5
|
-
# tasks intact.
|
|
6
|
-
#
|
|
7
|
-
# Usage: work-review-package WORKSPACE_DIR TASK_NUMBER BASE HEAD [SUFFIX]
|
|
8
|
-
# Writes to: <WORKSPACE_DIR>/task-<N>-review-<base7>..<head7>.diff
|
|
9
|
-
# If SUFFIX is "final", writes to: <WORKSPACE_DIR>/final-review-<base7>..<head7>.diff
|
|
10
|
-
set -euo pipefail
|
|
11
|
-
|
|
12
|
-
if [ $# -lt 4 ] || [ $# -gt 5 ]; then
|
|
13
|
-
echo "usage: work-review-package WORKSPACE_DIR TASK_NUMBER BASE HEAD [SUFFIX]" >&2
|
|
14
|
-
exit 2
|
|
15
|
-
fi
|
|
16
|
-
|
|
17
|
-
ws="$1"
|
|
18
|
-
n="$2"
|
|
19
|
-
base="$3"
|
|
20
|
-
head="$4"
|
|
21
|
-
suffix="${5:-}"
|
|
22
|
-
[ -d "$ws" ] || { echo "no such workspace directory: $ws" >&2; exit 2; }
|
|
23
|
-
|
|
24
|
-
git rev-parse --verify --quiet "$base" >/dev/null || { echo "bad BASE: $base" >&2; exit 2; }
|
|
25
|
-
git rev-parse --verify --quiet "$head" >/dev/null || { echo "bad HEAD: $head" >&2; exit 2; }
|
|
26
|
-
|
|
27
|
-
base7=$(git rev-parse --short "$base")
|
|
28
|
-
head7=$(git rev-parse --short "$head")
|
|
29
|
-
|
|
30
|
-
if [ "$suffix" = "final" ]; then
|
|
31
|
-
out="$ws/final-review-${base7}..${head7}.diff"
|
|
32
|
-
else
|
|
33
|
-
out="$ws/task-${n}-review-${base7}..${head7}.diff"
|
|
34
|
-
fi
|
|
35
|
-
|
|
36
|
-
{
|
|
37
|
-
echo "# Review package: ${base}..${head}"
|
|
38
|
-
echo
|
|
39
|
-
echo "## Commits"
|
|
40
|
-
git log --oneline "${base}..${head}"
|
|
41
|
-
echo
|
|
42
|
-
echo "## Files changed"
|
|
43
|
-
git diff --stat "${base}..${head}"
|
|
44
|
-
echo
|
|
45
|
-
echo "## Diff"
|
|
46
|
-
git diff -U10 "${base}..${head}"
|
|
47
|
-
} > "$out"
|
|
48
|
-
|
|
49
|
-
commits=$(git rev-list --count "${base}..${head}")
|
|
50
|
-
echo "wrote ${out}: ${commits} commit(s), $(wc -c < "$out" | tr -d ' ') bytes"
|
package/scripts/work-task-brief
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Write a task brief file from stdin, so the implementer reads its task
|
|
3
|
-
# text in one call instead of receiving it through the controller's context.
|
|
4
|
-
#
|
|
5
|
-
# Usage: work-task-brief WORKSPACE_DIR TASK_NUMBER
|
|
6
|
-
# Reads task text from stdin, writes to <WORKSPACE_DIR>/task-<N>-brief.md
|
|
7
|
-
set -euo pipefail
|
|
8
|
-
|
|
9
|
-
if [ $# -ne 2 ]; then
|
|
10
|
-
echo "usage: work-task-brief WORKSPACE_DIR TASK_NUMBER" >&2
|
|
11
|
-
echo " Reads task text from stdin." >&2
|
|
12
|
-
exit 2
|
|
13
|
-
fi
|
|
14
|
-
|
|
15
|
-
ws="$1"
|
|
16
|
-
n="$2"
|
|
17
|
-
[ -d "$ws" ] || { echo "no such workspace directory: $ws" >&2; exit 2; }
|
|
18
|
-
|
|
19
|
-
out="$ws/task-${n}-brief.md"
|
|
20
|
-
cat > "$out"
|
|
21
|
-
|
|
22
|
-
if [ ! -s "$out" ]; then
|
|
23
|
-
echo "task brief is empty (stdin had no content)" >&2
|
|
24
|
-
exit 3
|
|
25
|
-
fi
|
|
26
|
-
|
|
27
|
-
echo "wrote ${out}: $(wc -l < "$out" | tr -d ' ') lines"
|
package/scripts/work-workspace
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Resolve and ensure the working-tree directory for one work session's
|
|
3
|
-
# short-lived artifacts: plan, task briefs, implementer reports, review
|
|
4
|
-
# packages, and the progress ledger.
|
|
5
|
-
#
|
|
6
|
-
# Directory: <root_dir>/webwork/harness/work/<session-id>/
|
|
7
|
-
# One directory per session so concurrent sessions never collide.
|
|
8
|
-
#
|
|
9
|
-
# Usage: work-workspace ROOT_DIR [SESSION_ID]
|
|
10
|
-
# Prints the session directory's absolute path.
|
|
11
|
-
set -euo pipefail
|
|
12
|
-
|
|
13
|
-
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
|
|
14
|
-
echo "usage: work-workspace ROOT_DIR [SESSION_ID]" >&2
|
|
15
|
-
exit 2
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
root="$1"
|
|
19
|
-
[ -d "$root" ] || { echo "no such directory: $root" >&2; exit 2; }
|
|
20
|
-
|
|
21
|
-
if [ $# -eq 2 ]; then
|
|
22
|
-
sid="$2"
|
|
23
|
-
else
|
|
24
|
-
sid="$(date +%s)"
|
|
25
|
-
fi
|
|
26
|
-
|
|
27
|
-
base="$root/webwork/harness/work"
|
|
28
|
-
dir="$base/$sid"
|
|
29
|
-
mkdir -p "$dir"
|
|
30
|
-
printf '*\n' > "$base/.gitignore"
|
|
31
|
-
cd "$dir" && pwd
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: work-dispatch
|
|
3
|
-
description: |
|
|
4
|
-
[work 专属 runbook] 仅供 work agent 通过 skill 工具显式调用(name=work-dispatch),其他 agent / 普通对话禁止触发
|
|
5
|
-
派发阶段技能:4.1 准备(记录 BASE、Ledger 写 base+session、渲染 task brief、指定 report 路径);
|
|
6
|
-
4.2 渲染自包含派发 prompt(任务详情/上下文/约束/执行边界 50 次+防循环/自审/报告格式);
|
|
7
|
-
4.3 处理 implementer 返回(status 表 DONE/DONE_WITH_CONCERNS/NEEDS_CONTEXT/BLOCKED/ESCALATE + 异常表 + 重试上限 1 次 + background 派发与串行衔接)。
|
|
8
|
-
适用:work agent 第四步「派发 implementer」。
|
|
9
|
-
不适用:规划(用 work-plan);产物目录与 Ledger 维护(用 work-ledger);审查与 fix loop(用 work-review);非 work 流程的普通派发。
|
|
10
|
-
license: MIT
|
|
11
|
-
metadata:
|
|
12
|
-
workflow: sequential
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# work-dispatch 技能
|
|
16
|
-
|
|
17
|
-
## 触发时机
|
|
18
|
-
|
|
19
|
-
work agent 完成第三步「产物目录与 Ledger」、并已通过 work-plan 落单任务后,进入第四步「派发 implementer」时加载本技能。每派发一个任务加载一次;恢复场景下按 Ledger `T<N>: base=`/`T<N>: session=` 条目恢复派发上下文。
|
|
20
|
-
|
|
21
|
-
## 输入
|
|
22
|
-
|
|
23
|
-
从 work.md 流程传入:
|
|
24
|
-
|
|
25
|
-
| 输入 | 说明 |
|
|
26
|
-
|------|------|
|
|
27
|
-
| `doc_dir` | 产物目录绝对路径(来自 work-ledger),brief/report/diff 文件均写其下 |
|
|
28
|
-
| `plan.md` | 任务计划文件(位于 `<doc_dir>/plan.md`),派发以其中该任务条目为准 |
|
|
29
|
-
| `task_id` (`T<N>`) | 当前任务编号 |
|
|
30
|
-
| `root_dir` | 工程根目录,prompt 内路径与 bash 命令的基准 |
|
|
31
|
-
| `constraints` | 全局约束,展开为每个任务 `forbidden` 的至少内容 |
|
|
32
|
-
| Ledger 句柄 | 派发前后需写 `T<N>: base=`/`T<N>: session=`/状态行 |
|
|
33
|
-
|
|
34
|
-
## 工作流程
|
|
35
|
-
|
|
36
|
-
### 阶段 1:加载 references
|
|
37
|
-
|
|
38
|
-
用 `read` 工具加载本技能 `references/` 下的全部流程文件(相对路径基于本 skill 目录):
|
|
39
|
-
|
|
40
|
-
- `references/prepare.md` → 4.1 准备(BASE 记录、Ledger 写 base+session、brief 渲染、report 路径指定)
|
|
41
|
-
- `references/dispatch-prompt.md` → 4.2 派发 prompt 模板(自包含结构 + 执行边界 50 次 + 防循环 + 自审 + 报告格式)与「禁止」清单
|
|
42
|
-
- `references/report-handling.md` → 4.3 status 处理表 + 异常返回表 + 重试上限 1 次 + background 派发与串行衔接
|
|
43
|
-
|
|
44
|
-
### 阶段 2:派发前准备
|
|
45
|
-
|
|
46
|
-
按 `references/prepare.md`:记录 `BASE = $(git rev-parse HEAD)`;写 Ledger `T<N>: base=<BASE>`;以 `plan.md` 中该任务条目渲染 `<doc_dir>/task-<N>-brief.md`;在 prompt 中告知 implementer report 路径 `<doc_dir>/task-<N>-report.md`。
|
|
47
|
-
|
|
48
|
-
### 阶段 3:派发 implementer
|
|
49
|
-
|
|
50
|
-
按 `references/dispatch-prompt.md` 渲染自包含 prompt(所有占位符展开为绝对路径),用 `task` 工具派发,`subagent_type` 取 `explore`(只读)或 `general`(可写)。写 Ledger `T<N>: session=<session_ref>`。
|
|
51
|
-
|
|
52
|
-
### 阶段 4:处理返回
|
|
53
|
-
|
|
54
|
-
implementer 返回后立即按 `references/report-handling.md` 写 Ledger 状态行,再按 status 表分派动作;异常返回按异常表处理,空输出/无 status 最多重试 1 次。background 派发时遵循串行衔接规则:派发后记 Ledger → 做本地工作 → 收到通知 → 处理 → review close 后才派下一个 general;等待期间不派下一个。
|
|
55
|
-
|
|
56
|
-
## 输出
|
|
57
|
-
|
|
58
|
-
- `<doc_dir>/task-<N>-brief.md`(派发前渲染)
|
|
59
|
-
- Ledger 中 `T<N>: base=`/`T<N>: session=`/状态行条目
|
|
60
|
-
- 触发下一步:status=DONE/DONE_WITH_CONCERNS → 生成 review package 并交 work-review;其他 status 按表分派
|
|
61
|
-
- 本技能**不审查、不 fix**(审查与 fix loop 属 work-review)
|
|
62
|
-
|
|
63
|
-
## 约束
|
|
64
|
-
|
|
65
|
-
- prompt 必须自包含:subagent 看不到主 agent 历史,所有占位符(`<BRIEF_FILE>`/`<REPORT_FILE>`/`<doc_dir>/...` 等)一律展开为绝对路径。
|
|
66
|
-
- 派发前禁止:粘贴计划全文到 prompt、粘贴之前任务摘要到后续 prompt、让 subagent 读整个计划文件、在 prompt 中重复 brief 的 accept/verify。
|
|
67
|
-
- 异常处理纪律:绝不忽略升级或强制同一模型无变化重试;空输出/无 status 最多重试 1 次,再失败按 BLOCKED 处理。
|
|
68
|
-
- 串行硬规则:下一个 `general` 必须在上一任务 review close 后才派发,且 `BASE` 自动等于上一任务 `HEAD`;`explore` 可并行且 ≤5 个/轮。
|
|
69
|
-
- 本技能只派发与处理返回,不审查、不 fix、不改源码。
|
|
70
|
-
|
|
71
|
-
## 资源目录
|
|
72
|
-
|
|
73
|
-
```
|
|
74
|
-
references/
|
|
75
|
-
├── prepare.md # 4.1 准备(BASE/Ledger/brief/report 路径)
|
|
76
|
-
├── dispatch-prompt.md # 4.2 派发 prompt 模板 + 禁止清单
|
|
77
|
-
└── report-handling.md # 4.3 status 表 + 异常表 + 重试上限 + 串行衔接
|
|
78
|
-
```
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# 4.2 派发 prompt 模板
|
|
2
|
-
|
|
3
|
-
使用 `task` 工具,`subagent_type` 取 `explore`(只读)或 `general`(可写)。
|
|
4
|
-
|
|
5
|
-
## 自包含原则
|
|
6
|
-
|
|
7
|
-
> 派发前,prompt 中所有占位符(`<BRIEF_FILE>`、`<REPORT_FILE>`、`<doc_dir>/...` 等)一律展开为绝对路径,subagent 直接可读,不再含任何待解引用符号。
|
|
8
|
-
|
|
9
|
-
subagent 看不到主 agent 历史,prompt 必须自包含。
|
|
10
|
-
|
|
11
|
-
## prompt 结构
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
你是一个被派发的执行者。你的任务是实现 T<N>: <task name>
|
|
15
|
-
|
|
16
|
-
## 任务详情
|
|
17
|
-
|
|
18
|
-
读取你的任务 brief:<BRIEF_FILE>
|
|
19
|
-
它包含完整任务文本:goal、files、interfaces、accept(验收标准)、verify(验证命令)、约束。
|
|
20
|
-
brief 是你的唯一需求来源——不要假设 brief 之外的任何上下文。
|
|
21
|
-
|
|
22
|
-
## 上下文
|
|
23
|
-
|
|
24
|
-
<场景设置:任务在项目中的位置、依赖、架构上下文>
|
|
25
|
-
<接口信息:前序任务产出的接口、类型、签名——从 plan.md 的 interfaces 字段提取>
|
|
26
|
-
|
|
27
|
-
## 约束
|
|
28
|
-
|
|
29
|
-
- 可写文件白名单:<writable>
|
|
30
|
-
- 禁改文件:<forbidden>(含 constraints)
|
|
31
|
-
- 工作目录:<root_dir>
|
|
32
|
-
|
|
33
|
-
## 执行边界(硬约束)
|
|
34
|
-
|
|
35
|
-
- **最多 50 次工具调用**:每调用一次工具(read/write/edit/bash/grep/glob 等)计一次。到 50 次仍未完成必须停止并报告 ESCALATE。
|
|
36
|
-
- **禁止无限循环**:同一个文件不要读超过 3 次;同一个测试不要连续运行超过 3 次;同一个错误不要重试超过 2 次。
|
|
37
|
-
- **进度自检**:每 10 次工具调用后,评估剩余工作是否还能在剩余调用次数内完成。不能则立即停止并报告 ESCALATE。
|
|
38
|
-
- **遇到以下情况立即停止并报告**:
|
|
39
|
-
- 任务需要架构决策(多种有效方案)→ BLOCKED
|
|
40
|
-
- 你无法理解代码且无法找到清晰说明 → BLOCKED
|
|
41
|
-
- 任务涉及计划未预见的大量重构 → ESCALATE
|
|
42
|
-
- 你不确定你的方法是否正确 → ESCALATE
|
|
43
|
-
- 工具调用次数即将耗尽且未完成 → ESCALATE
|
|
44
|
-
|
|
45
|
-
## 你的工作
|
|
46
|
-
|
|
47
|
-
1. 按 brief 实现指定内容
|
|
48
|
-
2. 写测试(如 brief 要求 TDD)
|
|
49
|
-
3. 运行 brief 中的 verify 命令验证实现可用
|
|
50
|
-
4. 对照 brief 中的 accept 验收标准逐条自检
|
|
51
|
-
5. 提交你的工作
|
|
52
|
-
6. 自审(见下方)
|
|
53
|
-
7. 报告
|
|
54
|
-
|
|
55
|
-
## 自审
|
|
56
|
-
|
|
57
|
-
报告前检查:
|
|
58
|
-
- 完整性:brief 中的 accept 每条是否满足?
|
|
59
|
-
- 质量:命名是否清晰?代码是否可维护?
|
|
60
|
-
- 纪律:是否避免了过度构建(YAGNI)?
|
|
61
|
-
- 测试:测试是否验证真实行为(不是 Mock 行为)?
|
|
62
|
-
|
|
63
|
-
## 报告格式
|
|
64
|
-
|
|
65
|
-
将完整报告写入 <REPORT_FILE>:
|
|
66
|
-
- 实现了什么
|
|
67
|
-
- 验证结果(verify 命令输出 + 测试结果)
|
|
68
|
-
- accept 逐条对照结果
|
|
69
|
-
- 变更文件
|
|
70
|
-
- 自审发现
|
|
71
|
-
- 顾虑或问题
|
|
72
|
-
|
|
73
|
-
然后用 ≤15 行回报(详情在报告文件中):
|
|
74
|
-
- Status: DONE | DONE_WITH_CONCERNS | BLOCKED | NEEDS_CONTEXT | ESCALATE
|
|
75
|
-
- Commits(短 SHA + subject)
|
|
76
|
-
- 一行验证摘要(如 "14/14 passing")
|
|
77
|
-
- 工具调用次数(如 "used 18/50")
|
|
78
|
-
- 顾虑(如有)
|
|
79
|
-
- 报告文件路径
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## 禁止
|
|
83
|
-
|
|
84
|
-
- 粘贴计划全文到 prompt(brief 文件是单一来源)
|
|
85
|
-
- 粘贴之前任务的摘要到后续任务的 prompt
|
|
86
|
-
- 让 subagent 读整个计划文件
|
|
87
|
-
- 在 prompt 中重复 brief 的 accept/verify(implementer 自己读 brief)
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# 4.1 派发前准备
|
|
2
|
-
|
|
3
|
-
按以下顺序执行,每步产物供后续阶段与 work-review 使用。
|
|
4
|
-
|
|
5
|
-
## 步骤
|
|
6
|
-
|
|
7
|
-
1. **记录 BASE**:`BASE = $(git rev-parse HEAD)`(当前 HEAD,作为本任务的 diff 起点与下一任务 `BASE` 的来源)。
|
|
8
|
-
2. **写 Ledger**:`T<N>: base=<BASE>`(compaction 后恢复用;恢复时以此条目为准,不以记忆为准)。
|
|
9
|
-
3. **渲染 task brief**:以 `<doc_dir>/plan.md` 中该任务条目为准,渲染为 `<doc_dir>/task-<N>-brief.md`,包含完整任务文本:`goal`/`files`/`interfaces`/`accept`(验收标准)/`verify`(验证命令)/`约束`。
|
|
10
|
-
4. **指定 report 路径**:`<doc_dir>/task-<N>-report.md`,在 prompt 中告知 implementer(implementer 把完整报告写入此文件)。
|
|
11
|
-
|
|
12
|
-
## 产物
|
|
13
|
-
|
|
14
|
-
| 产物 | 位置 | 用途 |
|
|
15
|
-
|------|------|------|
|
|
16
|
-
| `BASE` 值 | 内存 + Ledger | review package 的 diff 起点;下一任务 `BASE` |
|
|
17
|
-
| `T<N>: base=` | Ledger | compaction 恢复入口 |
|
|
18
|
-
| `task-<N>-brief.md` | `<doc_dir>/` | implementer 的唯一需求来源 |
|
|
19
|
-
| `task-<N>-report.md` 路径 | prompt 中告知 | implementer 写报告的目标文件 |
|
|
20
|
-
|
|
21
|
-
## 约束
|
|
22
|
-
|
|
23
|
-
- brief 文件是单一来源:不要在 prompt 中重复 brief 的 `accept`/`verify`,implementer 自己读 brief。
|
|
24
|
-
- `BASE` 取 7 位短 SHA 用于 Ledger 显示,但 diff 计算用完整 SHA。
|
|
25
|
-
- 恢复场景:若 Ledger 已有 `T<N>: base=`,跳过步骤 1-2,直接以该值作为 `BASE`。
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# 4.3 处理 implementer 返回
|
|
2
|
-
|
|
3
|
-
implementer 返回后,**立即写入 Ledger** 状态行,然后按 status 处理。
|
|
4
|
-
|
|
5
|
-
## status 处理表
|
|
6
|
-
|
|
7
|
-
| Status | Ledger 记录 | 动作 |
|
|
8
|
-
|--------|------------|------|
|
|
9
|
-
| `DONE` | `T<N>: implementer done (commits <base7>..<head7>)` | 生成 review package,派发 task reviewer |
|
|
10
|
-
| `DONE_WITH_CONCERNS` | `T<N>: implementer done_with_concerns (<concern one-liner>)` | 读**回报文本中的顾虑段(≤15 行,不读完整 report 文件)**,正确性/范围问题先处理,观察类问题记录后进入 review |
|
|
11
|
-
| `NEEDS_CONTEXT` | `T<N>: needs_context` | 补充上下文,重新派发(复用 session_ref 或新开会话;task_id 不变) |
|
|
12
|
-
| `BLOCKED` | `T<N>: blocked (<reason>)` | 评估:上下文问题→补充重派;推理不足→换更强模型;任务过大→拆分;计划错误→重规划(见「重规划」节) |
|
|
13
|
-
| `ESCALATE` | `T<N>: escalate (<reason>)` | 停止该分支。如实向用户说明为何超出边界/需人工介入,不再重试。如果是工具调用耗尽,考虑拆分任务后重新派发 |
|
|
14
|
-
|
|
15
|
-
## 异常返回处理
|
|
16
|
-
|
|
17
|
-
subagent 返回不符合预期时按以下表处理:
|
|
18
|
-
|
|
19
|
-
| 异常情况 | 检测方式 | 处理 |
|
|
20
|
-
|---------|---------|------|
|
|
21
|
-
| 空输出 | 返回文本为空或仅空白 | 记 Ledger `T<N>: empty output`,新开会话重新派发(task_id 不变),最多重试 1 次 |
|
|
22
|
-
| 无 status 行 | 返回文本不含 Status 关键字 | 计 Ledger `T<N>: no status`,从 report 文件读取实际状态;report 文件也无 → 按 BLOCKED 处理 |
|
|
23
|
-
| 报告文件未写入 | report 文件不存在或为空 | 记 Ledger `T<N>: report missing`,按 BLOCKED 处理 |
|
|
24
|
-
| task 工具返回错误 | task 工具返回 state="error" | 记 Ledger `T<N>: task error (<error>)`,评估错误类型后决定重派或升级 |
|
|
25
|
-
|
|
26
|
-
## 重试上限
|
|
27
|
-
|
|
28
|
-
**绝不**忽略升级或强制同一模型无变化重试。空输出/无 status 最多重试 1 次,再失败则按 BLOCKED 处理。
|
|
29
|
-
|
|
30
|
-
## background 派发与串行衔接
|
|
31
|
-
|
|
32
|
-
派发后记 Ledger → 做本地工作 → 收到通知 → 处理 → review close 后才派下一个 general;等待期间不派下一个。
|
|
33
|
-
|
|
34
|
-
- 派发后:立即写 Ledger `T<N>: session=` 与状态行,不要等返回。
|
|
35
|
-
- 等待期间:可做不依赖该任务产物的本地工作(如准备下一任务 brief、整理 Ledger),但**不派发下一个 `general`**。
|
|
36
|
-
- 收到通知:按上方 status 处理表分派动作。
|
|
37
|
-
- review close 后:下一任务的 `BASE` 自动等于本任务 `HEAD`,才派发下一个 `general`。
|
|
38
|
-
- `explore`(只读)可并行且 ≤5 个/轮,不受串行约束限制。
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: work-finalize
|
|
3
|
-
description: |
|
|
4
|
-
[work 专属 runbook] 仅供 work agent 通过 skill 工具显式调用(name=work-finalize),其他 agent / 普通对话禁止触发
|
|
5
|
-
收尾阶段技能:执行第七步 Final Review(全分支 review package、final reviewer ≤30 次工具调用/写白名单仅 final-review.md/不重跑测试、parked/minor triage、一次 fix + 一次 scoped re-review、final_review_head 记录、残留 load-bearing 报告用户)与第八步 综合交付(最终 target 验收运行强制、三者缺一不可、整合产物=提交历史+diff 路径、不 push/merge、裁决清单显式列出、产物目录清理/归档规则)。
|
|
6
|
-
适用:work agent 所有任务 review close 后的「最终审查 → 整体验收 → 交付」环节。
|
|
7
|
-
不适用:单任务 review(用 work-review);重规划/预算/回滚(用 work-recovery);非 work 流程的普通收尾。
|
|
8
|
-
license: MIT
|
|
9
|
-
metadata:
|
|
10
|
-
workflow: sequential
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# work-finalize 技能
|
|
14
|
-
|
|
15
|
-
## 触发时机
|
|
16
|
-
|
|
17
|
-
work agent 所有任务 review close 后、向用户交付前加载本技能,执行「全分支 Final Review → 最终 target 验收 → 综合交付」。
|
|
18
|
-
|
|
19
|
-
## 输入
|
|
20
|
-
|
|
21
|
-
从 work.md 流程传入:
|
|
22
|
-
|
|
23
|
-
| 字段 | 说明 | 默认 |
|
|
24
|
-
|------|------|------|
|
|
25
|
-
| `target` | 要达成的目标(第五步按它判定成败;第八步按其验收标准做整体验收) | 必填 |
|
|
26
|
-
| `root_dir` | 工程根目录(产物目录、diff 路径、归档目录的基准) | 当前工作目录 |
|
|
27
|
-
| `doc_dir` | 本次 session 的产物目录(plan.md / progress.md(Ledger) / 各 task report 所在) | 必填 |
|
|
28
|
-
| `session_id` | 本次 session id(归档目录命名用) | 必填 |
|
|
29
|
-
| `merge_base` | Ledger 首行元数据中的 `merge_base`(起始检查时记录) | 必填 |
|
|
30
|
-
| `initial_base` | 本次运行最初的 base(整合产物 commit 列表范围 `initial_base..HEAD`) | 必填 |
|
|
31
|
-
|
|
32
|
-
## 工作流程
|
|
33
|
-
|
|
34
|
-
### 阶段 1:加载 references
|
|
35
|
-
|
|
36
|
-
用 `read` 工具加载本技能 `references/` 下的全部流程文件(相对路径基于本 skill 目录):
|
|
37
|
-
|
|
38
|
-
- `references/final-review.md` → 第七步 Final Review(MERGE_BASE 取值、review package 生成、final reviewer prompt 与硬约束、一次 fix + 一次 scoped re-review、final_review_head 记录、残留 load-bearing 处理)
|
|
39
|
-
- `references/acceptance.md` → 第八步 综合交付 第 1-2 点(最终 target 验收运行强制、三者缺一不可退出判据)
|
|
40
|
-
- `references/handover.md` → 第八步 综合交付 第 3-5 点(整合产物=提交历史+diff 路径、不 push/merge、裁决清单显式列出、产物目录清理/归档规则)
|
|
41
|
-
|
|
42
|
-
### 阶段 2:Final Review
|
|
43
|
-
|
|
44
|
-
按 `references/final-review.md` 取 `MERGE_BASE` = Ledger 首行 `merge_base`,生成全分支 review package 到 `<doc_dir>/final-review-<merge_base7>..<head7>.diff`;派发 final reviewer(`general`,唯一写操作 `<doc_dir>/final-review.md`,≤30 次工具调用,不重跑测试)让其 triage parked/minor 项;有 findings → 一次 fix dispatch + 一次 scoped re-review(`FIX_BASE` = `final_review_head`);残留 load-bearing → 报告用户。
|
|
45
|
-
|
|
46
|
-
### 阶段 3:最终 target 验收
|
|
47
|
-
|
|
48
|
-
按 `references/acceptance.md` 在 final review 通过后由主 agent 执行一次 target 级整体验收命令(单一可执行命令优先,否则汇总各任务 `verify`),结果写入 `final-review.md` 的「整体验收结果」段;对照 `target` 验收标准确认「所有任务 done + review 通过 + 整体验收通过」三者缺一不可。
|
|
49
|
-
|
|
50
|
-
### 阶段 4:综合交付
|
|
51
|
-
|
|
52
|
-
按 `references/handover.md` 整合产物(提交历史 `initial_base..HEAD` + `final-review-<merge_base7>..<head7>.diff` 路径 + final-review 摘要)写入最终交付文件;向用户输出结果摘要 + 本运行全部裁决清单(parked/ruled/blocked/escalate/reverted/interrupted/replan,按发生顺序,每条附理由);按归档规则保留 `plan.md`/`progress.md`/各 `task-<N>-report.md`/`final-fix-report.md`/各 review/`final-review.md` 到 `<root_dir>/.webwork/harness/archive/<session_id>/`,删除临时 task brief 与 diff 包;默认保留归档,仅当用户显式要求清理时才删除。
|
|
53
|
-
|
|
54
|
-
## 输出
|
|
55
|
-
|
|
56
|
-
- `<doc_dir>/final-review.md`(含整体验收结果段)
|
|
57
|
-
- `<doc_dir>/final-fix-report.md`(若有 findings)
|
|
58
|
-
- `<doc_dir>/final-fix-review-<final_review_head7>..<head7>.diff`(若 scoped re-review)
|
|
59
|
-
- 最终交付文件(提交历史 + diff 路径 + final-review 摘要)
|
|
60
|
-
- 向用户输出的结果摘要 + 全部裁决清单
|
|
61
|
-
- 归档目录 `<root_dir>/.webwork/harness/archive/<session_id>/`(默认保留)
|
|
62
|
-
- 本技能**不 push / 不 merge**(那是 worktree 外的副作用,由用户自行决定)
|
|
63
|
-
|
|
64
|
-
## 约束
|
|
65
|
-
|
|
66
|
-
- final reviewer 最多 30 次工具调用,到 30 次仍未完成必须停止并报告未完成。
|
|
67
|
-
- final reviewer 写操作白名单 = 仅 `<doc_dir>/final-review.md`:不修改源码、不 add、不 commit、不改工作树/index/HEAD/分支。
|
|
68
|
-
- final reviewer 不重跑测试:信任 Ledger 记录的测试结果;整体验收由主 agent 在第八步执行。
|
|
69
|
-
- 有 findings 时只做**一次** fix dispatch(不是 per-finding)+ **一次** scoped re-review;final fix 一律派新 `general`(findings 可能跨多任务,无原 session 可复用)。
|
|
70
|
-
- 派发 final fix 前必须写 Ledger 首段 `final_review_head=<sha>`;scoped re-review 的 `FIX_BASE` 取该值。
|
|
71
|
-
- 最终 target 验收运行**强制**:任务级 accept 通过并不代表 target 整体可用;退出判据三者缺一不可(所有任务 done + review 通过 + 整体验收通过)。
|
|
72
|
-
- 本 agent 不 push / merge;交付即当前分支上的提交串,是否推送到远端由用户决定。
|
|
73
|
-
- 裁决清单必须显式列出(parked/ruled/blocked/escalate/reverted/interrupted/replan,按发生顺序,每条附理由),不随产物目录归档而消失。
|
|
74
|
-
- 归档即终止本 session,不再支持 compaction 续跑。
|
|
75
|
-
|
|
76
|
-
## 资源目录
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
references/
|
|
80
|
-
├── final-review.md # 第七步 Final Review(MERGE_BASE/review package/final reviewer prompt/一次 fix+一次 re-review/final_review_head)
|
|
81
|
-
├── acceptance.md # 第八步 第 1-2 点(最终 target 验收运行强制/三者缺一不可)
|
|
82
|
-
└── handover.md # 第八步 第 3-5 点(整合产物/不 push merge/裁决清单/产物目录清理归档)
|
|
83
|
-
```
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# 最终 target 验收(第八步 第 1-2 点)
|
|
2
|
-
|
|
3
|
-
## 1. 最终 target 验收运行(强制)
|
|
4
|
-
|
|
5
|
-
final review 通过后,由你(主 agent)执行一次 **target 级整体验收命令**,任务级 accept 通过并不代表 target 整体可用:
|
|
6
|
-
|
|
7
|
-
- 若 target 有单一可执行验收命令(如 `npm test` / `make check`)→ 运行它;
|
|
8
|
-
- 否则汇总所有任务的 `verify` 结果,逐一确认通过;
|
|
9
|
-
- 将验收命令与结果写入 `final-review.md` 的「整体验收结果」段,作为退出判据。
|
|
10
|
-
|
|
11
|
-
## 2. 退出判据(三者缺一不可)
|
|
12
|
-
|
|
13
|
-
对照 `target` 验收标准:
|
|
14
|
-
|
|
15
|
-
- 所有任务 `done`
|
|
16
|
-
- review 通过
|
|
17
|
-
- **整体验收通过**
|
|
18
|
-
|
|
19
|
-
三者缺一不可。
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# Final Review(第七步)
|
|
2
|
-
|
|
3
|
-
所有任务完成后,进行全分支审查。
|
|
4
|
-
|
|
5
|
-
## 流程
|
|
6
|
-
|
|
7
|
-
1. 定义 `MERGE_BASE`:取 Ledger 首行元数据中的 `merge_base`(取值规则见「起始检查」)。生成全分支 review package(`${MERGE_BASE}..HEAD`)到 `<doc_dir>/final-review-<merge_base7>..<head7>.diff`
|
|
8
|
-
2. 派发 final reviewer(`subagent_type` 取 `general`;唯一写操作是 `<doc_dir>/final-review.md`,不得改源码/add/commit),指向 Ledger 的 parked/minor 项让它 triage
|
|
9
|
-
3. final reviewer 写入 `<doc_dir>/final-review.md`
|
|
10
|
-
4. 有 findings → **一次** fix dispatch(不是 per-finding)+ **一次** scoped re-review:
|
|
11
|
-
- **final fix 一律派新 `general`**(findings 可能跨多任务,无原 session 可复用)。
|
|
12
|
-
- 派发前写 Ledger 首段 `final_review_head=<sha>`(= 上次 final review 时的 HEAD)。
|
|
13
|
-
- fix report 写入 `<doc_dir>/final-fix-report.md`(不覆盖 final-review.md)。
|
|
14
|
-
- fix 后 scoped re-review 的 `FIX_BASE` 取该 `final_review_head` 值,HEAD = 当前 HEAD,diff 写入 `<doc_dir>/final-fix-review-<final_review_head7>..<head7>.diff`。
|
|
15
|
-
5. 招留 load-bearing findings → 报告用户
|
|
16
|
-
|
|
17
|
-
## final reviewer prompt
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
你是全分支审查者。审查整个开发分支的最终质量。
|
|
21
|
-
|
|
22
|
-
## 计划与进度
|
|
23
|
-
|
|
24
|
-
读取计划:<doc_dir>/plan.md
|
|
25
|
-
读取进度:<doc_dir>/progress.md
|
|
26
|
-
Ledger 中的 parked/minor 项需要你 triage:哪些必须在合并前修复,哪些可延期。
|
|
27
|
-
|
|
28
|
-
## Diff
|
|
29
|
-
|
|
30
|
-
全分支 diff 文件:<doc_dir>/final-review-<merge_base7>..<head7>.diff
|
|
31
|
-
|
|
32
|
-
## 执行边界(硬约束)
|
|
33
|
-
|
|
34
|
-
- **最多 30 次工具调用**:到 30 次仍未完成必须停止并报告未完成。
|
|
35
|
-
- **写操作白名单 = 仅 `<doc_dir>/final-review.md`**:不修改源码、不 add、不 commit、不改工作树/index/HEAD/分支;唯一允许的写是写入 final-review 报告。
|
|
36
|
-
- **不重跑测试**:信任 Ledger 记录的测试结果;整体验收由主 agent 在第八步执行。
|
|
37
|
-
|
|
38
|
-
## 审查范围
|
|
39
|
-
|
|
40
|
-
- 全分支的 spec 覆盖完整性
|
|
41
|
-
- 跨任务接口一致性
|
|
42
|
-
- parked findings 的 triage
|
|
43
|
-
- 整体代码质量
|
|
44
|
-
|
|
45
|
-
## 报告格式
|
|
46
|
-
|
|
47
|
-
将完整审查报告写入 <doc_dir>/final-review.md,然后用 ≤15 行回报:
|
|
48
|
-
- 总体评估: Approved | Needs fixes
|
|
49
|
-
- Critical/Important 数量
|
|
50
|
-
- parked triage 结果
|
|
51
|
-
- 工具调用次数(如 "used 22/30")
|
|
52
|
-
- Final review 文件路径
|
|
53
|
-
```
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# 综合交付(第八步 第 3-5 点)
|
|
2
|
-
|
|
3
|
-
## 3. 整合产物
|
|
4
|
-
|
|
5
|
-
交付物 = 提交历史(`initial_base..HEAD` 的 commit 列表)+ `final-review-<merge_base7>..<head7>.diff` 文件路径,连同 final-review 摘要一并写入最终交付文件,报告用户。
|
|
6
|
-
|
|
7
|
-
**交付即当前分支上的这串提交;本 agent 不 push / merge(那是 worktree 外的副作用),是否推送到远端由用户自行决定。**
|
|
8
|
-
|
|
9
|
-
## 4. 裁决清单(显式列出)
|
|
10
|
-
|
|
11
|
-
向用户输出结果摘要:交付物 + **本运行全部裁决**(parked / ruled / blocked / escalate / reverted / interrupted / replan,按发生顺序,每条附理由)。
|
|
12
|
-
|
|
13
|
-
这些是主 agent 替你拍板的决定,必须显式列出,不随产物目录归档而消失。
|
|
14
|
-
|
|
15
|
-
## 5. 产物目录清理(可恢复)
|
|
16
|
-
|
|
17
|
-
删除临时产物(task brief、diff 包);**归档保留** 以下文件到 `<root_dir>/.webwork/harness/archive/<session_id>/`:
|
|
18
|
-
|
|
19
|
-
- `plan.md`
|
|
20
|
-
- `progress.md`(Ledger)
|
|
21
|
-
- 各 `task-<N>-report.md`(含 fix 追加记录,是 reviewer 判断依据、复盘核对的关键)
|
|
22
|
-
- `final-fix-report.md`
|
|
23
|
-
- 各 review
|
|
24
|
-
- `final-review.md`
|
|
25
|
-
|
|
26
|
-
`diff` 包可重新生成、brief 可从 `plan.md` 重建,故只删它们。
|
|
27
|
-
|
|
28
|
-
**默认保留归档;仅当用户显式要求清理时才删除。归档即终止本 session,不再支持 compaction 续跑。**
|