状态机 + RabbitMQ + Git Worktree 并行调度框架。
安装(全局):
npm install -g aha-loop-mq可用命令:
aha-loop:启动完整运行时(Web-first 入口:Monitor UI + Scheduler + Worker + RabbitMQ)aha-loop-engine/aha-loop-mq:启动完整运行时(兼容入口,与aha-loop等价)aha-loop-web:仅启动前端页面与监控 API(standalone 联调模式,控制动作为模拟结果)
示例:
aha-loop --monitor-port 17373
aha-loop-engine --vision ./project.vision.md --workspace /path/to/project
aha-loop-web --monitor-port 17373也可直接使用 npx:
npx -y -p aha-loop-mq aha-loop --monitor-port 17373
npx -y -p aha-loop-mq aha-loop-engine --vision ./project.vision.md --workspace /path/to/project默认入口(Web-first,真实执行):
npx -y -p aha-loop-mq aha-loop完整运行时兼容入口(默认恢复状态):
npm run start:engine仅启动前端页面与项目管理 API(不启动 MQ worker/scheduler):
npm run web说明:standalone web 模式下控制动作返回模拟结果,仅用于页面联调/演示。
- 默认不再按当前工作目录隔离状态。
- 项目与运行态统一持久化到用户级目录:
- Windows:
%APPDATA%\\aha-loop-mq\\state.json - macOS:
~/Library/Application Support/aha-loop-mq/state.json - Linux:
$XDG_STATE_HOME/aha-loop-mq/state.json(未设置时为~/.local/state/aha-loop-mq/state.json)
- Windows:
- 首次启动时,如果全局 state 不存在且当前 workspace 下存在旧
.aha-loop/state.json,会自动迁移一次。 - 可覆盖:
AHA_LOOP_HOME=/path/to/homeAHA_LOOP_STATE_FILE=/path/to/state.jsonnode src/index.js --state-file /path/to/state.json
系统自动完成:
- Vision → Architecture — AI 分析愿景, 生成架构文档
- Architecture → Roadmap — AI 规划里程碑, 拆分 PRD
- PRD → Stories — 每个 Story 进入状态机, 由 Scheduler 调度
- Stories → Worktrees — 每个 Story 独占一个 git worktree, 并行执行
- Worktrees → Merge Gate — 默认进入人工审批 gate,显式
approve_merge后才执行合并
执行编排由 src/scheduler/scheduler.js 完成,不依赖旧的 shell 调度循环。
Pipeline (串行) Scheduler (轮询) Worker Pool (并行)
vision.md Store ←→ StateMachine SessionPool
→ architect ↓ ↓
→ roadmap RabbitMQ spawn AI agent
→ PRD work / retry / dead ↓
→ Store.load git worktree
- 默认阶段统一为 5 phase:
research → explore → plan → implement → review - 对已完成标记自动跳过阶段:
researchCompleted=true跳过researchexplorationCompleted=true跳过exploreplanReviewCompletedAt或planCompleted=true跳过planqualityReviewCompletedAt/qualityReviewCompleted=true/reviewCompleted=true跳过review
- 若 roadmap/prd 显式提供
phases,则按显式配置执行 review统一代表质量验收阶段,别名quality-review/quality_review/qa都会归一到review
phase-engine要求执行代理输出结构化回执:AHA_LOOP_PHASE_RESULT_JSON: {...}session-pool优先消费结构化回执,文本语义判错仅作为兼容兜底.aha-loop/prd.json作为业务输入只读;运行态快照写入.aha-loop/runtime/story-context.json
- 默认
MERGE_MODE=manual_gate(推荐,安全) - 可显式设置
MERGE_MODE=auto启用自动合并 - 手工审批接口:
POST /controlwith{"action":"approve_merge","storyId":"..."}POST /projects/{id}/controlwith{"action":"approve_merge","storyId":"..."}
- 默认不使用危险权限标志(最小权限):
TOOL_DANGEROUS_BYPASS=falseTOOL_SKIP_GIT_REPO_CHECK=true
- 仅在确有必要时显式开启:
- CLI:
--tool-dangerous-bypass - ENV:
TOOL_DANGEROUS_BYPASS=true
- CLI:
- scheduler 支持 roadmap 内并行执行:
- PRD 级:
dependsOn满足后自动queued → active - Story 级:
dependencies/dependsOn满足后进入可分发集合 - 同一 PRD 内无依赖冲突的 story 可并行运行
- PRD 级:
- 实际并行度由
maxConcurrency与 RabbitMQprefetch共同决定:- 默认
RMQ_PREFETCH=0(自动跟随maxConcurrency) - 可用
MAX_CONCURRENCY/RMQ_PREFETCH显式覆盖
- 默认
- 框架: Vanilla HTML/CSS/JS(多页面 MPA)
- 原因: 当前
src/monitor/monitor.js直接托管src/public静态文件,无构建链;该方案与现有运行方式完全兼容,部署成本最低。 - 页面:
/projects.html/overview.html/stories.html/incidents.html/默认重定向到/projects.html
| 模块 | 文件 | 职责 |
|---|---|---|
| StateMachine | src/core/state-machine.js |
通用有限状态机引擎 |
| Store | src/store/store.js |
统一存储 + 状态机校验 |
| Queue | src/queue/queue.js |
RabbitMQ 三队列拓扑 |
| Scheduler | src/scheduler/scheduler.js |
轮询调度 (大脑) |
| Worker | src/worker/worker.js |
MQ 消费 → 执行 |
| SessionPool | src/worker/session-pool.js |
进程池管理 |
| WorktreeManager | src/worktree/worktree.js |
git worktree 生命周期 |
| Pipeline | src/pipeline/pipeline.js |
Vision → PRD 自动化 |
| Monitor | src/monitor/monitor.js |
健康报告 |
- Node.js >= 18
- RabbitMQ AMQP 端口可用 (默认
amqp://127.0.0.1:5672/%2F) - RabbitMQ Management API 可用 (默认
http://127.0.0.1:15672) - Git
启动后默认开放监控接口(MONITOR_HTTP_PORT=17373):
GET /
监控前端 UI(重定向到/projects.html)GET /projects.html
Projects 页面(项目 CRUD + 启停控制)GET /boot.html
兼容入口(重定向到/projects.html)GET /overview.html
总览页面(队列、延迟、生命周期流、告警、控制)GET /stories.html
Stories 页面(状态分布、故事表、运行时间线)GET /incidents.html
Incidents 页面(告警、规则、死信、故障分类)GET /metrics/queues
单接口返回work/retry/dead三队列的messageCount与consumerCountGET /health
同时返回service.alive与service.available,并包含 queue / scheduler / worker / sessionPool 状态
queue 内含runtimeConsumers(本进程消费器数)和 broker 侧consumerCountGET /metrics/latency
返回最近 5/15 分钟的延迟聚合(count/avg/p95)和趋势序列GET /metrics/prometheus
Prometheus 文本格式指标(queue/counter/latency/service)GET /stories
story 状态统计与最近列表(含currentRunId/currentRunStatus,支持?limit=50)GET /runs
codex 调用级运行记录(runId / sessionId / status / start/finish / errorCode,支持?limit=100&storyId=...)GET /alerts
告警规则阈值、运行窗口与最近告警事件(支持?limit=50)GET /dead-letters
从.aha-loop/dead-letters.jsonl读取最近死信记录(支持?limit=50)GET /boot/workspace
workspace / queue / semantics / tool / maxConcurrency / prefetch 等运行配置GET /boot/vision
当前 vision 文件路径与内容(若存在)
日志统一为 JSON,关键事件至少覆盖:
dispatchstartsuccessfailretrydeadmerge
关键事件统一字段:
timestampleveleventstoryIdprdIdphaseattempttraceIderror
run 级关键字段:
runIdsessionIdexitCodeerrorCodeerrorSource
可通过 storyId + traceId 串联完整生命周期。
当前消费模式为 amqplib consumer + manual ack/nack,语义定义为 at-least-once。
- worker 异常退出时,未 ack 消息会由 broker 重新投递(可能重复,需幂等)
- handler 失败时:优先路由 retry,超过上限进入 dead
- session pool 并发打满时:消息直接
nack(requeue=true)回队列,不消耗 attempt - 失败处理为 fail-fast:仅在 worker/session 明确失败(异常/非零退出/超时)时推进
failed/retry/dead - scheduler 不做自动恢复/自动纠偏;状态异常只记录
anomaly日志,等待显式错误或人工处理 - 系统会记录
delivery_semantics日志用于复盘 - 可通过
DELIVERY_SEMANTICS/RMQ_ACK_MODE配置查看或覆盖,默认强制对齐 at-least-once
Monitor 已内置最小告警规则(日志事件 alert,可选 webhook):
- dead 队列长度
> 0持续2分钟 - retry rate
> 20%(5 分钟窗口) - work 队列持续上涨且 completed 不上涨(3 分钟窗口)
可选 webhook:
ALERT_WEBHOOK_URL=https://your-webhook
死信落盘:
DEAD_LETTER_LOG_FILE=.aha-loop/dead-letters.jsonl