Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c8547ed

Browse filesBrowse files
authored
feat: add background bash tasks and notification infrastructure (MoonshotAI#1477)
1 parent 7ba9695 commit c8547ed
Copy full SHA for c8547ed

82 files changed

+6,534-63Lines changed: 6534 additions & 63 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree
Open diff view settings
Collapse file
+185Lines changed: 185 additions & 0 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
---
2+
name: feature-smoke-test
3+
description: 针对 Kimi Code CLI 的新增或变更功能,规划并执行可重复的端到端冒烟测试。从 git diff 推断功能边界,读取相关文档和代码,设计测试 prompt,以 --print 非交互模式运行本地 CLI,检查进程退出码和 session 产物,总结预期与实际行为之间的差异。发现问题时自动启动多路并行探查以定位根因。
4+
---
5+
6+
冒烟测试是运行时验证,不是写完 prompt 或读完代码就结束。必须实际执行、实际检查产物。
7+
8+
## 确定测试范围
9+
10+
动手之前,先从代码变更推断功能边界:
11+
12+
```sh
13+
git diff main --name-only
14+
git diff main --stat
15+
```
16+
17+
根据变更文件集合,明确写下:
18+
19+
- 被测的功能边界
20+
- 用户可感知的行为变化
21+
- 运行前的准备工作和运行后的清理工作
22+
- 能够证明成功或失败的证据
23+
24+
如果功能涉及状态、异步、审批流或时序敏感逻辑,默认认为单条 prompt 不够。
25+
26+
## 先读事实来源
27+
28+
读取定义该功能真实行为的最小文件集合:
29+
30+
- 面向用户的文档、changelog 或设计笔记
31+
- 暴露该功能的 agent prompt 或 tool prompt
32+
- 实现层入口
33+
- 已有测试——当测试比文档更准确地描述行为时优先看测试
34+
35+
不要信任过时的 prompt 示例。先从代码或当前文档重建真实的工具接口。
36+
37+
## 制定最小测试计划
38+
39+
默认覆盖三个场景:
40+
41+
1. 正常路径
42+
2. 边界条件、非法输入或容量极限
43+
3. 中断、重试、清理或恢复
44+
45+
每个场景记录:
46+
47+
- `目标`
48+
- `前置准备`
49+
- `prompt 策略`
50+
- `成功信号`
51+
- `失败信号`
52+
- `需要检查的产物`
53+
54+
如果功能存在竞态条件,必须显式标注时序。用长时间运行的命令或刻意的等待来制造时序窗口,不要用"快速再跑一个"这种模糊说法。
55+
56+
## 优先使用多轮 prompt
57+
58+
默认采用多轮流程:
59+
60+
1. 探索轮:让 agent 在阅读事实来源后复述当前真实接口
61+
2. 执行轮:只执行一个场景
62+
3. 观察轮:只读取输出、工具状态和产物文件,不扩大范围
63+
4. 清理轮:停止、回滚或关闭有状态资源
64+
65+
仅对无状态的简单功能使用单轮 prompt。
66+
67+
多轮测试时,每一轮单独调用 CLI,在两轮之间检查上一轮的输出和产物,再决定下一轮的 prompt。不要把多轮 prompt 一次性塞进 stdin——那是盲写,无法根据上一轮结果调整。
68+
69+
测试时,显式要求 agent 先列举当前可用的工具,不要臆造历史工具名。可复用的 prompt 模板见 `references/prompt-patterns.md`
70+
71+
## 以非交互模式隔离运行 CLI
72+
73+
使用 `/tmp` 下的一次性目录作为 `--work-dir`,实现 session 隔离。CLI 的 session 路径由 `~/.kimi/sessions/<md5(work_dir)>/` 决定,不同的 work-dir 自动产生独立的 session 命名空间,不会污染正常项目的 session。认证状态保留在 `~/.kimi` 下,无需额外配置。
74+
75+
### 环境准备
76+
77+
```sh
78+
SMOKE_DIR="$(mktemp -d /tmp/kimi-smoke-XXXXXX)"
79+
```
80+
81+
如果功能需要仓库上下文(读取代码、git 信息等),把仓库文件复制或软链到 `SMOKE_DIR`。如果功能会编辑文件,绝不要用活跃仓库作为 work-dir。
82+
83+
### 默认执行方式
84+
85+
绝大多数场景使用这个模式:
86+
87+
```sh
88+
uv run python -m kimi_cli.cli \
89+
--print \
90+
--prompt "你的测试 prompt" \
91+
--work-dir "$SMOKE_DIR"
92+
echo "exit_code=$?"
93+
```
94+
95+
`--print` 会自动启用 `--yolo`(自动批准所有操作),适合无人值守的冒烟测试。
96+
97+
执行后**必须先检查退出码**:非零表示 CLI 本身崩溃或超时,应优先排查进程级错误,再看 session 产物。
98+
99+
### 备选执行模式
100+
101+
当默认方式不满足需求时,按需选用:
102+
103+
- **长 prompt**:通过 stdin 传入——`cat <<'PROMPT' | uv run python -m kimi_cli.cli --print --input-format text --work-dir "$SMOKE_DIR"`
104+
- **结构化输出**:加 `--output-format stream-json`,输出逐行 JSON,便于程序化解析
105+
- **只看最终结果**:用 `--quiet`,等价于 `--print --output-format text --final-message-only`
106+
107+
### 注意事项
108+
109+
- 运行过程中记录这些路径:`SMOKE_DIR`、最终 session 目录(可通过 `inspect_session.py` 定位)、功能特定的输出文件。
110+
111+
## 刻意执行
112+
113+
执行过程中维护一份简短的运行日志:
114+
115+
- 使用的完整 prompt
116+
- 关键的工具调用或命令
117+
- 功能产生的 task id、输出路径或审批 id
118+
- 时序敏感时记录时间戳
119+
120+
不要仅凭 assistant 的最终文本推断正确性。运行时文件和工具结果才是事实来源。
121+
122+
## 检查 session 产物
123+
124+
首先检查:
125+
126+
- `~/.kimi/sessions/.../context.jsonl`
127+
- `~/.kimi/sessions/.../wire.jsonl`
128+
- 功能创建的 session 级文件
129+
130+
使用 `scripts/inspect_session.py` 查找并汇总最新 session:
131+
132+
```sh
133+
uv run python .agents/skills/feature-smoke-test/scripts/inspect_session.py --share-dir ~/.kimi
134+
```
135+
136+
脚本退出码含义:0 = 正常汇总,1 = session 目录缺失或无法解析。
137+
138+
如果功能会创建后台任务、通知或附属文件,直接检查这些文件,不要只依赖模型摘要。
139+
140+
## 汇报结论
141+
142+
将结果分为三类:
143+
144+
- **已确认**的行为
145+
- **与预期不符**的行为
146+
- **仍有歧义**、需要更确定性复现的行为
147+
148+
对于每个 bug 或回归,记录:
149+
150+
- 触发它的 prompt
151+
- 精确的 session 路径
152+
- 证明它的产物路径
153+
- 能推导出的最小复现步骤
154+
155+
## 问题探查
156+
157+
当发现与预期不符的行为时,不要停在报告层面。启动并行探查流程定位根因:
158+
159+
### 探查策略
160+
161+
针对每个发现的问题,**同时启动多个独立的探查方向**(使用 Agent 工具并行执行)。根据问题的具体表现自行判断最有价值的探查角度,常见方向包括但不限于:
162+
163+
- 从触发问题的入口沿调用链追踪实际执行路径
164+
- 检查输入数据经过各处理阶段后的变化
165+
- 检查持久化状态(session 文件、后台任务、通知记录等)是否一致
166+
- 运行相关单元测试和集成测试,确认测试是否覆盖了出问题的路径
167+
168+
不必机械地覆盖所有方向。根据 session 产物中的具体异常信号,选择最可能命中根因的 2-3 个方向并行展开。
169+
170+
### 探查输出
171+
172+
每条探查方向独立汇报:
173+
174+
- 探查的具体方向和范围
175+
- 发现的事实(附文件路径和行号)
176+
- 该方向的结论:已定位根因 / 已排除 / 需要进一步调查
177+
178+
### 综合定位
179+
180+
汇总所有探查结果后,输出:
181+
182+
- **根因**:一句话总结问题的本质原因
183+
- **证据链**:从触发 prompt → 代码路径 → 出错点 → 产物表现的完整链路
184+
- **修复建议**:最小改动方案,附具体文件和行号
185+
- **回归风险**:修复后需要额外验证的相关功能
Collapse file
+85Lines changed: 85 additions & 0 deletions
  • Display the source diff
  • Display the rich diff
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Prompt 模板
2+
3+
以下模板作为脚手架使用。运行前替换占位符。
4+
5+
## 单轮还是多轮
6+
7+
满足以下任一条件时使用多轮:
8+
9+
- 功能有状态
10+
- 功能依赖时序或并发
11+
- 功能需要审批、清理或恢复
12+
- session 产物本身是证据的一部分
13+
- 工具接口可能近期发生过变化
14+
15+
仅对无状态的窄范围检查使用单轮。
16+
17+
## 变量
18+
19+
起草 prompt 前填写以下字段:
20+
21+
- `<feature>` — 被测功能名称
22+
- `<goal>` — 当前场景的目标
23+
- `<source_paths>` — 需要阅读的源码路径
24+
- `<constraints>` — 执行约束
25+
- `<success_signals>` — 成功信号
26+
- `<failure_signals>` — 失败信号
27+
- `<artifact_paths>` — 需要检查的产物路径
28+
- `<session_dir>` — session 目录路径
29+
30+
## 探索 prompt
31+
32+
```text
33+
我要验证 <feature>。
34+
35+
先阅读这些文件并只总结当前真实对外接口,不要假设旧文档、旧 prompt 或旧 tool 名称仍然正确:
36+
<source_paths>
37+
38+
然后给我一个最小 smoke test 计划,只包含:
39+
1. happy path
40+
2. 一个边界/异常场景
41+
3. 一个清理、恢复或中断场景
42+
43+
每个场景都写清楚目标、预期信号和要检查的产物。
44+
```
45+
46+
## 执行 prompt
47+
48+
```text
49+
在当前 session 里只执行这个场景:<goal>
50+
51+
约束:
52+
<constraints>
53+
54+
执行前先复述你将使用的工具或命令。执行时记录关键 task id、输出片段、文件路径和任何需要后续复盘的标识符。不要扩展到其他场景。
55+
```
56+
57+
## 观察 prompt
58+
59+
```text
60+
现在不要继续跑新的测试。
61+
62+
只读取并总结这次运行已经产生的状态和文件:
63+
<artifact_paths>
64+
65+
请明确指出哪些证据支持了预期,哪些证据反驳了预期,哪些地方仍然不确定。
66+
```
67+
68+
## 复盘 prompt
69+
70+
```text
71+
请根据这个 session 目录复盘整个 smoke test:
72+
<session_dir>
73+
74+
重点阅读 context.jsonl、wire.jsonl 和相关运行产物。输出:
75+
1. 实际执行流程
76+
2. 关键 tool 调用与结果
77+
3. 与预期不一致的点
78+
4. 最小复现步骤
79+
```
80+
81+
## 兼容性校验 prompt
82+
83+
```text
84+
在运行 smoke test 之前,先从提供的文档或代码中复述当前真实可用的工具及其准确名称。不要臆造旧版工具名。如果任务涉及状态或时序,将工作拆分为多轮而非一次性长回复。
85+
```

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.