# Web Terminal 实施计划 (Phased Plan) > 版本: v0.1 · 定位: 把 [ARCHITECTURE.md](./ARCHITECTURE.md) 的契约拆成**细粒度、低耦合**的任务, > 供**多 agent 并行开发**。完成情况记录在 [PROGRESS_LOG.md](./PROGRESS_LOG.md)。 > 工作流约束见 [CLAUDE.md](../CLAUDE.md)(查 PLAN → 做子任务(TDD) → 验证 → 更新 LOG)。 --- ## 0. 多 Agent 并行规则(开工前必读) 并行的三条铁律,违反会导致 agent 互相踩踏: 1. **文件所有权独占**:每个任务标注 `Owns:`,只有该任务可创建/修改这些文件。 `src/types.ts`(共享契约)由 **T2 独占并冻结**,其余任务**只读** import;若需新增类型, 先回到 T2 改契约(协调点),不得各自在自己文件里另立类型。 2. **只依赖接口,不依赖实现**:任务间通过 `src/types.ts` 的 interface / 函数签名解耦。 `Depends:` 仅表示"需要对方的**接口或产物**",多数情况接口在 W0 就已就绪,故可与"实现方"并行编码, 仅在**集成/测试时**才真正汇合。 3. **LOG 由 orchestrator 独写,subagent 不碰**(G1):`docs/PROGRESS_LOG.md` 是共享文件, **不在任何任务的 `Owns:` 里**。被派的 subagent **不要写 LOG**,而是把日志条目作为**最终返回结果**交回; 由主会话(orchestrator)在每批 agent 返回后统一追加。详见 [CLAUDE.md](../CLAUDE.md)。 每个任务自带 TDD(测试与实现同属一个 agent、同一组文件),所以**不要**把"写测试"和"写实现" 拆给不同 agent —— 那会制造同文件冲突。任务内的 `Steps:` 清单就是细粒度拆分。 **执行用的项目 agent**(见 [`.claude/agents/`](../.claude/agents)):`module-builder`(TDD 实现单个任务)、 `module-reviewer`(只读复查/验收)。orchestrator = 主会话,按 §3 波次派活、按 §4 选模型/隔离。 subagent **不能问用户、不能互相通信**:遇到文档未定义的歧义 → 停下返回 `[!] BLOCKED`,**绝不猜**。 ### 参考文档 **必读文档清单、`ARCH:` 字段用法、`M*/L*` 代号含义 —— 见 [CLAUDE.md → Development Workflow](../CLAUDE.md)。** 该规则对所有任务(尤其上下文隔离的子 agent)统一生效,此处不重复,以 CLAUDE.md 为准。 要点:每个任务读其 `ARCH:` 指向的章节 + Steps 里的 `M*/L*` 锚点(在 ARCHITECTURE.md 内搜同名代号)。 --- ## 1. 依赖关系与并行波次 (Waves) ``` W0 基础(串行, 阻塞全部) T1 脚手架+装齐依赖 → T2 共享契约 types.ts → T3 mock IPty │ ▼ W1 叶子模块(全部并行, 互不依赖 —— 并行度最高) 后端纯函数: T4 config · T5 protocol · T6 ring-buffer · T7 origin 前端(独立于后端整条链): T8 index.html · T9 style.css · T10 keybar · T11 main │ ▼ W2 T12 session(依赖 ring-buffer 实现 + mock IPty) │ ▼ W3 T13 manager(依赖 session) │ ▼ W4 集成(汇合点) T14 server 接线 · T15 集成/E2E 测试 │ ▼ W5 验收与收尾(按 F# 并行) T16–T20 F1–F9 实测 · T21 安全+README+LOG 收尾 ``` **关键并行事实**:前端 T8–T11 不依赖任何后端模块(只依赖 §4 线协议形状,已在 types.ts), 可与 W1–W4 整条后端链**全程并行**,直到 W5 才与运行中的 server 汇合实测。 > ARCH §6 的 S1–S8 是线性视角;本计划是其**并行重排**。每个任务标了 `ARCH:` 做溯源。 **前端构建约定(T1 已定,T8/T11/T14 遵守)**:打包器 = **esbuild**。 - 入口 `public/main.ts`;`npm run build:web` → 打包到 **`public/build/main.js`**(若 main.ts `import '@xterm/xterm/css/xterm.css'`, esbuild 同时出 `public/build/main.css`)。开发用 `npm run dev:web`(--watch)。`public/build/` 已 gitignore。 - `index.html` 以 `