arch-mapping.md
3.76 KB
对 LemonBoss 现有架构的映射
99% 是在现有抽象上加薄薄一层。本页列出每一项能力的对照:REUSE(沿用)/ NEW(新增)/ PATCH(小改)。
能力映射总表
| 能力 | 新组件 | 对应现有模块 | 改动 |
|---|---|---|---|
| Agent 启动与会话复用 | — | packages/acp-core/protocol/ClaudeCliProtocol.js + server/src/core/session-pool.js |
REUSE |
| 多 Agent 调用 facade | — | server/src/core/agent-manager.js · master-session.js |
REUSE |
| 任务 → 步骤拆分 | — | server/src/tools/orchestrate-tool.js |
REUSE |
| DAG 依赖解析 | — | server/src/core/scheduler.js (getExecutionGroups) |
REUSE |
| Pipeline 描述结构 | — | server/services/pipeline-service.js |
REUSE · units.json 复用 step 结构 |
| 重试 + 反思 | retryWithReflection() 写在 loop-controller.js 内 |
参考 server/services/evolution-loop.js (PRAE) 思路,但不抽公共 |
NEW · P5 再考虑合并 |
| ACP / Claude CLI 协议层 | — | packages/acp-core/ |
REUSE |
| Agent 模板注册 | 6 个新模板 | system/templates/_registry.json |
NEW |
| 三层 Loop 编排 | LoopController |
server/src/core/loop-controller.js |
NEW |
| PRD/SDD 文档存储 | DocStore |
server/services/doc-store.js |
NEW |
| Unit 状态机 | UnitRegistry |
server/services/unit-registry.js |
NEW |
| HTTP / SSE 入口 | /api/devloop/* |
server/routes/devloop.js → 挂在 server/index.js |
NEW |
| Web 看板 | DevLoopDashboard.vue |
放在 web/src/views/,复用 PipelineEditor DAG 渲染 |
NEW |
| 结果持久化根 | — | data/companies/{cid}/projects/{pid}/ |
REUSE · 沿用 company-scoped 文件根 |
| 进程沙箱 / 端口管理 | — | server/src/engine/process-guard.js |
REUSE |
| WS 流式 | — | server/routes/claude-chat-ws.js |
REUSE · DevLoop SSE 走 HTTP 复用同套帧 |
分层视图
三色块代表三种改动类型;越靠下越基础,越靠上越业务。
红 新增 · 灰 复用 · 黄 补丁 · 黑 底层依赖
为什么 P1~P4 不抽公共 retry 函数
EvolutionLoop 当前实现 PRAE (Perceive → Reason & Plan → Execute → Evaluate → Reflect),里面有「失败 → 反思 → 重试」逻辑。直觉上 L1 可以共用,但初版决定不抽:
- 避免回归风险:EvolutionLoop 跑的是 Skill 进化,目前在生产里运行。动它意味着要把 Skill 进化的回归一起做。
- 反思 prompt 差异大:Skill 进化的反思是「Skill 评分低,怎么改 prompt」;L1 的反思是「单测失败,代码哪里错」。共用会让 prompt 模板变成「上帝模板」,反而难维护。
- 80 行不算多:P2 在 loop-controller.js 内重写一份 retryWithReflection 也就 80 行,DRY 不必这么早追。
// P2 直接在 server/src/core/loop-controller.js 写一份新的
async function retryWithReflection(unit, budget) {
let failures = [];
for (let i = 0; i < budget; i++) {
await agentManager.callAgent('coder', { spec: unit.spec, history: failures });
const r = await agentManager.callAgent('tester', { unit });
if (r.ok) return { ok: true, retries: i };
failures.push(r.failures);
}
return { ok: false, reason: "budget_exceeded" };
}
// P5 视实测情况再决定是否与 evolution-loop 合并到 packages/ 公共目录
这条改动同步影响 plan-migration.html 的 P2 阶段:retry 函数从「抽公共」改为「直接新写」。
不动的边界
本次改造绝不触碰:
- ACP 协议本身(
packages/acp-core/) - Master / Orchestrator 已有行为(仅注册新的 6 个 Agent 模板)
- WebSocket 路由(
/ws/claude) - SkillsMarket / Arena 路径下任何文件
- 认证 / 用户系统(
routes/auth.js,routes/users.js)