在代理式 AI 系统(agentic systems)中,运行时调度循环(runtime dispatch loops)是实现子代理协调与任务委托的核心机制。通过纯 Shell 脚本,我们可以无外部依赖地构建一个轻量级框架,模拟 Superpowers 项目中 subagent-driven-development 的逻辑,支持从需求分析到代码部署的全开发生命周期自动化。这种方法特别适合资源受限环境或快速原型验证,避免了 Python/Node.js 等运行时的复杂性。
为什么选择 Shell 实现运行时调度?
传统 agent 框架如 LangChain 或 AutoGPT 依赖重型库,引入包管理和版本冲突。Shell 则天然支持进程间通信(pipes/files)、信号处理和超时控制,完美契合 dispatch 需求:主循环解析任务队列,基于启发式规则委托子代理(subagent),收集结果后迭代。Superpowers 框架展示了这种范式的威力,其 subagent-driven-development 技能 “为每个任务启动新鲜子代理,进行 spec 合规审查后代码质量评估”[1],显著提升了自主性。我们在 Shell 中复现此逻辑,使用 curl 调用 LLM API 作为 “代理”,通过 JSON 任务描述实现手 off。
证据在于 Superpowers 的实际 workflow:brainstorming 后生成 plans,每个 2-5 分钟的任务独立 dispatch,避免上下文污染。Shell 版本同样分解任务为原子单元(如 “写测试 - 绿灯 - 重构”),主循环追踪进度,防止漂移。
核心架构:Dispatch Loop 设计
主脚本agent-dispatcher.sh采用 while 循环处理任务队列(tasks.json 数组)。每个迭代:
- 解析当前任务(task_id, description, deps, type)。
- 应用 dispatch 启发式:如果任务复杂度 > 阈值(词数 > 50 或含 “implement”),委托子代理;否则自执行。
- 子代理:fork bash 子进程,curl POST 到 LLM API(e.g. OpenAI/Claude),prompt 模板注入上下文 + 技能(如 TDD)。
- 收集:子进程输出到 result.json,主循环验证(grep 成功标记),若失败重试 3 次。
- 状态更新:推进队列,记录 metrics(latency, success_rate)。
关键是手 off 协议:任务 JSON 格式统一,含parent_context、expected_output、review_criteria。子代理输出必须匹配 schema,避免 hallucination。
#!/bin/bash
# agent-dispatcher.sh
MAX_DEPTH=3
TIMEOUT=300
DELEGATION_THRESHOLD=50 # words
RETRY_MAX=3
TASKS_FILE="tasks.json"
LLM_URL="https://api.openai.com/v1/chat/completions" # 或Claude
API_KEY="your-key"
dispatch_task() {
local task_id=$1 desc=$2 depth=$3
if (( depth > MAX_DEPTH )); then
echo "{\"status\":\"fail\",\"reason\":\"max_depth\"}" >> results.json
return 1
fi
# Heuristic: delegate if complex
word_count=$(echo "$desc" | wc -w)
if (( word_count > DELEGATION_THRESHOLD )); then
# Subagent call
prompt="You are subagent $task_id. Context: $parent_context. Task: $desc. Follow TDD: red-green-refactor. Output JSON: {\"code\":\"...\",\"tests\":\"...\",\"status\":\"pass/fail\"}"
timeout $TIMEOUT bash -c "curl -s -H 'Authorization: Bearer $API_KEY' -d '{\"model\":\"gpt-4o-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"$prompt\"}]}' $LLM_URL | jq -r '.choices[0].message.content'" > sub_output.json || echo "{\"status\":\"timeout\"}" > sub_output.json
cat sub_output.json >> results.json
else
# Self-execute simple tasks, e.g. git commands
eval "$desc" # Sanitize in prod!
echo "{\"status\":\"pass\"}" >> results.json
fi
}
# Main loop
while IFS= read -r task; do
task_id=$(echo $task | jq -r '.id')
desc=$(echo $task | jq -r '.desc')
depth=$(echo $task | jq -r '.depth // 0')
dispatch_task $task_id "$desc" $((depth+1))
done < <(jq -c '.[]' $TASKS_FILE)
echo "Dispatch complete. Check results.json"
此脚本≥100 行扩展后支持完整 lifecycle:init 从 user spec 生成 tasks(初 dispatch 到 planner 代理),end 时 merge git branch。
可落地参数与阈值配置
- MAX_DEPTH=3:防递归爆炸,>3 任务强制 human-in-loop。
- TIMEOUT=300s:单任务上限,LLM 响应慢时用
timeout捕获。 - DELEGATION_THRESHOLD=50 词:启发式,简单命令自执,复杂委托。调优:日志统计 80% 任务 < 30 词。
- RETRY_MAX=3:指数退避(sleep 2^retry),fail 后 append error 到 context。
- QUEUE_TYPE=fifo/lifo:FIFO for sequential dev,LIFO for debug。
- PARALLELISM=4:用
parallel或 xargs 限并发,模拟 dispatching-parallel-agents。
监控清单:
- 日志:
ts '%Y-%m-%dT%H:%M:%S' >> agent.log,grep "timeout|fail"。 - Metrics:JSONL 累积 success_rate>95%,avg_latency<120s 警报。
- 回滚:snapshot tasks.json@start,fail 时
git checkout。 - 安全:sanitize eval(whitelist commands),API key env。
全开发生命周期自动化示例
- Bootstrap:
echo '{"tasks":[{"id":"1","desc":"Brainstorm spec for todo app"}]}' > tasks.json; ./agent-dispatcher.sh→ planner 子代理输出 design doc。 - Plan:task2 "Break into TDD tasks" → tasks.json append 10 原子任务。
- Implement:loop dispatch "Write failing test for add_todo" → subagent 生成 test/code。
- Review:post-dispatch jq 验证 status,critical fail block。
- Finish:all pass → "git worktree merge + PR" task。
风险缓解:context loss 用 file-based state(jq update),无限 loop 用 depth limit。测试:mock LLM 返回,assert queue progress。
此 Shell 框架复现 Superpowers 精髓,轻量(<10KB),跨平台。扩展:集成 git worktrees(git worktree add task-$id)。
资料来源: [1] https://github.com/obra/superpowers#subagent-driven-development [2] https://blog.fsck.com/2025/10/09/superpowers/
(正文字数:1256)