tackle-harness 0.0.2
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/LICENSE +21 -0
- package/README.en.md +259 -0
- package/README.md +261 -0
- package/bin/tackle.js +150 -0
- package/package.json +29 -0
- package/plugins/contracts/plugin-interface.js +244 -0
- package/plugins/core/hook-skill-gate/index.js +437 -0
- package/plugins/core/hook-skill-gate/plugin.json +12 -0
- package/plugins/core/provider-memory-store/index.js +403 -0
- package/plugins/core/provider-memory-store/plugin.json +9 -0
- package/plugins/core/provider-role-registry/index.js +477 -0
- package/plugins/core/provider-role-registry/plugin.json +9 -0
- package/plugins/core/provider-state-store/index.js +244 -0
- package/plugins/core/provider-state-store/plugin.json +9 -0
- package/plugins/core/skill-agent-dispatcher/plugin.json +13 -0
- package/plugins/core/skill-agent-dispatcher/skill.md +912 -0
- package/plugins/core/skill-batch-task-creator/plugin.json +13 -0
- package/plugins/core/skill-batch-task-creator/skill.md +616 -0
- package/plugins/core/skill-checklist/plugin.json +10 -0
- package/plugins/core/skill-checklist/skill.md +115 -0
- package/plugins/core/skill-completion-report/plugin.json +10 -0
- package/plugins/core/skill-completion-report/skill.md +331 -0
- package/plugins/core/skill-experience-logger/plugin.json +10 -0
- package/plugins/core/skill-experience-logger/skill.md +235 -0
- package/plugins/core/skill-human-checkpoint/plugin.json +10 -0
- package/plugins/core/skill-human-checkpoint/skill.md +194 -0
- package/plugins/core/skill-progress-tracker/plugin.json +10 -0
- package/plugins/core/skill-progress-tracker/skill.md +204 -0
- package/plugins/core/skill-role-manager/plugin.json +10 -0
- package/plugins/core/skill-role-manager/skill.md +252 -0
- package/plugins/core/skill-split-work-package/plugin.json +13 -0
- package/plugins/core/skill-split-work-package/skill.md +446 -0
- package/plugins/core/skill-task-creator/plugin.json +13 -0
- package/plugins/core/skill-task-creator/skill.md +744 -0
- package/plugins/core/skill-team-cleanup/plugin.json +10 -0
- package/plugins/core/skill-team-cleanup/skill.md +266 -0
- package/plugins/core/skill-workflow-orchestrator/plugin.json +13 -0
- package/plugins/core/skill-workflow-orchestrator/skill.md +274 -0
- package/plugins/core/validator-doc-sync/index.js +248 -0
- package/plugins/core/validator-doc-sync/plugin.json +9 -0
- package/plugins/core/validator-work-package/index.js +300 -0
- package/plugins/core/validator-work-package/plugin.json +9 -0
- package/plugins/plugin-registry.json +118 -0
- package/plugins/runtime/config-manager.js +306 -0
- package/plugins/runtime/event-bus.js +187 -0
- package/plugins/runtime/harness-build.js +1019 -0
- package/plugins/runtime/logger.js +174 -0
- package/plugins/runtime/plugin-loader.js +339 -0
- package/plugins/runtime/state-store.js +277 -0
|
@@ -0,0 +1,912 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-dispatcher
|
|
3
|
+
description: Use when user says "批量执行", "并行执行", "调度子代理", or needs to execute multiple work packages using Agent subagents. Analyzes dependencies and dispatches tasks in parallel or sequential order.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agent Dispatcher (Agent Teams 版)
|
|
7
|
+
|
|
8
|
+
基于 **Claude Code Agent Teams** 机制的子代理批量任务调度技能,支持角色赋能和记忆注入。
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
**触发词**:
|
|
13
|
+
- "批量执行" / "并行执行"
|
|
14
|
+
- "调度子代理" / "派发任务"
|
|
15
|
+
- "执行工作包 WP-XXX, WP-YYY"
|
|
16
|
+
- "开始批量任务"
|
|
17
|
+
|
|
18
|
+
## ⚠️ 权限要求
|
|
19
|
+
|
|
20
|
+
本 skill 的 Step 7 清理流程需要 Bash 工具权限来:
|
|
21
|
+
- 验证目录是否存在 (`test -d`)
|
|
22
|
+
- 在 TeamDelete 失败时执行文件系统级删除 (`rm -rf`)
|
|
23
|
+
|
|
24
|
+
**建议权限配置**(添加到 settings.json 的 `permissions.allow` 中):
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"allow": [
|
|
28
|
+
"Bash(test -d $HOME/.claude/teams/*)",
|
|
29
|
+
"Bash(test -d $HOME/.claude/tasks/*)",
|
|
30
|
+
"Bash(rm -rf $HOME/.claude/teams/*)",
|
|
31
|
+
"Bash(rm -rf $HOME/.claude/tasks/*)"
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
如果权限被拒绝,清理流程会提示用户手动执行 `清理团队`。
|
|
37
|
+
|
|
38
|
+
## Quick Reference
|
|
39
|
+
|
|
40
|
+
| 场景 | 执行方式 |
|
|
41
|
+
|------|----------|
|
|
42
|
+
| 无依赖的多个工作包 | 并行执行 (Teamee 自主认领) |
|
|
43
|
+
| 有依赖链的工作包 | blockedBy 自动阻塞 |
|
|
44
|
+
| 混合依赖 | TaskList 自动协调 |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Architecture
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
52
|
+
│ Team Lead (主 Agent) │
|
|
53
|
+
│ │
|
|
54
|
+
│ 1. 解析工作包 → 分析依赖 │
|
|
55
|
+
│ 2. TeamCreate 创建团队 │
|
|
56
|
+
│ 3. TaskCreate 创建任务 + 设置 blockedBy │
|
|
57
|
+
│ 4. 角色匹配 → 确定需要哪些专家 │
|
|
58
|
+
│ 5. Agent 启动 Teamee (注入角色+记忆) │
|
|
59
|
+
│ 6. 监控 TaskList + 接收空闲通知 │
|
|
60
|
+
│ 7. 全部完成后 TeamDelete │
|
|
61
|
+
│ 8. 经验提取 + completion-report │
|
|
62
|
+
└─────────────────────────────────────────────────────────────┘
|
|
63
|
+
│
|
|
64
|
+
┌─────────────────────┼─────────────────────┐
|
|
65
|
+
▼ ▼ ▼
|
|
66
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
67
|
+
│ Teamee 1 │ │ Teamee 2 │ │ Teamee 3 │
|
|
68
|
+
│ 角色专家 │ │ 角色专家 │ │ 角色专家 │
|
|
69
|
+
└────┬─────┘ └────┬─────┘ └────┬─────┘
|
|
70
|
+
│ │ │
|
|
71
|
+
└─────────────────────┼─────────────────────┘
|
|
72
|
+
▼
|
|
73
|
+
┌───────────────────────────────┐
|
|
74
|
+
│ 共享 Task List │
|
|
75
|
+
│ • Task #1: WP-037 (完成) │
|
|
76
|
+
│ • Task #2: WP-038 (进行中) │
|
|
77
|
+
│ • Task #3: WP-039 (blockedBy #2) │
|
|
78
|
+
└───────────────────────────────┘
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Flow
|
|
84
|
+
|
|
85
|
+
```dot
|
|
86
|
+
digraph dispatcher_v2 {
|
|
87
|
+
rankdir=TB;
|
|
88
|
+
|
|
89
|
+
// 准备阶段
|
|
90
|
+
"解析工作包清单" [shape=box];
|
|
91
|
+
"分析依赖关系" [shape=box];
|
|
92
|
+
"检测循环依赖" [shape=diamond];
|
|
93
|
+
|
|
94
|
+
// 团队创建
|
|
95
|
+
"TeamCreate 创建团队" [shape=box, style=filled, fillcolor=lightblue];
|
|
96
|
+
"TaskCreate 创建任务" [shape=box, style=filled, fillcolor=lightblue];
|
|
97
|
+
"设置 blockedBy 依赖" [shape=box];
|
|
98
|
+
|
|
99
|
+
// 角色匹配
|
|
100
|
+
"角色匹配" [shape=box, style=filled, fillcolor=lightyellow];
|
|
101
|
+
"读取角色定义" [shape=box];
|
|
102
|
+
"注入专属记忆" [shape=box];
|
|
103
|
+
|
|
104
|
+
// Teamee 启动
|
|
105
|
+
"Agent 启动 Teamee" [shape=box, style=filled, fillcolor=orange];
|
|
106
|
+
"Teamee 认领任务" [shape=box];
|
|
107
|
+
"Teamee 执行任务" [shape=box];
|
|
108
|
+
"TaskUpdate 更新状态" [shape=box];
|
|
109
|
+
|
|
110
|
+
// 协调
|
|
111
|
+
"检查 TaskList" [shape=diamond];
|
|
112
|
+
"还有待处理任务?" [shape=diamond];
|
|
113
|
+
|
|
114
|
+
// 收尾
|
|
115
|
+
"TeamDelete 清理团队" [shape=box];
|
|
116
|
+
"经验提取" [shape=box, style=filled, fillcolor=lightgreen];
|
|
117
|
+
"生成执行报告" [shape=box];
|
|
118
|
+
|
|
119
|
+
// 流程连接
|
|
120
|
+
"解析工作包清单" -> "分析依赖关系";
|
|
121
|
+
"分析依赖关系" -> "检测循环依赖";
|
|
122
|
+
"检测循环依赖" -> "TeamCreate 创建团队" [label="无循环"];
|
|
123
|
+
"检测循环依赖" -> "报错退出" [label="有循环", style=dashed];
|
|
124
|
+
|
|
125
|
+
"TeamCreate 创建团队" -> "TaskCreate 创建任务";
|
|
126
|
+
"TaskCreate 创建任务" -> "设置 blockedBy 依赖";
|
|
127
|
+
"设置 blockedBy 依赖" -> "角色匹配";
|
|
128
|
+
"角色匹配" -> "读取角色定义";
|
|
129
|
+
"读取角色定义" -> "注入专属记忆";
|
|
130
|
+
"注入专属记忆" -> "Agent 启动 Teamee";
|
|
131
|
+
|
|
132
|
+
"Agent 启动 Teamee" -> "Teamee 认领任务";
|
|
133
|
+
"Teamee 认领任务" -> "Teamee 执行任务";
|
|
134
|
+
"Teamee 执行任务" -> "TaskUpdate 更新状态";
|
|
135
|
+
"TaskUpdate 更新状态" -> "检查 TaskList";
|
|
136
|
+
"检查 TaskList" -> "还有待处理任务?";
|
|
137
|
+
"还有待处理任务?" -> "Teamee 认领任务" [label="是"];
|
|
138
|
+
"还有待处理任务?" -> "发送空闲通知" [label="否"];
|
|
139
|
+
|
|
140
|
+
"发送空闲通知" -> "TeamDelete 清理团队";
|
|
141
|
+
"TeamDelete 清理团队" -> "经验提取";
|
|
142
|
+
"经验提取" -> "生成执行报告";
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Step-by-Step Implementation
|
|
149
|
+
|
|
150
|
+
### Step 1: 解析工作包 + 分析依赖
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
1. 读取 task.md 获取下一个可用 WP 编号
|
|
154
|
+
2. 提取待执行工作包的依赖关系
|
|
155
|
+
3. 构建依赖图,检测循环依赖
|
|
156
|
+
4. 确定执行顺序(拓扑排序)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Step 2: 创建团队
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
TeamCreate:
|
|
163
|
+
team_name: "batch-{YYYYMMDD}-{work-package-ids}"
|
|
164
|
+
description: "批量执行 {WP-XXX, WP-YYY}"
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**命名规范**:
|
|
168
|
+
- 单工作包: `batch-20260314-WP073`
|
|
169
|
+
- 批量工作包: `batch-20260314-WP073-075`
|
|
170
|
+
|
|
171
|
+
### Step 3: 创建任务 + 设置依赖
|
|
172
|
+
|
|
173
|
+
```
|
|
174
|
+
# 为每个工作包创建 Task
|
|
175
|
+
|
|
176
|
+
TaskCreate:
|
|
177
|
+
subject: "WP-037: 凝视区域形状升级"
|
|
178
|
+
description: |
|
|
179
|
+
## 📖 必读:工作包文档
|
|
180
|
+
|
|
181
|
+
**执行前请先阅读工作包文档获取完整上下文:**
|
|
182
|
+
- 文档路径: `docs/wp/WP-037.md`
|
|
183
|
+
- 包含: 问题分析、实施计划、关键文件、验收标准
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
{工作包简要描述}
|
|
188
|
+
status: pending
|
|
189
|
+
|
|
190
|
+
# 设置依赖关系
|
|
191
|
+
TaskUpdate:
|
|
192
|
+
taskId: "{依赖任务的 ID}"
|
|
193
|
+
addBlockedBy: ["{被依赖任务的 ID}"]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**⚠️ 重要**: description 必须包含工作包文档路径,让 Subagent 知道从哪里获取完整上下文!
|
|
197
|
+
|
|
198
|
+
**示例**:
|
|
199
|
+
```
|
|
200
|
+
WP-037 无依赖 → Task #1, 无 blockedBy
|
|
201
|
+
WP-038 依赖 WP-037 → Task #2, blockedBy: [#1]
|
|
202
|
+
WP-039 依赖 WP-038 → Task #3, blockedBy: [#2]
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Step 4: 角色匹配
|
|
206
|
+
|
|
207
|
+
```python
|
|
208
|
+
def match_role(work_package):
|
|
209
|
+
"""匹配最合适的角色"""
|
|
210
|
+
scores = {}
|
|
211
|
+
|
|
212
|
+
for role in roles:
|
|
213
|
+
score = 0
|
|
214
|
+
# 关键词匹配 (权重 0.5)
|
|
215
|
+
for keyword in work_package.keywords:
|
|
216
|
+
if keyword in role.keywords:
|
|
217
|
+
score += 0.5
|
|
218
|
+
|
|
219
|
+
# 任务类型匹配 (权重 0.3)
|
|
220
|
+
if work_package.type in role.task_types:
|
|
221
|
+
score += 0.3
|
|
222
|
+
|
|
223
|
+
# 模块标签匹配 (权重 0.2)
|
|
224
|
+
for tag in work_package.tags:
|
|
225
|
+
if tag in role.module_tags:
|
|
226
|
+
score += 0.2
|
|
227
|
+
|
|
228
|
+
scores[role.id] = score
|
|
229
|
+
|
|
230
|
+
return max(scores, key=scores.get)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Step 5: 启动 Teamee
|
|
234
|
+
|
|
235
|
+
**⚠️ 重要**: 必须使用 `general-purpose` subagent_type!
|
|
236
|
+
|
|
237
|
+
不要使用 `Explore` 或其他只读 agent 类型,因为它们没有 SendMessage 工具,
|
|
238
|
+
无法响应 shutdown_request,会导致 TeamDelete 卡死。
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
Agent:
|
|
242
|
+
name: "{role_id}" # 如 "godot-scene-expert"
|
|
243
|
+
team_name: "batch-20260314-WP073-075"
|
|
244
|
+
subagent_type: "general-purpose" # ✅ 必须使用 general-purpose
|
|
245
|
+
prompt: |
|
|
246
|
+
{Teamee Prompt 模板}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**为什么不能用 Explore agent**:
|
|
250
|
+
- Explore agent 的工具集: `All tools except Agent, ExitPlanMode, Edit, Write, NotebookEdit`
|
|
251
|
+
- 没有 Agent 工具 = 没有 SendMessage
|
|
252
|
+
- 无法发送 `shutdown_response` = TeamDelete 永远等待 = 清理死锁
|
|
253
|
+
|
|
254
|
+
### Step 6: Teamee 自主执行
|
|
255
|
+
|
|
256
|
+
Teamee 收到 prompt 后,按以下流程工作:
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
1. TaskList 查看可用任务
|
|
260
|
+
2. 找到: status=pending + owner=空 + blockedBy 已满足
|
|
261
|
+
3. TaskUpdate 认领任务 (设置 owner)
|
|
262
|
+
4. 执行任务
|
|
263
|
+
5. TaskUpdate 标记完成 (status=completed)
|
|
264
|
+
6. 重复步骤 1-5 直到无可用任务
|
|
265
|
+
7. 等待 Lead 的 shutdown_request(不要主动退出)
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Step 6.5: 监控任务完成状态 (🔴 关键步骤)
|
|
269
|
+
|
|
270
|
+
<HARD-GATE>
|
|
271
|
+
Lead Agent 必须进入监控循环,不可跳过!
|
|
272
|
+
这是保证 TeamDelete 执行的核心机制。
|
|
273
|
+
</HARD-GATE>
|
|
274
|
+
|
|
275
|
+
```
|
|
276
|
+
# Lead Agent 监控循环
|
|
277
|
+
loop_interval = 30 # 秒
|
|
278
|
+
max_wait_time = 7200 # 2 小时
|
|
279
|
+
|
|
280
|
+
start_time = now()
|
|
281
|
+
while (now() - start_time) < max_wait_time:
|
|
282
|
+
# 1. 获取任务状态
|
|
283
|
+
tasks = TaskList()
|
|
284
|
+
|
|
285
|
+
# 2. 统计状态
|
|
286
|
+
completed = count(status == "completed")
|
|
287
|
+
in_progress = count(status == "in_progress")
|
|
288
|
+
pending = count(status == "pending")
|
|
289
|
+
total = len(tasks)
|
|
290
|
+
|
|
291
|
+
# 3. 输出状态(可选)
|
|
292
|
+
print(f"📊 任务状态: 完成={completed}/{total}, 进行中={in_progress}, 待处理={pending}")
|
|
293
|
+
|
|
294
|
+
# 4. 判断清理条件
|
|
295
|
+
if completed == total:
|
|
296
|
+
print("✅ 所有任务完成,准备清理")
|
|
297
|
+
break # 退出循环,执行 Step 7
|
|
298
|
+
|
|
299
|
+
if in_progress > 0:
|
|
300
|
+
# 有任务正在执行,继续等待
|
|
301
|
+
sleep(loop_interval)
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
if pending > 0 and in_progress == 0:
|
|
305
|
+
# 有待处理任务但无活跃 Teamee(可能异常)
|
|
306
|
+
print("⚠️ 检测到异常:有待处理任务但无活跃执行者")
|
|
307
|
+
break # 退出循环,执行异常清理
|
|
308
|
+
|
|
309
|
+
sleep(loop_interval)
|
|
310
|
+
|
|
311
|
+
# 超时处理
|
|
312
|
+
if (now() - start_time) >= max_wait_time:
|
|
313
|
+
print("⚠️ 监控超时,强制执行清理")
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Step 7: 清理团队 (🔴 强制执行 + 验证)
|
|
317
|
+
|
|
318
|
+
<HARD-GATE>
|
|
319
|
+
TeamDelete 必须执行,且必须验证结果!
|
|
320
|
+
无论任务成功、失败还是超时,都必须清理并验证。
|
|
321
|
+
不信任 TeamDelete 返回值,必须检查目录是否真的被删除!
|
|
322
|
+
以下步骤必须按顺序逐一执行,不可跳过!
|
|
323
|
+
</HARD-GATE>
|
|
324
|
+
|
|
325
|
+
> **设计说明**: 以下使用显式步骤而非循环,确保 AI agent 能忠实执行每一步。
|
|
326
|
+
> 路径使用 `$HOME` 变量(Git Bash 兼容 Windows)。
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
#### Step 7a: 安全检查(3 个前置条件)
|
|
331
|
+
|
|
332
|
+
**条件 1** — `team_name` 非空且仅含合法字符 `[a-zA-Z0-9_-]`
|
|
333
|
+
- 失败 → 打印 `❌ 错误:team_name 无效` → 提示手动执行 `清理团队` → **停止**
|
|
334
|
+
|
|
335
|
+
**条件 2** — 团队目录存在
|
|
336
|
+
- 用 Bash 检查: `test -d "$HOME/.claude/teams/$team_name" && echo "EXISTS" || echo "NOT_FOUND"`
|
|
337
|
+
- 返回 `NOT_FOUND` → 打印 `ℹ️ 团队目录不存在,可能已被清理,跳过` → **停止**
|
|
338
|
+
|
|
339
|
+
**条件 3** — 路径安全验证
|
|
340
|
+
- 用 Bash 检查: `basename "$HOME/.claude/teams/$team_name"` 应返回 `$team_name`
|
|
341
|
+
- 不匹配 → 打印 `❌ 安全检查失败:路径异常` → 提示手动执行 `清理团队` → **停止**
|
|
342
|
+
|
|
343
|
+
全部通过 → 继续 Step 7b
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
#### Step 7b: 发送 shutdown_request
|
|
348
|
+
|
|
349
|
+
读取团队配置获取活跃 Teamee 列表:
|
|
350
|
+
- 读取 `~/.claude/teams/$team_name/config.json`
|
|
351
|
+
- 提取 `members` 中 `name != "team-lead"` 的成员
|
|
352
|
+
|
|
353
|
+
向每个 Teamee 发送:
|
|
354
|
+
```
|
|
355
|
+
SendMessage(to=teamee.name, message={
|
|
356
|
+
"type": "shutdown_request",
|
|
357
|
+
"reason": "所有任务已完成/超时,准备清理团队",
|
|
358
|
+
"request_id": "<生成唯一 ID>"
|
|
359
|
+
})
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
#### Step 7c: 等待 shutdown 响应(最多 15 秒)
|
|
365
|
+
|
|
366
|
+
等待所有 Teamee 的 `shutdown_response`。
|
|
367
|
+
如果 15 秒内未全部响应,不再等待,继续执行清理。
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
#### Step 7d: 执行 TeamDelete(第 1 次)
|
|
372
|
+
|
|
373
|
+
调用 `TeamDelete()` 工具。
|
|
374
|
+
|
|
375
|
+
**验证** — 用 Bash 检查目录是否真的被删除:
|
|
376
|
+
```bash
|
|
377
|
+
test -d "$HOME/.claude/teams/$team_name" && echo "EXISTS" || echo "GONE"
|
|
378
|
+
test -d "$HOME/.claude/tasks/$team_name" && echo "EXISTS" || echo "GONE"
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
- 两个都返回 `GONE` → 打印 `✅ 清理成功(验证通过)` → **跳到 Step 7g**
|
|
382
|
+
- 任一返回 `EXISTS` → 继续 Step 7e
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
#### Step 7e: 执行 TeamDelete(第 2 次,等待 2 秒后重试)
|
|
387
|
+
|
|
388
|
+
调用 `TeamDelete()` 工具。
|
|
389
|
+
|
|
390
|
+
**验证** — 同 Step 7d 的 Bash 检查。
|
|
391
|
+
|
|
392
|
+
- 两个都返回 `GONE` → 打印 `✅ 清理成功(第 2 次尝试)` → **跳到 Step 7g**
|
|
393
|
+
- 任一返回 `EXISTS` → 继续 Step 7f
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
#### Step 7f: 文件系统级强制清理(TeamDelete 回退方案)
|
|
398
|
+
|
|
399
|
+
打印 `🔥 TeamDelete 两次失败,执行文件系统级清理...`
|
|
400
|
+
|
|
401
|
+
**安全确认** — 再次验证路径:
|
|
402
|
+
```bash
|
|
403
|
+
basename "$HOME/.claude/teams/$team_name"
|
|
404
|
+
```
|
|
405
|
+
- 返回值不等于 `$team_name` → 打印 `❌ 安全检查失败` → 提示手动执行 `清理团队` → **停止**
|
|
406
|
+
|
|
407
|
+
**执行删除**(逐个目录,检查存在后再删):
|
|
408
|
+
```bash
|
|
409
|
+
# 删除团队目录(仅当存在时)
|
|
410
|
+
test -d "$HOME/.claude/teams/$team_name" && rm -rf "$HOME/.claude/teams/$team_name" && echo "DELETED" || echo "SKIP_OR_FAIL"
|
|
411
|
+
|
|
412
|
+
# 删除任务目录(仅当存在时)
|
|
413
|
+
test -d "$HOME/.claude/tasks/$team_name" && rm -rf "$HOME/.claude/tasks/$team_name" && echo "DELETED" || echo "SKIP_OR_FAIL"
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
如果 Bash `rm -rf` 权限被拒绝:
|
|
417
|
+
- 打印 `⚠️ 权限不足,无法执行文件系统删除`
|
|
418
|
+
- 提示用户手动执行 `清理团队` 或 `rm -rf "$HOME/.claude/teams/$team_name" "$HOME/.claude/tasks/$team_name"`
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
#### Step 7g: 最终验证
|
|
423
|
+
|
|
424
|
+
用 Bash 确认两个目录都已清除:
|
|
425
|
+
```bash
|
|
426
|
+
test -d "$HOME/.claude/teams/$team_name" && echo "STILL_EXISTS" || echo "CLEAN"
|
|
427
|
+
test -d "$HOME/.claude/tasks/$team_name" && echo "STILL_EXISTS" || echo "CLEAN"
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
- 两个都返回 `CLEAN` → 打印 `✅ 清理流程完成`
|
|
431
|
+
- 任一返回 `STILL_EXISTS` → 打印 `❌ 清理失败!请手动执行: 清理团队`
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
#### Step 7h: 记录清理日志
|
|
436
|
+
|
|
437
|
+
记录清理结果到执行报告(成功/失败、尝试次数、使用的方法)。
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Teamee Prompt 模板
|
|
442
|
+
|
|
443
|
+
```markdown
|
|
444
|
+
# [角色名称] - 团队任务执行
|
|
445
|
+
|
|
446
|
+
## 你的身份
|
|
447
|
+
{角色 prompt_template}
|
|
448
|
+
|
|
449
|
+
## 团队信息
|
|
450
|
+
- 团队名称: {team_name}
|
|
451
|
+
- 你的角色: {role_id}
|
|
452
|
+
|
|
453
|
+
## 📖 首要任务:阅读工作包文档
|
|
454
|
+
|
|
455
|
+
**执行任何任务前,必须先读取工作包文档!**
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
1. 认领任务后,立即读取任务 description 中指定的工作包文档
|
|
459
|
+
2. 工作包文档路径格式: `docs/wp/WP-XXX.md` 或 `docs/wp/WP-XXX-N-type.md`
|
|
460
|
+
3. 从文档中获取:
|
|
461
|
+
- 问题分析/上下文
|
|
462
|
+
- 实施计划 Step 1-N
|
|
463
|
+
- 关键文件列表
|
|
464
|
+
- 验收标准
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
## 工作流程 (必须严格遵守)
|
|
468
|
+
|
|
469
|
+
### 1. 认领任务
|
|
470
|
+
```
|
|
471
|
+
# 查看所有任务
|
|
472
|
+
result = TaskList()
|
|
473
|
+
|
|
474
|
+
# 找可用任务:
|
|
475
|
+
# - status = "pending"
|
|
476
|
+
# - owner = 空 (无人认领)
|
|
477
|
+
# - blockedBy 列表中的任务都已 completed
|
|
478
|
+
|
|
479
|
+
# 认领任务
|
|
480
|
+
TaskUpdate(taskId="{任务ID}", owner="{你的role_id}")
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
### 2. 执行任务
|
|
484
|
+
- 认领后立即将 status 改为 "in_progress"
|
|
485
|
+
- 按任务描述执行
|
|
486
|
+
- 完成验收标准
|
|
487
|
+
|
|
488
|
+
### 3. 完成任务
|
|
489
|
+
```
|
|
490
|
+
TaskUpdate(taskId="{任务ID}", status="completed")
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### 4. 继续下一个任务
|
|
494
|
+
- 再次调用 TaskList 查看可用任务
|
|
495
|
+
- 如有可用任务,重复步骤 1-3
|
|
496
|
+
- 如无可用任务,**等待 Lead 的 shutdown_request**(不要主动退出)
|
|
497
|
+
|
|
498
|
+
### 5. 接收关闭请求 (🔴 必须响应)
|
|
499
|
+
|
|
500
|
+
当收到 `shutdown_request` 消息时,**必须**发送响应:
|
|
501
|
+
|
|
502
|
+
```
|
|
503
|
+
# 从收到的 shutdown_request 中提取 request_id
|
|
504
|
+
# 然后发送 shutdown_response
|
|
505
|
+
|
|
506
|
+
SendMessage(
|
|
507
|
+
to="team-lead",
|
|
508
|
+
message={
|
|
509
|
+
"type": "shutdown_response",
|
|
510
|
+
"request_id": "{从 shutdown_request 中提取的 request_id}",
|
|
511
|
+
"approve": true
|
|
512
|
+
}
|
|
513
|
+
)
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
发送响应后,你的工作结束,可以退出。
|
|
517
|
+
|
|
518
|
+
**⚠️ 重要**: 不要主动退出!必须等待 Lead 的 shutdown_request。
|
|
519
|
+
|
|
520
|
+
## 相关经验(从历史中学习)
|
|
521
|
+
|
|
522
|
+
### 经验 1: {标题}
|
|
523
|
+
**问题**: {problem}
|
|
524
|
+
**解决方案**: {solution}
|
|
525
|
+
|
|
526
|
+
## 项目上下文
|
|
527
|
+
- 项目: Kings Watching (Godot 4.x 卡牌塔防游戏)
|
|
528
|
+
- Godot 版本: 4.6.1
|
|
529
|
+
|
|
530
|
+
## 输出要求
|
|
531
|
+
1. 修改/新增的文件清单
|
|
532
|
+
2. 验收标准完成情况
|
|
533
|
+
3. 遇到的问题和解决方案
|
|
534
|
+
4. **如有新经验,请按以下格式总结**:
|
|
535
|
+
```
|
|
536
|
+
### [标签] 经验标题
|
|
537
|
+
**问题**: ...
|
|
538
|
+
**解决方案**: ...
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
## 任务完成后必须执行 (Critical!)
|
|
542
|
+
|
|
543
|
+
### 状态同步 (不可跳过)
|
|
544
|
+
完成工作包后,你必须更新以下文档:
|
|
545
|
+
|
|
546
|
+
1. **更新 task.md**:
|
|
547
|
+
- 将工作包状态从 `📋 待开始` 改为 `✅ 完成`
|
|
548
|
+
- 添加到"最近完成"列表
|
|
549
|
+
|
|
550
|
+
2. **更新 docs/wp/WP-XXX.md** (如存在):
|
|
551
|
+
- 更新状态为 ✅ 完成
|
|
552
|
+
- 添加完成日期
|
|
553
|
+
|
|
554
|
+
3. **验证同步**:
|
|
555
|
+
- 重新读取 task.md 确认状态已更新
|
|
556
|
+
|
|
557
|
+
⚠️ 如果不执行状态同步,工作包将被视为未完成!
|
|
558
|
+
|
|
559
|
+
## 重要提醒
|
|
560
|
+
- **优先认领低 ID 任务** (如 Task #1 优先于 Task #2)
|
|
561
|
+
- 完成后必须执行测试验证
|
|
562
|
+
- 如遇阻塞问题,在任务描述中说明阻塞原因
|
|
563
|
+
- 不要跳过任何验收标准
|
|
564
|
+
- 任务完成后立即更新状态,方便其他 Teamee 认领依赖任务
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
## 角色赋能系统
|
|
570
|
+
|
|
571
|
+
### 核心角色(通用框架)
|
|
572
|
+
|
|
573
|
+
| 角色ID | 名称 | 匹配关键词 |
|
|
574
|
+
|--------|------|------------|
|
|
575
|
+
| `coordinator` | 协调者 | 调度、协调、监控、分配、统筹 |
|
|
576
|
+
| `architect` | 架构师 | 架构、设计、结构、模块、接口 |
|
|
577
|
+
| `implementer` | 实现者 | 实现、编码、开发、修复、重构 |
|
|
578
|
+
| `tester` | 测试者 | 测试、验证、检查、单元测试 |
|
|
579
|
+
| `documenter` | 文档编写者 | 文档、说明、注释、README |
|
|
580
|
+
|
|
581
|
+
### 领域角色(由项目模板扩展)
|
|
582
|
+
|
|
583
|
+
| 角色ID | 名称 | 匹配关键词 |
|
|
584
|
+
|--------|------|------------|
|
|
585
|
+
| `frontend-dev` | 前端开发 | 前端、UI、组件、样式 |
|
|
586
|
+
| `backend-dev` | 后端开发 | 后端、API、服务、数据库 |
|
|
587
|
+
| `devops` | 运维专家 | 部署、CI/CD、Docker、容器 |
|
|
588
|
+
| `godot-scene-expert` | Godot 场景+UI专家 | 场景、节点、tscn、UI(Godot模板)|
|
|
589
|
+
|
|
590
|
+
### 角色文件位置
|
|
591
|
+
|
|
592
|
+
| 文件类型 | 路径 |
|
|
593
|
+
|----------|------|
|
|
594
|
+
| 角色注册表 | `.claude/agents/role-registry.yaml` |
|
|
595
|
+
| 元角色定义 | `.claude/agents/roles/meta/{role_id}.yaml` |
|
|
596
|
+
| 职能角色定义 | `.claude/agents/roles/functional/{role_id}.yaml` |
|
|
597
|
+
| 领域角色定义 | `.claude/agents/roles/domain/{role_id}.yaml` |
|
|
598
|
+
| 专属经验库 | `.claude/agents/memories/{role_id}.md` |
|
|
599
|
+
|
|
600
|
+
---
|
|
601
|
+
|
|
602
|
+
## 记忆注入机制
|
|
603
|
+
|
|
604
|
+
### 经验提取逻辑
|
|
605
|
+
|
|
606
|
+
1. **读取角色专属库**:`.claude/agents/memories/{role_id}.md`
|
|
607
|
+
2. **回退机制**:如专属库不足,读取 `docs/EXPERIENCE.md`
|
|
608
|
+
3. **按标签过滤**:使用角色的 `experience_tags` 过滤
|
|
609
|
+
4. **动态数量**:
|
|
610
|
+
- 简单任务(<2h):1-2 条
|
|
611
|
+
- 中等任务(2-4h):3 条
|
|
612
|
+
- 复杂任务(>4h):5 条
|
|
613
|
+
|
|
614
|
+
---
|
|
615
|
+
|
|
616
|
+
## 共享上下文机制
|
|
617
|
+
|
|
618
|
+
### 自动共享 (无需干预)
|
|
619
|
+
|
|
620
|
+
| 资源 | 共享方式 |
|
|
621
|
+
|------|----------|
|
|
622
|
+
| `CLAUDE.md` | 所有 Teamee 自动加载 |
|
|
623
|
+
| Skills | 继承 Lead 的 skills |
|
|
624
|
+
| MCP Servers | 共享相同的 MCP 配置 |
|
|
625
|
+
| 项目代码 | 共享同一工作目录 |
|
|
626
|
+
|
|
627
|
+
### 协调共享 (通过 Task List)
|
|
628
|
+
|
|
629
|
+
```
|
|
630
|
+
┌─────────────────────────────────────────────────┐
|
|
631
|
+
│ Task List (共享状态) │
|
|
632
|
+
│ │
|
|
633
|
+
│ Task #1: 状态=completed, Owner=scene-expert │
|
|
634
|
+
│ Task #2: 状态=in_progress, Owner=script-expert │
|
|
635
|
+
│ Task #3: 状态=pending, blockedBy=[#2] │
|
|
636
|
+
└─────────────────────────────────────────────────┘
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
### 主动共享 (通过 SendMessage)
|
|
640
|
+
|
|
641
|
+
| 消息类型 | 用途 |
|
|
642
|
+
|----------|------|
|
|
643
|
+
| `message` | Lead ↔ Teamee 点对点通信 |
|
|
644
|
+
| `broadcast` | Lead → 全体通知 |
|
|
645
|
+
| `shutdown_request` | Lead 请求 Teamee 关闭 |
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
|
|
649
|
+
## Dependency Analysis
|
|
650
|
+
|
|
651
|
+
### 依赖图构建
|
|
652
|
+
|
|
653
|
+
1. **读取工作包清单** - 获取所有待执行工作包
|
|
654
|
+
2. **解析依赖声明** - 提取 `依赖: WP-XXX` 信息
|
|
655
|
+
3. **构建有向图** - 节点=工作包,边=依赖关系
|
|
656
|
+
4. **拓扑排序** - 确定执行顺序
|
|
657
|
+
5. **检测循环依赖** - 如有循环则报错
|
|
658
|
+
|
|
659
|
+
### 循环依赖检测
|
|
660
|
+
|
|
661
|
+
```
|
|
662
|
+
❌ 检测到循环依赖: WP-037 → WP-038 → WP-039 → WP-037
|
|
663
|
+
请手动解除依赖关系后重试。
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
---
|
|
667
|
+
|
|
668
|
+
## Execution Report
|
|
669
|
+
|
|
670
|
+
批量执行完成后生成汇总报告,存放到 `docs/reports/` 目录。
|
|
671
|
+
|
|
672
|
+
### 报告命名规范
|
|
673
|
+
|
|
674
|
+
```
|
|
675
|
+
docs/reports/{YYYY-MM-DD}_{工作包列表}_execution_report.md
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
**单工作包**:
|
|
679
|
+
```
|
|
680
|
+
docs/reports/2026-03-14_WP-073_execution_report.md
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
**批量工作包**:
|
|
684
|
+
```
|
|
685
|
+
docs/reports/2026-03-14_WP-073-075_execution_report.md
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
### 报告内容模板
|
|
689
|
+
|
|
690
|
+
```markdown
|
|
691
|
+
# 批量执行报告
|
|
692
|
+
|
|
693
|
+
## 基本信息
|
|
694
|
+
- 团队名称: batch-20260314-WP073-075
|
|
695
|
+
- 执行日期: 2026-03-14
|
|
696
|
+
- 工作包: WP-073, WP-074, WP-075
|
|
697
|
+
|
|
698
|
+
## 执行总览
|
|
699
|
+
|
|
700
|
+
| Task ID | 工作包 | 角色 | 状态 | 依赖 | 说明 |
|
|
701
|
+
|---------|--------|------|------|------|------|
|
|
702
|
+
| #1 | WP-073 | godot-scene-expert | ✅ 完成 | - | - |
|
|
703
|
+
| #2 | WP-074 | godot-script-expert | ✅ 完成 | #1 | - |
|
|
704
|
+
| #3 | WP-075 | combat-ai-expert | ✅ 完成 | #2 | - |
|
|
705
|
+
|
|
706
|
+
## 详细结果
|
|
707
|
+
|
|
708
|
+
### WP-073: 凝视区域形状升级
|
|
709
|
+
- 执行者: godot-scene-expert
|
|
710
|
+
- 子任务: 3/3 完成
|
|
711
|
+
- 测试: 9/9 通过
|
|
712
|
+
- 文件变更:
|
|
713
|
+
- 新增: 2 个
|
|
714
|
+
- 修改: 3 个
|
|
715
|
+
|
|
716
|
+
### WP-074: ...
|
|
717
|
+
(类似)
|
|
718
|
+
|
|
719
|
+
## 📁 文件变更汇总
|
|
720
|
+
```
|
|
721
|
+
新增: X 个文件
|
|
722
|
+
修改: Y 个文件
|
|
723
|
+
测试: Z 个文件
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
## 💡 新增经验
|
|
727
|
+
(如有新经验,已写入角色专属库)
|
|
728
|
+
|
|
729
|
+
---
|
|
730
|
+
报告生成时间: {timestamp}
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
## 经验沉淀闭环
|
|
736
|
+
|
|
737
|
+
执行完成后:
|
|
738
|
+
|
|
739
|
+
1. **分析 Teamee 输出** - 提取新经验
|
|
740
|
+
2. **写入角色专属库** - `.claude/agents/memories/{role_id}.md`
|
|
741
|
+
3. **同步到 EXPERIENCE.md** - 去重合并
|
|
742
|
+
4. **触发 experience-logger** - 记录本次执行的经验
|
|
743
|
+
|
|
744
|
+
---
|
|
745
|
+
|
|
746
|
+
## 🆕 拆分工作包执行支持
|
|
747
|
+
|
|
748
|
+
当工作包有子工作包时,agent-dispatcher 会自动识别并按依赖调度。
|
|
749
|
+
|
|
750
|
+
### 执行流程
|
|
751
|
+
|
|
752
|
+
```
|
|
753
|
+
1. 读取父工作包文档 (docs/wp/WP-XXX.md)
|
|
754
|
+
2. 检测拆分模式 (simple/standard/fine-grained)
|
|
755
|
+
3. 解析子工作包列表
|
|
756
|
+
4. 解析依赖关系
|
|
757
|
+
5. 创建 Task List 任务
|
|
758
|
+
6. 设置 blockedBy 依赖
|
|
759
|
+
7. 角色匹配 → 分配角色
|
|
760
|
+
8. 按依赖顺序调度执行
|
|
761
|
+
9. 验证关卡机制:
|
|
762
|
+
- verify 失败 → 停止后续任务
|
|
763
|
+
- 所有 verify 通过 → 标记完成
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
### 拆分模式处理
|
|
767
|
+
|
|
768
|
+
#### 模式 A: simple (不拆分)
|
|
769
|
+
直接作为单个任务调度执行。
|
|
770
|
+
|
|
771
|
+
#### 模式 B: standard (标准拆分)
|
|
772
|
+
生成 4 个子任务:
|
|
773
|
+
- WP-XXX-1-impl → 领域专家
|
|
774
|
+
- WP-XXX-2-test → test-reviewer (blockedBy: #1)
|
|
775
|
+
- WP-XXX-3-verify → test-reviewer (blockedBy: #2)
|
|
776
|
+
- WP-XXX-4-review → code-reviewer (blockedBy: #3)
|
|
777
|
+
|
|
778
|
+
#### 模式 C: fine-grained (细粒度拆分)
|
|
779
|
+
按模块拆分为多个实现任务,每个模块独立测试,最后统一验证和审查。
|
|
780
|
+
|
|
781
|
+
### 验证关卡机制
|
|
782
|
+
|
|
783
|
+
当 `-verify` 工作包执行失败时:
|
|
784
|
+
1. 停止所有依赖此工作包的后续任务
|
|
785
|
+
2. 通知 Lead 验证失败
|
|
786
|
+
3. 等待用户指示
|
|
787
|
+
|
|
788
|
+
当 `-verify` 工作包通过时:
|
|
789
|
+
1. 解锁 `-review` 任务
|
|
790
|
+
2. 继续执行流程
|
|
791
|
+
|
|
792
|
+
### 角色自动匹配
|
|
793
|
+
|
|
794
|
+
| 子工作包类型 | 自动匹配角色 |
|
|
795
|
+
|--------------|--------------|
|
|
796
|
+
| `-impl` | 根据关键词匹配领域专家 |
|
|
797
|
+
| `-test` | test-reviewer |
|
|
798
|
+
| `-verify` | test-reviewer |
|
|
799
|
+
| `-review` | code-reviewer |
|
|
800
|
+
|
|
801
|
+
---
|
|
802
|
+
|
|
803
|
+
## Integration with Other Skills
|
|
804
|
+
|
|
805
|
+
| Skill | 集成点 |
|
|
806
|
+
|-------|--------|
|
|
807
|
+
| `role-manager` | 查看角色、手动匹配 |
|
|
808
|
+
| `human-checkpoint` | 批量执行前确认执行计划 |
|
|
809
|
+
| `completion-report` | 批量执行后生成报告 |
|
|
810
|
+
| `checklist` | 每个工作包完成后检查 |
|
|
811
|
+
| `experience-logger` | 批量执行后记录经验 |
|
|
812
|
+
| `task-creator` | 🆕 支持拆分工作包创建 |
|
|
813
|
+
| `batch-task-creator` | 🆕 支持批量拆分 |
|
|
814
|
+
|
|
815
|
+
---
|
|
816
|
+
|
|
817
|
+
## Error Handling
|
|
818
|
+
|
|
819
|
+
### 循环依赖
|
|
820
|
+
```
|
|
821
|
+
❌ 检测到循环依赖: WP-037 → WP-038 → WP-039 → WP-037
|
|
822
|
+
请手动解除依赖关系后重试。
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
### 角色匹配失败
|
|
826
|
+
```
|
|
827
|
+
⚠️ 无法自动匹配角色,使用默认 general-purpose
|
|
828
|
+
工作包: WP-XXX
|
|
829
|
+
建议手动指定角色
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
### Teamee 执行失败
|
|
833
|
+
```
|
|
834
|
+
⚠️ Task #2 执行失败
|
|
835
|
+
Owner: godot-script-expert
|
|
836
|
+
状态: in_progress (卡住)
|
|
837
|
+
处理: Lead 发送 shutdown_request 关闭 Teamee
|
|
838
|
+
创建新任务重试或人工介入
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
### 部分任务超时
|
|
842
|
+
```
|
|
843
|
+
⚠️ Task #3 等待依赖超时
|
|
844
|
+
依赖: Task #2 (状态: in_progress, 超过 30 分钟)
|
|
845
|
+
处理: 检查 Task #2 的 Teamee 状态
|
|
846
|
+
必要时发送消息确认进度
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
### 清理超时
|
|
850
|
+
```
|
|
851
|
+
⚠️ 清理等待超时(30秒)
|
|
852
|
+
可能原因:
|
|
853
|
+
- Teamee 没有响应 shutdown_request
|
|
854
|
+
- Teamee 使用了 Explore 等只读 agent(没有 SendMessage 工具)
|
|
855
|
+
- Teamee 进程卡死
|
|
856
|
+
|
|
857
|
+
处理:
|
|
858
|
+
- 强制执行 TeamDelete(不是 rm -rf!)
|
|
859
|
+
- 建议用户检查是否有残留进程
|
|
860
|
+
- 检查 Step 5 是否使用了正确的 subagent_type
|
|
861
|
+
```
|
|
862
|
+
|
|
863
|
+
---
|
|
864
|
+
|
|
865
|
+
## Important
|
|
866
|
+
|
|
867
|
+
1. **TeamCreate 是必须的** - 没有团队就没有共享 Task List
|
|
868
|
+
2. **blockedBy 自动阻塞** - 依赖机制由 Task List 自动处理
|
|
869
|
+
3. **Teamee 自主认领** - Lead 不需要手动分配任务
|
|
870
|
+
4. **角色匹配提升质量** - 专业角色比通用代理更高效
|
|
871
|
+
5. **记忆注入避免踩坑** - 从历史经验中学习
|
|
872
|
+
6. **经验沉淀形成闭环** - 每次执行都让角色更聪明
|
|
873
|
+
7. **🔴 TeamDelete 是强制的** - 无论成功/失败/超时,都必须执行清理!
|
|
874
|
+
8. **🔴 监控循环不可跳过** - Lead 必须进入 Step 6.5 监控循环
|
|
875
|
+
|
|
876
|
+
## Cleanup Guarantee (清理保障)
|
|
877
|
+
|
|
878
|
+
```
|
|
879
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
880
|
+
│ 强制清理检查点 │
|
|
881
|
+
│ │
|
|
882
|
+
│ ✅ 正常完成 → Step 6.5 检测 → Step 7 清理 → TeamDelete │
|
|
883
|
+
│ ✅ 部分失败 → Step 6.5 检测 → Step 7 清理 → TeamDelete │
|
|
884
|
+
│ ✅ 超时 → Step 6.5 超时 → Step 7 强制清理 → TeamDelete │
|
|
885
|
+
│ ✅ 异常中断 → 捕获中断 → Step 7 强制清理 → TeamDelete │
|
|
886
|
+
│ │
|
|
887
|
+
│ ❌ 无任何情况可以跳过 TeamDelete! │
|
|
888
|
+
└─────────────────────────────────────────────────────────────┘
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
---
|
|
892
|
+
|
|
893
|
+
## Migration Guide (从旧版本迁移)
|
|
894
|
+
|
|
895
|
+
### 旧版本 vs 新版本
|
|
896
|
+
|
|
897
|
+
| 操作 | 旧版本 | 新版本 |
|
|
898
|
+
|------|--------|--------|
|
|
899
|
+
| 创建协调 | 无 | TeamCreate |
|
|
900
|
+
| 任务管理 | 主 Agent 手动 | TaskCreate + TaskList |
|
|
901
|
+
| 依赖处理 | 主 Agent 分析 | blockedBy 自动阻塞 |
|
|
902
|
+
| 任务分配 | 主 Agent 指定 | Teamee 自主认领 |
|
|
903
|
+
| 状态同步 | 无 | TaskList 实时 |
|
|
904
|
+
| 清理 | 无 | TeamDelete |
|
|
905
|
+
|
|
906
|
+
### 保留的功能
|
|
907
|
+
|
|
908
|
+
- ✅ 角色匹配算法
|
|
909
|
+
- ✅ 记忆注入机制
|
|
910
|
+
- ✅ 经验沉淀闭环
|
|
911
|
+
- ✅ 执行报告生成
|
|
912
|
+
- ✅ 错误处理逻辑
|