insta-reviewlisted
Install: claude install-skill snowzhaozhj/claude-devtools-rs
# insta-review
claude-devtools-rs 用 `insta` crate 做快照测试(`cdt-analyze/tests/chunks.rs` 等)。本 skill 把"`INSTA_UPDATE=no` → 看 diff → `INSTA_UPDATE=always` → `git add`"两步流程标准化,并提供 diff 展示,避免盲接受回归。
## 输入
可选参数:目标 crate 名(kebab-case)。省略时默认 `cdt-analyze`(当前唯一使用 insta 的 crate;如未来新增需更新此默认值——用 `grep -rn "insta::" crates/*/tests` 探测)。
## 工作步骤
### 1. 确认 crate
如用户给了参数则用它;否则默认 `cdt-analyze`。用 `Grep` 确认该 crate 有 `insta::` 调用 + `tests/snapshots/` 目录存在;若缺任一则报 error 退出。
### 2. 跑测试产快照变更
```bash
INSTA_UPDATE=no cargo test -p <crate>
```
`INSTA_UPDATE=no` 是默认行为,但写出来更明确——有 snapshot 变更时此命令会**失败**(退出码非 0),同时在 `crates/<crate>/tests/snapshots/` 下生成 `*.snap.new`。失败本身是预期,不要把它当作"测试坏了"。
混杂真实测试失败(非快照相关)时:**停止**接受流程,把完整失败输出回传给用户排查。区分方法:失败 message 里有 `snapshot ... was not as expected` 才是快照变更;其他失败(panic / assert)走另一条排查路径。
### 3. 列出待接受项
```bash
git status -- crates/<crate>/tests/snapshots/
```
或:
```bash
find crates/<crate>/tests/snapshots -name "*.snap.new"
```
无 `.snap.new` → 报告"快照已是最新"并退出。
### 4. 逐一展示 diff
对每个 `<name>.snap.new`:
- 读对应 `<name>.snap`(旧)与 `<name>.snap.new`(新)
- 输出 unified diff 到聊天,用 ```` ```diff ```` 代码块包起来
- 每个 diff 前注明对应的测试名 + 文件路径(行号区间)
### 5. 等用户决策
用户说"接受 / 全部接受 / OK":
```bash
INSTA_UPDATE=always cargo test -p <crate>
git add crates/<crate>/tests/snapshots/
```
`INSTA_UPDATE=always` 会覆盖 `.snap` 并删除 `.snap.new`。
用户说"拒绝 / 全部拒绝 / 回滚":
```bash
find crates/<crate>/tests/snapshots/ -name "*.snap.new" -delete
```
用户说"部分接受":本 skill 不代跑交互——告知用户安装 `cargo-insta`(`cargo install c