Skip to content

Latest commit

 

History

History
473 lines (284 loc) · 19 KB

acceptance.md

File metadata and controls

473 lines (284 loc) · 19 KB

全 issue 验收手册

本文件为仓库全部 50 个 issue 的验收操作说明。每条给出:验收方式(命令 / 测试 / computer-use 交互)、操作步骤、通过标准。

0. 通用约定

0.1 验收环境准备

npm install
npm run typecheck   # 任何实施类 issue 验收前先跑
npm test            # 全量测试必须绿

真实 LLM 验收需二选一:

  • KIMI_API_KEY=<key> 环境变量;
  • 或先跑一次 kimi 让 ~/.kimi-code/credentials/kimi-code.json 里有未过期 OAuth token。

无 key 环境用 FAKE_LLM=1(FakeLLM 预置脚本流)做功能性验收。

0.2 computer-use(CU)验收通用流程

TUI 类 issue 的交互验收用 kimi-cu 工具,标准流程:

  1. 在一个可见终端窗口(Windows Terminal / conhost)里启动 TUI:npm run dev(或 FAKE_LLM=1 npm run dev)。
  2. list_apps / list_windows 找到终端窗口,activate_window 置前。
  3. get_app_state(含截图)确认渲染内容。
  4. 用 type_text / press_key 模拟输入与键位,click 仅在确有需要时用。
  5. 每个关键动作后重新 get_app_state 截图,对照通过标准逐项核对。
  6. 验收结束 turn_ended 收尾。

注意:CU 截图验证的是「真实终端里的最终表现」,VirtualTerminal 测试验证的是「渲染逻辑」。两者不互相替代——实施票要求两者都过。

0.3 决策 / 调研 / 原型票的验收通则

这三类不写产品代码,验收标准是「产出物存在且能指导下游」:

  • 决策票:结论以评论或 ADR 落盘,明确回答 issue 里列的每个待定点;被它 block 的下游 issue 能引用结论开工。
  • 调研票:回答 issue 的 Question,附证据(源码行号 / 实测记录),不泄露 token。
  • 原型票:有可运行的原型 + 真人试用反应记录链接到 issue。

1. 已关闭 issue 的复核(#1 #3 #4)

#1 [CLOSED] MVP:最小引擎 + -p print 模式

方式:命令 + 测试。

# 真实链路(有 key)
npm run agent -- -p "在当前目录写一个 helloworld 程序并告诉我文件路径"
# 无 key
FAKE_LLM=1 npm run agent -- -p "写一个 helloworld"

通过标准:

  • agent 真实调用 write_file 写出 helloworld 文件,stdout 打印最终回复;
  • wire.jsonl 追加全程事件,seq 单调递增;
  • npm test 中 loop / toolExecutor / wire 三组接缝测试全绿;
  • 引擎目录(src/engine/)无任何 TUI 依赖。

#3 [CLOSED] 调研:订阅 search/fetch 端点

方式:文档复核。issue 评论中有请求/响应格式、认证方式(POST + Bearer 复用 OAuth)、封装建议(超时/截断/错误归类),且 #35 #36 能直接按它实现。复核时用一次真实调用抽验:

curl -s -X POST https://api.kimi.com/coding/v1/search \
  -H "Authorization: Bearer $KIMI_API_KEY" -H "Content-Type: application/json" \
  -d '{"text_query":"test"}' | head -c 500

返回 JSON 结果数组即通过(不要在任何地方记录完整 token)。

#4 [CLOSED] 调研:pi-tui 依赖方式与 API 约束

方式:文档复核。issue 评论包含:依赖方式结论(vendor 拷贝)及 file: 协议的坑、关键 API(TUI/Container/Editor/Markdown/Loader/CombinedAutocompleteProvider/VirtualTerminal)带源码行号的用法约束、最小骨架在 node type-stripping / tsx / vitest 三路跑通的记录。#10 能直接引用它做决策即通过。


2. 地图与决策票(#2 #5–#13)

#2 Map:从 MVP 到每周真用

方式:流程复核。这是地图票,验收 = 收图条件满足:

  • Destination 产物存在:#13 的 spec v2 已落地;
  • 地图内所有决策票(#5–#11)关闭,「Not yet specified」清空或转为新地图;
  • 最终验收挂钩 #50(一周 ≥3 真实任务)达标。

#5 决策:审批事件契约与分级规则引擎形状

方式:产出物复核(按 0.3 通则)。结论必须逐项回答:approval 事件怎么表达、loop 如何暂停等 UI 回答、规则引擎放哪层、规则与会话记忆存哪、-p 默认策略。验收动作:拿着结论去审 #25–#28 的实现是否与其一致——对得上即通过。

#6 决策:会话恢复语义

方式:产出物复核。结论明确:重建消息是否进 LLM 上下文、tool_call_id / toolCalls 如何还原、会话边界与重启行为。#29 #30 的实现与之对照一致即通过。

#7 决策:上下文溢出策略

方式:产出物复核。结论明确:截断策略选型、token 估算方式,并回答「玩具场景多久撞到 256K」。#31 #32 据此实现即通过。

#8 决策:内置工具清单定稿

方式:产出物复核。清单定稿(含 list_files / grep / glob / web_search / web_fetch 取舍),每个工具有参数 schema、截断、超时定义。#33–#37 按清单逐项落地即通过。

#9 决策:配置文件格式、位置与优先级

方式:产出物复核。结论明确:文件位置、格式、字段、与 env / OAuth 的三级优先级。#38 按结论实现即通过。

#10 决策:pi-tui 依赖方式

方式:产出物复核 + 实证。结论选定三选一方案后,仓库里能实际安装/构建通过(npm install && npm run typecheck),即决策已落地。

#11 决策:TUI 实施切分与每批验收点

方式:产出物复核。切分方案存在且 #14–#18 的边界、测试接缝、装配顺序与之对应;每批验收点可执行(指向具体测试或 CU 步骤)。

#12 原型:审批确认 UI 低成本原型

方式:CU 交互验收(原型本身)+ 反应记录。

  1. 运行原型(按原型票内说明启动)。
  2. CU 截图确认审批帧形态(内联或 overlay)。
  3. 用 press_key 分别按 y / n / a / esc,逐次截图确认各自行为符合原型约定。
  4. issue 内有真人试用反应记录。

#13 任务:落地拓展路线 spec v2

方式:文档复核。根目录 spec v2(或新 spec 文件)包含:A 阶段 TUI 切分、B 阶段最小集(审批/会话恢复/工具链/配置/溢出策略)、验收标准「一周 ≥3 真实任务」。前置 #5–#12 全关闭后才可验收。读一遍 v2,能据此回答「下一步做什么」即通过。


3. TUI 实施切片(#14–#18)

#14 实施:theme 模块

方式:测试 + 代码检查。

  • npm test 中 theme 接缝测试绿:token 完整性、pi-tui theme 映射形状;
  • 检查 src/tui/theme/(或对应目录)为颜色唯一来源:grep -r "chalk\." src/tui/components src/tui/controllers 应无直接命名色使用。

#15 实施:消息块组件 + VirtualTerminal 测试底座

方式:测试。

  • VirtualTerminal(@xterm/headless)行为测试绿:渲染 user / assistant / tool-call 三种块,断言视口内容;
  • 抽查:组件取色只经 theme(同 #14 的 grep)。

#16 实施:streaming-ui controller + chrome 组件

方式:测试。

  • 喂 assistant.delta 事件序列,断言 Markdown 块增量更新、loader 启停时序;
  • footer / loader / welcome 组件各自有渲染断言。

#17 实施:coordinator + editor + slash 命令 + Ctrl+C

方式:测试 + CU。

  • 测试:slash 命令声明/解析/执行分离的单元测试绿;
  • CU:启动 TUI,输入 /clear 截图确认消息区清空;输入 /delete 确认行为符合定义;press_key 发送 Ctrl+C 两次(或按实现约定),确认干净退出、终端 raw mode 恢复(退出后终端能正常输入)。

#18 实施:TUI 端到端冒烟 + 接通引擎

方式:CU + 测试,A 阶段总验收口。

  • VirtualTerminal 冒烟测试绿:提交一条消息 → 视口出现用户块 + 回复块;
  • CU(fake):FAKE_LLM=1 npm run dev,输入一句话提交,截图确认完整 turn:用户块、loader、assistant 回复、工具帧依次出现;
  • CU(真实):无 FAKE_LLM 用订阅凭证重复上面流程,确认真实 LLM 路径通;
  • npm run dev 一键启动,无需额外手工步骤。

4. TUI 增强(#19–#24)

#19 TUI:welcome / banner

方式:CU。启动 TUI,首屏截图确认欢迎块含:工具名、模型名、工作区路径、提示语;颜色走 theme(无硬编码色)。

#20 TUI:assistant.think 折叠渲染

方式:测试 + CU。

  • 测试:喂 assistant.think 事件断言折叠渲染、不混入正式回复;
  • CU:用真实模型问一个触发 reasoning 的问题,截图确认思考流折叠/淡化展示,展开后与回复正文分离。

#21 TUI:slash 命令补全

方式:CU。editor 输入 /,截图确认补全列表出现(至少含 /clear /delete);继续输入 /cl 列表收窄;选中执行生效。

#22 TUI:多行输入键位语义

方式:CU。

  1. 输入一行文字,press_key 发送 Shift+Enter(或 Alt+Enter,以 #4 调研结论为准),截图确认换行未提交;
  2. press_key 发送 Enter,确认提交;
  3. 粘贴一段多行文本,确认未误提交、再按 Enter 才提交。

#23 TUI:终端背景检测与暗/亮主题

方式:CU + 测试。

  • 测试:检测失败时安全降级到暗色的单测绿;
  • CU:分别在暗色、亮色终端主题下启动,各截图一张,确认两套 token 生效且可读。

#24 TUI:工具帧折叠/展开与长输出截断

方式:CU + 测试。

  • 测试:超长工具输出截断断言;
  • CU:让 agent 跑一条长输出命令(如 dir /s 或读大文件),截图确认默认折叠为摘要;执行展开操作(按键/点击以实现为准),确认全文可见;超长部分有截断标记。

5. 审批(#25–#28)

#25 审批:分级规则引擎

方式:测试为主。

  • 规则表驱动测试绿:只读 pattern(ls、git status、npm test)自动放行无审批事件;危险 pattern(rm -rf、git push、写工作区外)强制确认或拒绝;其余触发一次询问;
  • 抽查实现分层与 #5 结论一致。

#26 审批:会话级「始终允许」记忆

方式:测试 + CU。

  • 测试:答 always 后同 pattern 不再产生审批事件;
  • CU:触发一条非白名单命令 → 审批帧按 a → 再触发同 pattern 命令,截图确认直接执行无审批帧;新开会话后记忆不残留(或按 #5 结论的行为)。

#27 审批:-p 模式 --yes 放行策略

方式:命令。

# 无 --yes:写/执行类请求应被拒绝或跳过,只读工具正常
npm run agent -- -p "写一个文件 x.txt"          # 预期:不放行写操作
npm run agent -- -p --yes "写一个文件 x.txt"    # 预期:放行
npm run agent -- -p --yes "删除系统目录"        # 预期:危险 pattern 仍被规则引擎拦截

三种行为均符合 #5 结论即通过。

#28 审批:TUI 确认交互接入

方式:CU(按 #12 原型形态)。

  1. TUI 里让 agent 执行需确认的工具调用(如写文件);
  2. 截图确认审批帧出现在消息区,loop 暂停(后续事件不再推进);
  3. 按 y → 确认执行继续;重做一次按 n → 确认工具被拒绝且结果回灌给 LLM;esc 行为按 #5 契约核对。

6. 会话恢复与管理(#29 #30 #47)

#29 会话恢复:wire 冷重建进上下文

方式:命令 + 测试。

  • 测试:含 tool 消息的 wire 重建后协议形状正确(tool_call_id 配对还原,若 #6 决定进上下文);
  • 实操:跑一轮对话退出 → 重启继续上次会话 → 问一个依赖上文的问题(如「刚才那个文件叫什么」),确认模型能答对——证明上下文真恢复了,不只是 UI 展示。

#30 会话管理:会话文件按工作区组织

方式:命令 + 文件检查。

  • 在不同目录各跑一次会话,确认会话文件按工作区分目录存放,不再固定 wire.jsonl;
  • 同一工作区跑两次,确认支持「继续上次」与「新建」两种路径;
  • 跨工作区互不串扰。

#47 体验:启动时会话历史列表与选择

方式:CU。

  1. 在有历史会话的工作区启动 TUI;
  2. 截图确认会话列表出现(时间/摘要可辨);
  3. 选中一条旧会话继续,确认历史消息加载;再验证「新建」入口可用。

7. 上下文(#31 #32)

#31 上下文:滑动窗口截断策略

方式:测试为主。

  • 构造超长 messages 的接缝测试绿:截断后形状符合 #7 结论(滑动窗口 / system+最近 N 轮 / 报错引导);
  • 边界断言:不切断 tool_call 与 tool 结果配对;
  • 可用脚本实测:连续多轮灌长文本逼近上限,观察触发行为与 #7 一致。

#32 上下文:token 用量估算与 footer 显示

方式:测试 + CU。

  • 测试:估算函数单测(字符数/4 或 usage 取值,以 #7 为准);
  • CU:对话若干轮后截图 footer,确认占用数值随对话增长;灌长文逼近上限时截图确认视觉警示出现。

8. 内置工具(#33–#37)

#33 工具:list_files

方式:测试 + 命令。

  • 测试:临时目录构造断言输出(树形/扁平、深度与条数限制);
  • 命令:-p 模式让 agent「列出当前目录结构」,确认模型收到紧凑格式并正确使用。

#34 工具:grep / glob

方式:测试。

  • 正则内容搜索与文件名匹配各自的测试绿:结果上限截断、默认尊重 .gitignore;
  • 确认纯 Node 实现(package.json 无新增运行时依赖)。

#35 工具:web_search

方式:测试 + 真实调用。

  • 测试:mock fetch 断言请求形状(POST {text_query} + Bearer)、title/url/snippet 映射、输出硬截断、15s 超时、401/402/403 归类不重试;
  • 真实:-p "搜一下 xxx 并总结",确认返回真实搜索结果(需有效凭证)。

#36 工具:web_fetch

方式:测试 + 真实调用。

  • 测试:mock 断言 POST {url} + Accept: text/markdown、非法 URL 拒绝、30s 超时、50KB 截断;
  • 真实:-p "抓取 https://example.com 并概括",确认拿到正文。

#37 工具:输出截断统一策略

方式:测试 + 代码检查。

  • 测试:每个内置工具喂超限输出,断言统一上限(如 50KB)、[...truncated] 标记、行数/字节双阈值;
  • 检查收口在 ToolExecutor 一层,而非各工具自行其是(grep 截断逻辑应只出现一次)。

9. 配置(#38 #39)

#38 配置:本地配置文件加载与 env 优先级合并

方式:命令矩阵。按 #9 的三级优先级逐级覆盖验证:

# 1. 仅配置文件 → 生效
# 2. 配置文件 + env → env 胜出
# 3. 全缺省 → 回落订阅 OAuth
KIMI_API_KEY=xxx npm run agent -- -p "hi"   # 等组合逐一试

每次启动打印生效来源(脱敏,不出现完整 key),来源标注与实际优先级一致即通过。

#39 配置:系统 prompt 可配置化

方式:命令 + 测试。

  • 在项目级文件(AGENTS.md / .agent.md,以 #9/#38 为准)写入自定义指令,跑 -p 提问,从回答确认指令生效;
  • 删掉该文件,确认默认 prompt 行为回退;
  • 测试:配置加载单测覆盖「有覆盖 / 无覆盖」两路径。

10. 引擎健壮性(#40–#42)

#40 引擎:LLM 错误分类与用户友好报错

方式:测试 + 命令。

  • 测试:mock fetch 分别返回 401/403、429、5xx、网络错误,断言各自错误消息含可操作建议(401/403 提示刷新凭证或设 KIMI_API_KEY);
  • 命令:故意设一个错误 key 跑一次,确认报错是人话而非原始 HTTP 堆栈。

#41 引擎:真实 API 有限重试

方式:测试。

  • mock fetch:网络错误/5xx → 断言指数退避重试且上限 2–3 次;4xx → 断言不重试立即报错;
  • 确认无 OAuth 自动刷新逻辑(保持玩具诚实)。

#42 引擎:wire 损坏行容错

方式:测试 + 命令。

  • 测试:预写含坏 JSON 行的 wire 文件,断言跳过坏行、告警带行号、其余事件正常读出;
  • 命令:手工往 wire.jsonl 塞一行乱码后重启/重建,确认不崩、stderr 有告警。

11. 工程与发布(#43–#45)

#43 工程:CI(GitHub Actions)

方式:GitHub 实证。

  • push 一个分支或开 PR,在 Actions 页确认 Windows + Linux 双平台矩阵触发;
  • 两个平台均跑 typecheck + vitest 且绿;
  • 故意推一个破测试验证 CI 会变红(可选但推荐)。

#44 工程:跨平台兼容性验证

方式:矩阵验证 + 文档。

  • 借 #43 的 CI 矩阵跑自动化部分;
  • 在 win / mac / linux 各手工跑一次 run_command 相关场景:shell 分叉(cmd/sh)、含空格路径、超时后进程树清理(win 上 taskkill);
  • issue 内落一份平台差异表。

#45 发布:全局可用的 bin 形态

方式:命令(在任意目录)。

按 #13 选定的形态验收,例如 npm link 路线:

npm link
cd /tmp/some-random-dir   # 或任意其他目录
mini-agent -p "写一个 helloworld"

在任意目录 agent 命令可用且功能完整即通过;若选 bundle 路线则验证单文件可执行、无 node_modules 依赖。


12. 体验与文档(#46 #48 #49)

#46 体验:-p 模式 --output-format stream-json

方式:命令 + 管道消费。

npm run agent -- -p --output-format stream-json "hi" | head -20
npm run agent -- -p --output-format stream-json "hi" | node -e "/* 逐行 JSON.parse 全成功 */"

通过标准:每行是一个合法 JSON 的引擎事件;默认(不带参数)仍为 text 输出;可被 jq / 脚本管道消费。

#48 体验:footer 状态栏增强

方式:CU。启动 TUI 截图 footer,逐项确认显示:模型名、工作区、上下文占用(#32)、审批模式状态(--yes / 交互)。信息源检查:数据由 bootstrap 装配注入,组件不各自打探。

#49 文档:TUI 使用手册与架构对照指南

方式:文档复核 + 抽查。

  • README 的 TUI 篇:按文档列的键位、slash 命令、审批交互逐项在 TUI 里 CU 实操一遍,文档与行为一致;
  • 「玩具 ↔ kimi-code」目录对照表:抽查 3–5 行,对照 D:/找工作/kimi-code 真实目录确认映射正确。

13. 总验收(#50)

#50 验收:第一周 dogfood——3 个真实小任务

方式:真实使用记录,全项目最终验收口。

  • 用本周落地的工具(#18 之后的形态)完成 ≥3 个真实小任务(非 demo 语料);
  • 每个任务记录:prompt、卡点、体感,链接到本 issue;
  • 3 条记录齐全 → #50 关闭 → 回看 #2 地图收图。

附:验收方式速查

方式 适用 issue
npm test / typecheck 为主 #14 #15 #16 #25 #31 #33 #34 #37 #40 #41 #42
CLI 命令实测 #1 #27 #29 #30 #35 #36 #38 #39 #45 #46
computer-use 交互截图 #12 #17 #18 #19 #20 #21 #22 #23 #24 #26 #28 #32 #47 #48 #49
产出物/文档复核 #2 #3 #4 #5–#13 #49
GitHub / 多平台实证 #43 #44
真实使用记录 #50