docs: W5 acceptance — browser smoke (F1/F2/F3/F8) + log v0.1 status

7/9 acceptance criteria auto-verified: F1/F2/F3/F8 via headless browser
(xterm renders, echo round-trips, exit prompt, resize survives), F5/F6/F9 via
integration tests. F4 (LAN) + F7 (phone keybar) need physical devices -> user.
gitignore .gstack/.
This commit is contained in:
Yaojia Wang
2026-06-17 11:18:13 +02:00
parent 81585ad35f
commit f3b6ad5a68
2 changed files with 26 additions and 12 deletions

1
.gitignore vendored
View File

@@ -15,3 +15,4 @@ npm-debug.log*
# test coverage # test coverage
coverage/ coverage/
.gstack/

View File

@@ -24,12 +24,11 @@
> 新会话读到的第一块。保持准确,只描述"此刻"。 > 新会话读到的第一块。保持准确,只描述"此刻"。
- **Wave**: W0 ✓ · W1 ✓ · **W2/W3/W4 ✓**(T12 session · T13 manager · T14 server · T15 集成)→ 下一步 **W5 验收 + 收尾** - **Wave**: **W0W5 基本完成**。v0.1 功能完整、测试与真机浏览器验证通过。仅剩 2 项需用户真设备。
- **进度**: **15/21 任务 · 187 测试全绿 · 真 PTY 端到端验证**(集成 ⑤⑥ sandbox-off 6/6:attach→output + 重连回放 F5/F6 含 CJK/ANSI)。产品功能完整 - **进度**: **20/21 任务**(T19 待真手机)· **187 自动化测试全绿** · 真 PTY 端到端验证 · **真浏览器 smoke 通过**
- **任务**: W5 = T16T20 验收(F1F9,多数需**真浏览器/真机**)+ T21(orchestrator:安全核对 + README + LOG 收尾)。 - **验收 F1F9**: ✅ F1/F2(浏览器 smoke:渲染+输入输出+全彩)· ✅ F3(resize 无错)· ⬜ **F4 需局域网真机** · ✅ F5/F6(集成 ⑤⑥ 回放 CJK/ANSI)· ⬜ **F7 需真手机**(软键盘栏)· ✅ F8(浏览器 exit→重连提示)· ✅ F9(集成+curl 401)。
已由集成测试覆盖的:**F9**(①②坏Origin/路径)、**F5/F6**(⑤⑥回放)、**F8 部分**(④exit)。需真机的:F1F4、F7 - **下一步(交用户)**: 真手机/另一台电脑开 `http://<你IP>:3000` 实测 **F4**(局域网可用)与 **F7**(Esc/Shift+Tab/方向键等触摸键生效)
- **下一步**: orchestrator 做 T21(README+安全),并对 F1F3 尝试无头浏览器 smoke;F4(局域网)/F7(手机)交用户真机验 - **阻塞**: 无(F4/F7 非阻塞,属需物理设备的人工验收)
- **阻塞**: 无。
- **次要 tech-debt**: main.ts 1 处 `@ts-ignore`(CSS import);未来加 `*.css` d.ts。 - **次要 tech-debt**: main.ts 1 处 `@ts-ignore`(CSS import);未来加 `*.css` d.ts。
- **最后更新**: 2026-06-17 - **最后更新**: 2026-06-17
@@ -57,12 +56,12 @@
| T13 | W3 | `session/manager.ts` | `[x]` | 6/6 | 2026-06-16 | | T13 | W3 | `session/manager.ts` | `[x]` | 6/6 | 2026-06-16 |
| T14 | W4 | `server.ts` 接线 | `[x]` | 6/6 | 2026-06-17 | | T14 | W4 | `server.ts` 接线 | `[x]` | 6/6 | 2026-06-17 |
| T15 | W4 | 集成 / E2E 测试 | `[x]` | 2/2 | 2026-06-17 | | T15 | W4 | 集成 / E2E 测试 | `[x]` | 2/2 | 2026-06-17 |
| T16 | W5 | 验收 F1F3(终端/TUI/resize) | `[ ]` | 0/3 | | | T16 | W5 | 验收 F1F3(终端/TUI/resize) | `[x]` | 3/3 | 2026-06-17 |
| T17 | W5 | 验收 F4+F9(LAN/Origin) | `[ ]` | 0/2 | | | T17 | W5 | 验收 F4+F9(LAN/Origin) | `[~]` | 1/2 | 2026-06-17 |
| T18 | W5 | 验收 F5+F6(保活/回放) | `[ ]` | 0/2 | | | T18 | W5 | 验收 F5+F6(保活/回放) | `[x]` | 2/2 | 2026-06-17 |
| T19 | W5 | 验收 F7(移动键栏) | `[ ]` | 0/1 | | | T19 | W5 | 验收 F7(移动键栏) | `[ ]` | 0/1 | 需真机 |
| T20 | W5 | 验收 F8(退出处理) | `[ ]` | 0/2 | | | T20 | W5 | 验收 F8(退出处理) | `[x]` | 2/2 | 2026-06-17 |
| T21 | W5 | 安全核对 + README + LOG 收尾 | `[ ]` | 0/3 | | | T21 | W5 | 安全核对 + README + LOG 收尾 | `[x]` | 3/3 | 2026-06-17 |
--- ---
@@ -121,6 +120,20 @@
- **遗留 / 待办**: 无(原前端打包待决项已解决,见下补记)。 - **遗留 / 待办**: 无(原前端打包待决项已解决,见下补记)。
- **commit**: `b126cf0` - **commit**: `b126cf0`
### 2026-06-17 · W5 — 验收 + 收尾(T16T21)
- **状态**: T16 ✅ · T17 部分(F9✅/F4 待真机)· T18 ✅ · T19 待真机 · T20 ✅ · T21 ✅
- **T21**(orchestrator):写 `README.md`(install/run/config/security);安全自查——无硬编码 secret(grep 空)、Origin+路径+maxPayload 校验已接线(server.ts 确认)、无 eval/exec、input 原样透传给 PTY(byte-shuttle 设计意图);`npm run build``dist/server.js` 可产出。
- **F1/F2/F3/F8 浏览器 smoke**(关沙箱起 server + gstack browse 无头 Chromium):
· 加载 http://127.0.0.1:38080 → **.xterm 挂载、0 console error、WS 连上、彩色状态行 + 真 zsh 彩色提示**(F1/F2)。
· 聚焦 `.xterm-helper-textarea` 输入 `echo hello-webterm` → 回显 + 输出 `hello-webterm`(**输入→WS→PTY→shell→输出→xterm 全链路**)。截图 /tmp/webterm-smoke2.png。
· 输入 `exit` → 终端显示 "Process exited code=0 Press Enter to reconnect…"(F8)。
· 改 viewport(F3)→ 终端存活、无 console error。
· curl 复核:GET / 200、/build/main.js 200、坏 Origin upgrade → 401。
- **决策**: F4(局域网多设备)、F7(手机软键盘栏)需物理设备,无法在本机无头验证 → 交用户真机。其余 7/9 F 项已自动化验证。
- **遗留**: T19(F7)待真手机;F4 待局域网真机;main.ts 的 css `@ts-ignore` 小债。
- **commit**: `81585ad`(README/安全)+ 本条 LOG
### 2026-06-17 · W2/W3/W4 — 会话核心 + 集成(T12/T13/T14/T15) ### 2026-06-17 · W2/W3/W4 — 会话核心 + 集成(T12/T13/T14/T15)
- **状态**: `[x]` ALL DONE · 串行(各有依赖),单 builder/任务 - **状态**: `[x]` ALL DONE · 串行(各有依赖),单 builder/任务