@adamancyzhang/claude-orchestrator 0.2.8 → 0.3.1
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 +179 -186
- package/dist/cli/commands.d.ts +13 -20
- package/dist/cli/commands.js +171 -288
- package/dist/cli/commands.js.map +1 -1
- package/dist/config.d.ts +25 -11
- package/dist/config.js +49 -13
- package/dist/config.js.map +1 -1
- package/dist/index.js +122 -215
- package/dist/index.js.map +1 -1
- package/dist/leader/decision-engine.d.ts +35 -0
- package/dist/leader/decision-engine.js +102 -0
- package/dist/leader/decision-engine.js.map +1 -0
- package/dist/leader/event-bus.d.ts +11 -0
- package/dist/leader/event-bus.js +21 -0
- package/dist/leader/event-bus.js.map +1 -0
- package/dist/leader/index.d.ts +7 -0
- package/dist/leader/index.js +96 -0
- package/dist/leader/index.js.map +1 -0
- package/dist/leader/monitor.d.ts +14 -0
- package/dist/leader/monitor.js +55 -0
- package/dist/leader/monitor.js.map +1 -0
- package/dist/leader/orchestrator.d.ts +14 -0
- package/dist/leader/orchestrator.js +83 -0
- package/dist/leader/orchestrator.js.map +1 -0
- package/dist/leader/recovery.d.ts +11 -0
- package/dist/leader/recovery.js +61 -0
- package/dist/leader/recovery.js.map +1 -0
- package/dist/leader/state.d.ts +24 -0
- package/dist/leader/state.js +122 -0
- package/dist/leader/state.js.map +1 -0
- package/dist/leader/task-generator.d.ts +34 -0
- package/dist/leader/task-generator.js +93 -0
- package/dist/leader/task-generator.js.map +1 -0
- package/dist/leader/tui.d.ts +5 -0
- package/dist/leader/tui.js +136 -0
- package/dist/leader/tui.js.map +1 -0
- package/dist/leader/watcher.d.ts +18 -0
- package/dist/leader/watcher.js +89 -0
- package/dist/leader/watcher.js.map +1 -0
- package/dist/models/schemas.d.ts +111 -100
- package/dist/models/schemas.js +54 -45
- package/dist/models/schemas.js.map +1 -1
- package/dist/modules/message-router.d.ts +2 -2
- package/dist/modules/message-router.js +10 -16
- package/dist/modules/message-router.js.map +1 -1
- package/dist/modules/registry.js +3 -3
- package/dist/modules/registry.js.map +1 -1
- package/dist/modules/task-queue.d.ts +4 -1
- package/dist/modules/task-queue.js +114 -10
- package/dist/modules/task-queue.js.map +1 -1
- package/dist/skills/CLAUDE.md +155 -0
- package/dist/skills/claude-code-developer/SKILL.md +325 -0
- package/dist/skills/claude-orchestrator/SKILL.md +180 -0
- package/dist/skills/task-acceptance/SKILL.md +201 -0
- package/dist/skills/task-execution/SKILL.md +142 -0
- package/dist/skills/task-planning/SKILL.md +188 -0
- package/dist/skills/task-review/SKILL.md +220 -0
- package/dist/skills/task-traceability/SKILL.md +154 -0
- package/dist/skills/task-verification/SKILL.md +194 -0
- package/dist/templates/leader-decide.md +59 -0
- package/dist/templates/leader-decompose.md +69 -0
- package/dist/templates/worker-accept.md +46 -0
- package/dist/templates/worker-build.md +45 -0
- package/dist/templates/worker-plan.md +43 -0
- package/dist/templates/worker-review.md +46 -0
- package/dist/templates/worker-verify.md +47 -0
- package/dist/utils/exec.d.ts +8 -0
- package/dist/utils/exec.js +45 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/worker/watcher.d.ts +19 -0
- package/dist/worker/watcher.js +152 -0
- package/dist/worker/watcher.js.map +1 -0
- package/dist/zk/client.d.ts +5 -5
- package/dist/zk/client.js +16 -26
- package/dist/zk/client.js.map +1 -1
- package/dist/zk/paths.d.ts +9 -9
- package/dist/zk/paths.js +4 -5
- package/dist/zk/paths.js.map +1 -1
- package/dist/zk/watcher.d.ts +0 -2
- package/dist/zk/watcher.js +0 -3
- package/dist/zk/watcher.js.map +1 -1
- package/package.json +3 -6
- package/dist/modules/context-store.d.ts +0 -10
- package/dist/modules/context-store.js +0 -25
- package/dist/modules/context-store.js.map +0 -1
- package/dist/modules/message-watcher.d.ts +0 -12
- package/dist/modules/message-watcher.js +0 -133
- package/dist/modules/message-watcher.js.map +0 -1
- package/dist/server.d.ts +0 -2
- package/dist/server.js +0 -490
- package/dist/server.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/modules/message-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/modules/message-router.ts"],"names":[],"mappings":"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"}
|
package/dist/modules/registry.js
CHANGED
|
@@ -4,10 +4,10 @@ export class InstanceRegistry {
|
|
|
4
4
|
constructor(zk) {
|
|
5
5
|
this.zk = zk;
|
|
6
6
|
}
|
|
7
|
-
async register(name, role = "
|
|
8
|
-
const validRole = ["
|
|
7
|
+
async register(name, role = "builder", instanceId) {
|
|
8
|
+
const validRole = ["planner", "builder", "verifier", "reviewer", "accepter", "leader"].includes(role)
|
|
9
9
|
? role
|
|
10
|
-
: "
|
|
10
|
+
: "builder";
|
|
11
11
|
if (instanceId) {
|
|
12
12
|
const existing = await this.zk.getInstance(instanceId);
|
|
13
13
|
if (existing) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/modules/registry.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAE9B,MAAM,OAAO,gBAAgB;IACP;IAApB,YAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAEpC,KAAK,CAAC,QAAQ,CACZ,IAAY,EACZ,OAAe,SAAS,EACxB,UAAmB;QAEnB,MAAM,SAAS,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/modules/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,11 @@ import { type Task } from "../models/schemas.js";
|
|
|
3
3
|
export declare class TaskQueue {
|
|
4
4
|
private zk;
|
|
5
5
|
constructor(zk: ZkClient);
|
|
6
|
-
push(title: string, description?: string, priority?: number, createdBy?: string, assignedTo?: string): Promise<Task>;
|
|
6
|
+
push(title: string, description?: string, priority?: number, createdBy?: string, assignedTo?: string, createdByName?: string, assignedToName?: string | null, link?: string | null, chainId?: string | null, dependsOn?: string[], blockedBy?: string[]): Promise<Task>;
|
|
7
7
|
claim(instanceId: string): Promise<Task | null>;
|
|
8
8
|
complete(instanceId: string, taskId: string, result: string): Promise<Task>;
|
|
9
|
+
block(instanceId: string, taskId: string, reason: string): Promise<Task>;
|
|
10
|
+
fail(instanceId: string, taskId: string, reason: string): Promise<Task>;
|
|
11
|
+
retry(taskId: string): Promise<Task>;
|
|
9
12
|
listTasks(status?: string): Promise<Task[]>;
|
|
10
13
|
}
|
|
@@ -7,13 +7,19 @@ export class TaskQueue {
|
|
|
7
7
|
constructor(zk) {
|
|
8
8
|
this.zk = zk;
|
|
9
9
|
}
|
|
10
|
-
async push(title, description = "", priority = 1, createdBy = "", assignedTo) {
|
|
10
|
+
async push(title, description = "", priority = 1, createdBy = "", assignedTo, createdByName, assignedToName, link, chainId, dependsOn, blockedBy) {
|
|
11
11
|
const task = createTask({
|
|
12
12
|
title,
|
|
13
13
|
description,
|
|
14
14
|
priority: [0, 1, 2].includes(priority) ? priority : 1,
|
|
15
15
|
created_by: createdBy,
|
|
16
16
|
assigned_to: assignedTo ?? null,
|
|
17
|
+
created_by_name: createdByName,
|
|
18
|
+
assigned_to_name: assignedToName ?? null,
|
|
19
|
+
link,
|
|
20
|
+
chain_id: chainId,
|
|
21
|
+
depends_on: dependsOn ?? [],
|
|
22
|
+
blocked_by: blockedBy ?? [],
|
|
17
23
|
});
|
|
18
24
|
const taskId = await this.zk.createPendingTask(task);
|
|
19
25
|
task.id = taskId;
|
|
@@ -21,13 +27,30 @@ export class TaskQueue {
|
|
|
21
27
|
}
|
|
22
28
|
async claim(instanceId) {
|
|
23
29
|
const pending = await this.zk.listPendingTasks();
|
|
24
|
-
//
|
|
30
|
+
// Read instance role for weight matching
|
|
31
|
+
let instanceRole = "";
|
|
32
|
+
try {
|
|
33
|
+
const instData = await this.zk.getInstance(instanceId);
|
|
34
|
+
instanceRole = instData?.role ?? "";
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// proceed without role-weight sorting
|
|
38
|
+
}
|
|
39
|
+
const roleToLink = {
|
|
40
|
+
planner: "plan",
|
|
41
|
+
builder: "build",
|
|
42
|
+
verifier: "verify",
|
|
43
|
+
reviewer: "review",
|
|
44
|
+
accepter: "accept",
|
|
45
|
+
};
|
|
25
46
|
const sortKey = (item) => {
|
|
26
47
|
const [, data] = item;
|
|
27
48
|
const assigned = data.assigned_to;
|
|
28
49
|
const prio = data.priority ?? 1;
|
|
29
50
|
const isAssignedToMe = assigned === instanceId ? 0 : 1;
|
|
30
|
-
|
|
51
|
+
const taskLink = data.link ?? "";
|
|
52
|
+
const roleMatch = taskLink && roleToLink[instanceRole] === taskLink ? 0 : 1;
|
|
53
|
+
return [isAssignedToMe, roleMatch, prio, item[0]];
|
|
31
54
|
};
|
|
32
55
|
pending.sort((a, b) => {
|
|
33
56
|
const ka = sortKey(a);
|
|
@@ -41,6 +64,7 @@ export class TaskQueue {
|
|
|
41
64
|
return 0;
|
|
42
65
|
});
|
|
43
66
|
for (const [taskId, data] of pending) {
|
|
67
|
+
// Embed full task_data in claimed node for recovery
|
|
44
68
|
const taskBytes = Buffer.from(JSON.stringify(data), "utf-8");
|
|
45
69
|
const claimed = await this.zk.claimTask(instanceId, taskId, taskBytes);
|
|
46
70
|
if (!claimed)
|
|
@@ -57,21 +81,99 @@ export class TaskQueue {
|
|
|
57
81
|
}
|
|
58
82
|
async complete(instanceId, taskId, result) {
|
|
59
83
|
const claimedData = await this.zk.getClaimedTask(instanceId, taskId);
|
|
60
|
-
|
|
84
|
+
if (!claimedData || Object.keys(claimedData).length === 0) {
|
|
85
|
+
throw new Error(`Task ${taskId} is not claimed by ${instanceId}`);
|
|
86
|
+
}
|
|
87
|
+
const claimedAt = claimedData.claimed_at;
|
|
88
|
+
const durationSeconds = claimedAt
|
|
89
|
+
? Math.round((Date.now() - new Date(claimedAt).getTime()) / 1000)
|
|
90
|
+
: null;
|
|
61
91
|
const now = utcNow();
|
|
62
92
|
const data = {
|
|
63
93
|
id: taskId,
|
|
64
94
|
title: claimedData.title ?? "",
|
|
65
95
|
description: claimedData.description ?? "",
|
|
66
96
|
priority: claimedData.priority ?? 1,
|
|
97
|
+
status: "completed",
|
|
67
98
|
created_by: claimedData.created_by ?? "",
|
|
99
|
+
created_at: claimedData.created_at ?? now,
|
|
68
100
|
assigned_to: claimedData.assigned_to ?? null,
|
|
69
|
-
|
|
101
|
+
claimed_by: instanceId,
|
|
102
|
+
claimed_at: claimedAt ?? now,
|
|
70
103
|
completed_at: now,
|
|
104
|
+
completed_by_name: claimedData.claimed_by_name ?? "",
|
|
71
105
|
result,
|
|
106
|
+
link: claimedData.link ?? null,
|
|
107
|
+
chain_id: claimedData.chain_id ?? null,
|
|
108
|
+
retry_count: claimedData.retry_count ?? 0,
|
|
109
|
+
duration_seconds: durationSeconds,
|
|
110
|
+
created_by_name: claimedData.created_by_name ?? "",
|
|
111
|
+
assigned_to_name: claimedData.assigned_to_name ?? null,
|
|
112
|
+
blocked_reason: null,
|
|
113
|
+
fail_reason: null,
|
|
114
|
+
};
|
|
115
|
+
await this.zk.saveCompletedTask(taskId, data);
|
|
116
|
+
await this.zk.deleteClaimedTask(instanceId, taskId);
|
|
117
|
+
return TaskSchema.parse(data);
|
|
118
|
+
}
|
|
119
|
+
async block(instanceId, taskId, reason) {
|
|
120
|
+
const claimedData = await this.zk.getClaimedTask(instanceId, taskId);
|
|
121
|
+
if (!claimedData || Object.keys(claimedData).length === 0) {
|
|
122
|
+
throw new Error(`Task ${taskId} is not claimed by ${instanceId}`);
|
|
123
|
+
}
|
|
124
|
+
claimedData.status = "blocked";
|
|
125
|
+
claimedData.blocked_reason = reason;
|
|
126
|
+
await this.zk.updateClaimedTask(instanceId, taskId, claimedData);
|
|
127
|
+
return TaskSchema.parse({ ...claimedData, id: taskId });
|
|
128
|
+
}
|
|
129
|
+
async fail(instanceId, taskId, reason) {
|
|
130
|
+
const claimedData = await this.zk.getClaimedTask(instanceId, taskId);
|
|
131
|
+
if (!claimedData || Object.keys(claimedData).length === 0) {
|
|
132
|
+
throw new Error(`Task ${taskId} is not claimed by ${instanceId}`);
|
|
133
|
+
}
|
|
134
|
+
await this.zk.deleteClaimedTask(instanceId, taskId);
|
|
135
|
+
const now = utcNow();
|
|
136
|
+
const data = {
|
|
137
|
+
...claimedData,
|
|
138
|
+
id: taskId,
|
|
139
|
+
status: "failed",
|
|
140
|
+
completed_at: now,
|
|
141
|
+
fail_reason: reason,
|
|
142
|
+
result: `Failed: ${reason}`,
|
|
72
143
|
};
|
|
73
144
|
await this.zk.saveCompletedTask(taskId, data);
|
|
74
|
-
return TaskSchema.parse(
|
|
145
|
+
return TaskSchema.parse(data);
|
|
146
|
+
}
|
|
147
|
+
async retry(taskId) {
|
|
148
|
+
const completedData = await this.zk.getCompletedTask(taskId);
|
|
149
|
+
if (!completedData) {
|
|
150
|
+
throw new Error(`Task ${taskId} not found in completed tasks`);
|
|
151
|
+
}
|
|
152
|
+
const retryCount = (completedData.retry_count ?? 0) + 1;
|
|
153
|
+
const taskData = {
|
|
154
|
+
title: completedData.title ?? "",
|
|
155
|
+
description: completedData.description ?? "",
|
|
156
|
+
priority: completedData.priority ?? 1,
|
|
157
|
+
created_by: completedData.created_by ?? "",
|
|
158
|
+
assigned_to: completedData.assigned_to ?? null,
|
|
159
|
+
assigned_to_name: completedData.assigned_to_name ?? null,
|
|
160
|
+
created_by_name: completedData.created_by_name ?? "",
|
|
161
|
+
created_at: utcNow(),
|
|
162
|
+
link: completedData.link ?? null,
|
|
163
|
+
chain_id: completedData.chain_id ?? null,
|
|
164
|
+
retry_count: retryCount,
|
|
165
|
+
status: "pending",
|
|
166
|
+
blocked_reason: null,
|
|
167
|
+
fail_reason: null,
|
|
168
|
+
claimed_at: null,
|
|
169
|
+
claimed_by: null,
|
|
170
|
+
completed_at: null,
|
|
171
|
+
completed_by_name: null,
|
|
172
|
+
duration_seconds: null,
|
|
173
|
+
result: null,
|
|
174
|
+
};
|
|
175
|
+
const newTaskId = await this.zk.createPendingTask(taskData);
|
|
176
|
+
return TaskSchema.parse({ ...taskData, id: newTaskId });
|
|
75
177
|
}
|
|
76
178
|
async listTasks(status) {
|
|
77
179
|
const tasks = [];
|
|
@@ -82,18 +184,20 @@ export class TaskQueue {
|
|
|
82
184
|
tasks.push(TaskSchema.parse(data));
|
|
83
185
|
}
|
|
84
186
|
}
|
|
85
|
-
if (!status || status === "claimed") {
|
|
187
|
+
if (!status || status === "claimed" || status === "in_progress" || status === "blocked") {
|
|
86
188
|
for (const [insId, taskId, data] of await this.zk.listClaimedTasks()) {
|
|
87
189
|
data.id = taskId;
|
|
88
|
-
data.status = "claimed";
|
|
89
190
|
data.claimed_by = insId;
|
|
191
|
+
if (status && data.status !== status)
|
|
192
|
+
continue;
|
|
90
193
|
tasks.push(TaskSchema.parse(data));
|
|
91
194
|
}
|
|
92
195
|
}
|
|
93
|
-
if (!status || status === "completed") {
|
|
196
|
+
if (!status || status === "completed" || status === "failed") {
|
|
94
197
|
for (const data of await this.zk.listCompletedTasks()) {
|
|
95
198
|
data.title = data.title ?? "";
|
|
96
|
-
data.status
|
|
199
|
+
if (status && data.status !== status)
|
|
200
|
+
continue;
|
|
97
201
|
tasks.push(TaskSchema.parse(data));
|
|
98
202
|
}
|
|
99
203
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../../src/modules/task-queue.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,UAAU,
|
|
1
|
+
{"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../../src/modules/task-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Skills for Multi-Agent Orchestration
|
|
2
|
+
|
|
3
|
+
Skills 是按责任链角色设计的标准化工作流。每个 skill 对应一个责任链角色,定义明确的输入、步骤、和产出。Skills 之间通过交叉引用形成闭环协作。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 责任链与 Skill 映射
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Leader (协调层)
|
|
11
|
+
└── claude-orchestrator: 实例注册、任务分发、消息传递、上下文共享
|
|
12
|
+
|
|
13
|
+
责任链: Plan → Build → Verify → Review → Accept
|
|
14
|
+
│ │ │ │ │
|
|
15
|
+
▼ ▼ ▼ ▼ ▼
|
|
16
|
+
task- task- task- task- task-
|
|
17
|
+
planning execution verification review acceptance
|
|
18
|
+
|
|
19
|
+
基础层 (所有角色):
|
|
20
|
+
task-traceability: 追溯 → 执行 → 映射 → 举证 → 记录 — 责任链可审计、可交接、可签收的基础
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| 角色 | Skill | 输入 | 产出 |
|
|
24
|
+
|------|-------|------|------|
|
|
25
|
+
| **Leader** | `claude-orchestrator` | 需求/目标 | 任务在队列中,Worker 在工作 |
|
|
26
|
+
| **Planner** | `task-planning` + `task-traceability` | 需求上下文 | 蓝图文档 + 任务队列 + 可追溯记录 |
|
|
27
|
+
| **Builder** | `task-execution` + `task-traceability` | 蓝图 + 任务 | 代码 commit + 可追溯记录 |
|
|
28
|
+
| **Verifier** | `task-verification` + `task-traceability` | 蓝图 + Builder 产出 | 验证报告 + 可追溯记录 |
|
|
29
|
+
| **Reviewer** | `task-review` + `task-traceability` | 蓝图 + Build 代码 + Verify 报告 | 审查报告 (Pass/Revise) + 可追溯记录 |
|
|
30
|
+
| **Accepter** | `task-acceptance` + `task-traceability` | 全链产出 + 验收标准 | 验收报告 (Go/No-Go) + 可追溯记录 |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 各 Skill 详述
|
|
35
|
+
|
|
36
|
+
### claude-orchestrator
|
|
37
|
+
|
|
38
|
+
Multi-agent orchestration CLI backed by ZooKeeper。所有角色都使用它来完成基础设施操作:注册实例、认领任务、发送消息、读写共享上下文。
|
|
39
|
+
|
|
40
|
+
- **入口**: `claude-orchestrator <command>`
|
|
41
|
+
- **关键命令**: `register`, `claim-task`, `complete-task`, `push-task`, `send-message`, `set-context`, `get-context`
|
|
42
|
+
- **适用角色**: 所有角色
|
|
43
|
+
|
|
44
|
+
### task-planning
|
|
45
|
+
|
|
46
|
+
Planner 将需求分析拆解为可执行任务蓝图的标准化工作流。
|
|
47
|
+
|
|
48
|
+
- **触发**: "分析需求"、"拆解任务"、"制定计划"
|
|
49
|
+
- **六步法**: 读取需求 → 定义蓝图 → 拆解任务 → 推入队列 → 建立验收标准 → 通知 Leader
|
|
50
|
+
- **产出**: 蓝图文档 + orchestrator 任务队列中的任务
|
|
51
|
+
- **依赖**: 需求上下文(Leader 提供或文档来源)
|
|
52
|
+
|
|
53
|
+
### task-execution
|
|
54
|
+
|
|
55
|
+
Builder 认领任务后精准执行的工作流。
|
|
56
|
+
|
|
57
|
+
- **触发**: "执行任务"、"开始构建"、claim build 类型任务后
|
|
58
|
+
- **六步法**: 认领并获取上下文 → 理解范围 → 执行实现 → 自测验证 → 提交代码 → 报告完成
|
|
59
|
+
- **产出**: 代码 commit + 可追溯记录 (commit hash → 任务文档)
|
|
60
|
+
- **协作 skill**: `task-traceability` (提交规范)
|
|
61
|
+
- **依赖**: Planner 的蓝图
|
|
62
|
+
|
|
63
|
+
### task-verification
|
|
64
|
+
|
|
65
|
+
Verifier 对照蓝图独立验证 Builder 产出的工作流。
|
|
66
|
+
|
|
67
|
+
- **触发**: "验证任务"、"verify"、claim verify 类型任务后
|
|
68
|
+
- **六步法**: 认领并读蓝图 → 收集产出物 → 逐项验证 → 边缘检查 → 判定偏离 → 产出报告
|
|
69
|
+
- **产出**: 验证报告(通过/不通过 + 问题清单)
|
|
70
|
+
- **依赖**: Planner 的蓝图 + Builder 的代码 commit
|
|
71
|
+
|
|
72
|
+
### task-review
|
|
73
|
+
|
|
74
|
+
Reviewer 从设计意图高度审查全链产出的工作流。
|
|
75
|
+
|
|
76
|
+
- **触发**: "审查"、"review"、"code review"、claim review 类型任务后
|
|
77
|
+
- **六步法**: 收集全链信息 → 审查设计一致性 → 审查验证报告 → 判定问题等级 → 书写报告 → 通知流转
|
|
78
|
+
- **产出**: 审查报告(Pass/Revise + P0-P3 问题清单)
|
|
79
|
+
- **依赖**: Plan 蓝图 + Build 代码 + Verify 报告
|
|
80
|
+
|
|
81
|
+
### task-acceptance
|
|
82
|
+
|
|
83
|
+
Accepter 从业务需求角度验收最终交付物的工作流。
|
|
84
|
+
|
|
85
|
+
- **触发**: "确认并验收"、"验收一下"、"检查完成情况"
|
|
86
|
+
- **八步法**: 参见 `skills/task-acceptance/SKILL.md`
|
|
87
|
+
- **产出**: 验收报告(Go/No-Go + 问题清单)
|
|
88
|
+
- **依赖**: 全链产出(Plan → Build → Verify → Review)+ 业务验收标准
|
|
89
|
+
|
|
90
|
+
### task-traceability
|
|
91
|
+
|
|
92
|
+
基础层工作流:责任链可审计、可交接、可签收的基石。所有角色都依赖它来建立可追溯记录。
|
|
93
|
+
|
|
94
|
+
- **触发**: 任何责任链环节的任务执行
|
|
95
|
+
- **五步法**: 追溯上游要求 → 按追溯到的要求执行 → 将产出映射回上游要求 → 为每个映射提供证据 → 持久化追溯记录
|
|
96
|
+
- **适用**: 所有角色(Plan / Build / Verify / Review / Accept)
|
|
97
|
+
- **为什么是基础层**: 没有追溯,Plan 的蓝图无法被 Build 执行,Build 的产出无法被 Verify 验证,Verify 的报告无法被 Review 采信,Review 的判定无法被 Accept 签收。任何一个环节的追溯断裂,整个责任链就断了。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Skill 间协作关系
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
105
|
+
│ task-traceability (基础层) │
|
|
106
|
+
│ 追溯 → 执行 → 映射 → 举证 → 记录 — 每个环节的通用模式 │
|
|
107
|
+
└─────────────────────────────────────────────────────────────┘
|
|
108
|
+
│ │ │ │ │
|
|
109
|
+
▼ ▼ ▼ ▼ ▼
|
|
110
|
+
task-planning task-execution task-verification task-review task-acceptance
|
|
111
|
+
(Planner) (Builder) (Verifier) (Reviewer) (Accepter)
|
|
112
|
+
│ │ │ │ │
|
|
113
|
+
│ 蓝图+标准 │ 代码+记录 │ 验证报告+问题 │ 审查报告 │ 验收报告
|
|
114
|
+
▼ ▼ ▼ ▼ ▼
|
|
115
|
+
责任链流转: Plan → Build → Verify → Review → Accept
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
每个环节发现问题可向前反馈至对应环节。例如:
|
|
119
|
+
- Verifier 发现偏离 → 反馈 Builder
|
|
120
|
+
- Reviewer 发现设计意图未实现 → 反馈 Planner 和 Builder
|
|
121
|
+
- Accepter 发现验收不通过 → 反馈至对应环节的负责人
|
|
122
|
+
|
|
123
|
+
`task-traceability` 确保每个环节的产出都有完整的追溯链:谁做的 → 基于什么要求 → 产出是什么 → 证据在哪里 → 记录存在哪里。没有追溯链,反馈就找不到锚点,交接就不可靠,签收就无法审计。
|
|
124
|
+
|
|
125
|
+
所有角色通过 `claude-orchestrator` 的消息和共享上下文进行跨角色沟通。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 角色预设权重与 Skill 选择
|
|
130
|
+
|
|
131
|
+
Worker 注册时的 role 是预设权重,认领任务后才确定当前角色和对应的 skill:
|
|
132
|
+
|
|
133
|
+
| 注册 role | 预设匹配的任务 link | 认领后使用的 skill |
|
|
134
|
+
|-----------|-------------------|-------------------|
|
|
135
|
+
| `planner` | `plan` | `task-planning` + `task-traceability` |
|
|
136
|
+
| `builder` | `build` | `task-execution` + `task-traceability` |
|
|
137
|
+
| `verifier` | `verify` | `task-verification` + `task-traceability` |
|
|
138
|
+
| `reviewer` | `review` | `task-review` + `task-traceability` |
|
|
139
|
+
| `accepter` | `accept` | `task-acceptance` + `task-traceability` |
|
|
140
|
+
|
|
141
|
+
任意 Worker 可认领任意环节的任务。认领后以任务所属环节的角色身份执行,使用对应的 skill。
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 快速索引
|
|
146
|
+
|
|
147
|
+
| 我想做... | 使用 skill |
|
|
148
|
+
|-----------|-----------|
|
|
149
|
+
| 分析需求,拆解成任务 | `task-planning` + `task-traceability` |
|
|
150
|
+
| 认领并执行一个开发任务 | `task-execution` + `task-traceability` |
|
|
151
|
+
| 建立可追溯的执行记录 | `task-traceability` |
|
|
152
|
+
| 验证 Builder 的产出是否合格 | `task-verification` + `task-traceability` |
|
|
153
|
+
| 审查代码质量和设计一致性 | `task-review` + `task-traceability` |
|
|
154
|
+
| 验收最终交付物,签 Go/No-Go | `task-acceptance` + `task-traceability` |
|
|
155
|
+
| 注册实例、收发消息、管理任务 | `claude-orchestrator` |
|