docs: log W2-W4 (T12-T15 done, 187 tests, real-PTY E2E verified)

This commit is contained in:
Yaojia Wang
2026-06-17 10:37:01 +02:00
parent cdec19a256
commit 86c7e3de02

View File

@@ -24,12 +24,14 @@
> 新会话读到的第一块。保持准确,只描述"此刻"。
- **Wave**: W0 ✓ · **W1 全部 ✓**(后端 T3T7 + 前端 T8T11,**141 测试全绿**,前后端 tsc 通过,esbuild 打包通过)→ 下一步 **W2 T12**
- **任务**: **T12 `session/session.ts`**(opus,最硬:PTY 生命周期 detach/onExit/L1/L4/M5)。依赖已就绪:T6 ring-buffer、T3 mock IPty。串行,单个 builder
- **下一步**: 派 T12(DISPATCH.md 有 prompt);完成后 W3 T13 manager → W4 T14/15 集成
- **Wave**: W0 ✓ · W1 ✓ · **W2/W3/W4 ✓**(T12 session · T13 manager · T14 server · T15 集成)→ 下一步 **W5 验收 + 收尾**
- **进度**: **15/21 任务 · 187 测试全绿 · 真 PTY 端到端已验证**(集成 ⑤⑥ sandbox-off 6/6:attach→output + 重连回放 F5/F6 含 CJK/ANSI)。产品功能完整
- **任务**: W5 = T16T20 验收(F1F9,多数需**真浏览器/真机**)+ T21(orchestrator:安全核对 + README + LOG 收尾)
已由集成测试覆盖的:**F9**(①②坏Origin/路径)、**F5/F6**(⑤⑥回放)、**F8 部分**(④exit)。需真机的:F1F4、F7。
- **下一步**: orchestrator 做 T21(README+安全),并对 F1F3 尝试无头浏览器 smoke;F4(局域网)/F7(手机)交用户真机验。
- **阻塞**: 无。
- **次要 tech-debt**: main.ts 用了 1 处 `@ts-ignore` 压制 CSS import 诊断;未来`public/*.css` `declare module` d.ts 去掉它(非阻塞)
- **最后更新**: 2026-06-16
- **次要 tech-debt**: main.ts 1 处 `@ts-ignore`(CSS import);未来加 `*.css` d.ts
- **最后更新**: 2026-06-17
---
@@ -51,10 +53,10 @@
| T9 | W1 | `public/style.css` | `[x]` | 1/1 | 2026-06-16 |
| T10 | W1 | `public/keybar.ts` | `[x]` | 4/4 | 2026-06-16 |
| T11 | W1 | `public/main.ts` | `[x]` | 6/6 | 2026-06-16 |
| T12 | W2 | `session/session.ts` | `[ ]` | 0/7 | |
| T13 | W3 | `session/manager.ts` | `[ ]` | 0/6 | |
| T14 | W4 | `server.ts` 接线 | `[ ]` | 0/6 | |
| T15 | W4 | 集成 / E2E 测试 | `[ ]` | 0/2 | |
| T12 | W2 | `session/session.ts` | `[x]` | 7/7 | 2026-06-16 |
| T13 | W3 | `session/manager.ts` | `[x]` | 6/6 | 2026-06-16 |
| T14 | W4 | `server.ts` 接线 | `[x]` | 6/6 | 2026-06-17 |
| T15 | W4 | 集成 / E2E 测试 | `[x]` | 2/2 | 2026-06-17 |
| T16 | W5 | 验收 F1F3(终端/TUI/resize) | `[ ]` | 0/3 | — |
| T17 | W5 | 验收 F4+F9(LAN/Origin) | `[ ]` | 0/2 | — |
| T18 | W5 | 验收 F5+F6(保活/回放) | `[ ]` | 0/2 | — |
@@ -119,6 +121,17 @@
- **遗留 / 待办**: 无(原前端打包待决项已解决,见下补记)。
- **commit**: `b126cf0`
### 2026-06-17 · W2/W3/W4 — 会话核心 + 集成(T12/T13/T14/T15)
- **状态**: `[x]` ALL DONE · 串行(各有依赖),单 builder/任务
- **T12 `session/session.ts`**(opus,19 测试):createSession/attachWs/detachWs/writeInput/resize/kill;onData→buffer+lastOutputAt+转发;onExit→exitedAt/exitCode+发exit+注入onExit;**spawn 失败抛(M4)**;sendIfOpen 守卫 readyState(M5);detach 不杀 PTY;exit 后 write/resize 忽略(L4);detach 后退出保留会话(L1)。测试 `vi.mock('node-pty')`→mock IPty,沙箱内可跑。
- **T13 `session/manager.ts`**(sonnet,21 测试):handleAttach 四路径(新建/存活/已退出 L1/查不到);reapIdle `now-max(detachedAt,lastOutputAt)>idleTtl`(M3);shutdown 全 kill;注入 onExit 在线退出删表、detach 后退出保留待 L1(L2)。
- **T14 `server.ts`**(sonnet,~200 行):Express 静态 public/+build/;`WebSocketServer({noServer,maxPayload})`(L5);upgrade 门(非 wsPath→destroy、坏 Origin→401、过→handleUpgrade,L3);connection 等 attach,try/catch→spawn 失败 exit(-1)+关连接(M4);message 路由;close→detach(不杀);SIGINT/TERM→shutdown;reapIdle 定时器;safeSend 守卫(M5)。导出 startServer 供 T15。
- **T15 集成**(sonnet,6 用例):真 ws 客户端打 startServer。①坏Origin 401 ②错路径 destroy ③超 maxPayload 1009 ④spawn失败 exit(-1) —— 沙箱内全绿;⑤attach→output ⑥重连回放(F5/F6,含 `__MARK_测试__` CJK)—— **orchestrator 加 `PTY_AVAILABLE` 门控(沙箱自动 skip,真机跑),关沙箱验证 6/6 全绿**
- **验证(orchestrator 独立复核)**: 每步 `tsc --noEmit` ✓ + 全量 `npm test` 递增至 **187 全绿**;集成 sandbox-off 6/6(真 PTY)。
- **决策 / 偏离**: T12 onData 时间戳用 Date.now()(事件时刻,符合 lastOutputAt 语义);T15 由 orchestrator 加 PTY 可用性门控(原 `it.skip``itPty`),使真机会跑、沙箱自动跳过。
- **commit**: `20212dd`(T12)·`a2897b2`(T13)·`0dac54b`(T14)·`cdec19a`(T15)
### 2026-06-16 · W1 前端批次(T8/T9/T10/T11)
- **状态**: `[x]` ALL DONE