Files

249 lines
12 KiB
Markdown
Raw Permalink Normal View History

2026-06-09 23:15:17 +08:00
---
tags: [testing, 斜杠命令, 测试清单, 验收]
create time: 2026-06-09 22:30
---
2026-06-09 22:02:47 +08:00
# 斜杠命令完整测试清单
2026-06-09 23:15:17 +08:00
## 概述
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
本测试清单覆盖所有恢复/新建命令(PR-1 ~ PR-4 + audit-fix + H2 refactor)的完整验收测试。按功能分组,从纯本地到需要外部依赖的命令。
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
> [!info]
> **日期**:2026-05-06
> **适用范围**:本 session 累积所有恢复/新建命令
> **起点 commit**:`origin/main` (4f1649e2)
> **最新 commit**:`fe99cf0e`(35+ commits ahead)
## 正文
### 测试前准备
2026-06-09 22:02:47 +08:00
```bash
cd E:/Source_code/Claude-code-bast-autofix-pr
# 1. 确保最新 dist 含全部 commits
bun run build
# 2. 验证 dist 不是 stale
stat -c '%Y %n' dist/cli.js
git log -1 --format=%ct\ %h
2026-06-09 23:15:17 +08:00
# dist mtime 必须 >= HEAD commit time
2026-06-09 22:02:47 +08:00
# 3. 完全退出当前 dev REPL(按 Ctrl+D 或 /quit)后重启
bun run dev
```
2026-06-09 23:15:17 +08:00
> [!warning]
> **关键提醒**:Bun 不会动态重载 dist,任何 source 改动都必须 `bun run build` + 重启 REPL。
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### A 组 — 纯本地(无网络/无 key,立即可测)
2026-06-09 22:02:47 +08:00
**前置**:无
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| A1 | `/version` | 直接跑 | 显示版本号(如 `1.10.10`) | ☐ |
2026-06-09 23:15:17 +08:00
| A2 | `/env` | 直接跑 | runtime 信息 + env vars 白名单 + secrets masked | ☐ |
| A3 | `/context` | 直接跑 | fork 原生命令:colored grid + token 数与 API 看到的一致 | ☐ |
2026-06-09 22:02:47 +08:00
| A4 | `/context` 在压缩边界附近 | 直接跑 | 显示 compact boundary 后的 messages,不重复计 token | ☐ |
| A6 | `/debug-tool-call` | 默认 N=5 | 列最近 5 个 tool_use+tool_result 配对 | ☐ |
| A7 | `/debug-tool-call 10` | 数字参数 | 列最近 10 个 | ☐ |
2026-06-09 23:15:17 +08:00
| A8 | `/perf-issue` | 直接跑 | 写 `~/.claude/perf-reports/perf-<stamp>.md` | ☐ |
2026-06-09 22:02:47 +08:00
| A9 | `/perf-issue --format=json` | flag | 写 .json 格式 | ☐ |
| A10 | `/perf-issue --limit 1000` | flag | 仅读 log 最后 1000 行 | ☐ |
| A11 | `/break-cache` | 默认 once | 写 `~/.claude/.next-request-no-cache` marker | ☐ |
| A12 | `/break-cache status` | 子命令 | 显示 marker 状态 + 累计 break 次数 | ☐ |
| A13 | `/break-cache always` | 子命令 | 写 always flag 文件 | ☐ |
| A14 | `/break-cache off` | 子命令 | 删 once + always | ☐ |
| A15 | `/tui` | toggle | 切换 marker `~/.claude/.tui-mode` | ☐ |
| A16 | `/tui status` | 子命令 | 显示当前 marker + env var 状态 | ☐ |
| A17 | `/tui on` `/tui off` | 子命令 | marker write/unlink | ☐ |
| A18 | `/onboarding status` | 子命令 | 显示 hasCompletedOnboarding / theme / lastVersion | ☐ |
| A19 | `/onboarding theme` | 子命令 | 进入 ThemePicker | ☐ |
| A20 | `/onboarding trust` | 子命令 | 清 trust dialog flag | ☐ |
| A21 | `/onboarding reset` | 子命令 | 清 hasCompletedOnboarding,下次启动重跑 | ☐ |
2026-06-09 23:15:17 +08:00
| A22 | `/recap` | 直接跑 | 一行 <=40 字 session recap | ☐ |
2026-06-09 22:02:47 +08:00
| A23 | `/away` `/catchup` | aliases of recap | 同 A22 | ☐ |
2026-06-09 23:15:17 +08:00
| A24 | `/usage` | 直接跑 | 合并 cost + stats | ☐ |
2026-06-09 22:02:47 +08:00
| A25 | `/cost` `/stats` | aliases of usage | 同 A24 | ☐ |
| A26 | `/summary` | 直接跑 | 调 manuallyExtractSessionMemory + 显示 summary.md | ☐ |
**A 组失败诊断**:
2026-06-09 23:15:17 +08:00
- 命令找不到 -> 检查 dist staleness + 重启 REPL
- `feature() unsupported` -> `bun run build` 时 feature flag 没注入
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### B 组 — GitHub CLI(需 `gh auth login`)
2026-06-09 22:02:47 +08:00
**前置**:`gh auth status` 显示 logged-in;fork 仓库要有 issues enabled
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| B1 | `/share` | 默认 secret gist | 调 `gh gist create`,输出 gist URL | ☐ |
| B2 | `/share --public` | flag | public gist | ☐ |
| B3 | `/share --mask-secrets` | flag | redact `sk-ant-*` `Bearer *` `ghp_*` 等模式 | ☐ |
| B4 | `/share --summary-only` | flag | 仅前 200 字/turn | ☐ |
2026-06-09 23:15:17 +08:00
| B5 | `/share --allow-public-fallback` | flag | gh 失败 -> 0x0.st fallback | ☐ |
2026-06-09 22:02:47 +08:00
| B6 | `/issue Fix login bug` | title 参数 | 调 `gh issue create`,rich body 含最近 5 turns + errors | ☐ |
| B7 | `/issue --label bug --assignee me <title>` | 多 flag | label + assignee 生效 | ☐ |
| B8 | `/issue` (仓库 issues disabled)| — | 自动降级到 GitHub Discussions | ☐ |
| B9 | `/commit` | 直接跑(有 staged) | 生成 commit message 草稿 | ☐ |
| B10 | `/commit-push-pr` | 直接跑 | commit + push + 创建 PR | ☐ |
**B 组失败诊断**:
2026-06-09 23:15:17 +08:00
- `gh: command not found` -> 装 https://cli.github.com/
- `gh auth status` 未登录 -> `gh auth login`
- issues disabled -> 看是否降级到 discussion
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### C 组 — Subscription OAuth(已 `/login` claude.ai)
2026-06-09 22:02:47 +08:00
**前置**:`/login` 完成 claude.ai OAuth;`/login` 显示 `☑ Subscription`
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
2026-06-09 23:15:17 +08:00
| C1 | `/login` | 无参 | **3 plane summary**:☑ Subscription、☐/☑ Workspace API key、4 third-party providers | ☐ |
2026-06-09 22:02:47 +08:00
| C2 | `/teleport` | 无参 | 列最近 sessions(list-style picker) | ☐ |
| C3 | `/teleport <session-uuid>` | 参数 | resume from claude.ai | ☐ |
| C4 | `/tp <session-uuid>` | alias | 同 C3 | ☐ |
| C5 | `/teleport <session-uuid> --print` | flag | print mode 直接输出 session URL | ☐ |
| C6 | `/autofix-pr 386` | PR# | CCR 派发,输出 sessionUrl | ☐ |
| C7 | `/autofix-pr stop` | 子命令 | 停止 active monitor | ☐ |
2026-06-09 23:15:17 +08:00
| C8 | `/autofix-pr anthropics/claude-code#999` | cwd 不匹配 | 拒绝 `repo_mismatch` | ☐ |
| C9 | `/schedule list` | 子命令 | `/v1/code/triggers` GET,返回 trigger 列表 | ☐ |
2026-06-09 22:02:47 +08:00
| C10 | `/schedule create <cron> <prompt>` | 子命令 | POST,cron expr UTC 验证 | ☐ |
| C11 | `/schedule run <id>` | 子命令 | POST /run 立即触发 | ☐ |
| C12 | `/schedule update <id> <field> <value>` | 子命令 | **POST**(不是 PATCH) | ☐ |
| C13 | `/cron list` `/triggers list` | aliases | 同 C9 | ☐ |
| C14 | `/init-verifiers` | 无参 | 创建项目 verifier skills | ☐ |
| C15 | `/bridge-kick` | 无参 | bridge 故障注入测试 | ☐ |
| C16 | `/subscribe-pr` | 无参 | 列本地 `~/.claude/pr-subscriptions.json` | ☐ |
2026-06-09 23:15:17 +08:00
| C17 | `/ultrareview <PR#>` | 参数 | preflight gate | ☐ |
2026-06-09 22:02:47 +08:00
**C 组失败诊断**:
2026-06-09 23:15:17 +08:00
- 401 -> 重 `/login`
- `/v1/agents` 类 401 -> 这些是 workspace endpoint,**预期会失败**,移到 F 组
- `/schedule` 401 -> 检查 dist 含 `ccr-triggers-2026-01-30` beta header
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### E 组 — 本地兜底(PR-3 新增,订阅用户无 key 也能用)
2026-06-09 22:02:47 +08:00
**前置**:无
2026-06-09 23:15:17 +08:00
#### E.1 `/local-vault`(OS keychain + AES fallback)
2026-06-09 22:02:47 +08:00
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| E1 | `/local-vault list` | 无参 | 空列表(首次) | ☐ |
| E2 | `/local-vault set test-key foo-secret-value` | 写 secret | onDone 显示 `[REDACTED]`,**不**显示原值 | ☐ |
| E3 | `/local-vault list` | 再跑 | 显示 `test-key`(不含 value) | ☐ |
| E4 | `/local-vault get test-key` | 默认 mask | `foo-...e (16 chars)` 类似格式 | ☐ |
2026-06-09 23:15:17 +08:00
| E5 | `/local-vault get test-key --reveal` | 明文 + 警告 | `foo-secret-value` + 警告 | ☐ |
| E6 | `/local-vault set bad-key C:hack` | path traversal | 拒绝 | ☐ |
2026-06-09 22:02:47 +08:00
| E7 | `/local-vault set ../traverse foo` | path traversal | 拒绝 | ☐ |
| E8 | `/local-vault delete test-key` | 删 | OK | ☐ |
| E9 | `/lv list` | alias | 同 E1 | ☐ |
**安全验证**:
```bash
# E1 加密文件存在 + value 不明文
ls ~/.claude/local-vault.enc.json
cat ~/.claude/local-vault.enc.json | grep -c "foo-secret-value" # 必须是 0
# salt 16 字节存在
cat ~/.claude/local-vault.enc.json | grep "_salt"
```
2026-06-09 23:15:17 +08:00
#### E.2 `/local-memory`(多 store 持久化)
2026-06-09 22:02:47 +08:00
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| E10 | `/local-memory list` | 无参 | 空 | ☐ |
| E11 | `/local-memory create my-store` | 创建 | `~/.claude/local-memory/my-store/` 建好 | ☐ |
| E12 | `/local-memory store my-store key1 value1` | 写 entry | OK | ☐ |
| E13 | `/local-memory fetch my-store key1` | 读 | `value1` | ☐ |
| E14 | `/local-memory entries my-store` | 列 | `[key1]` | ☐ |
| E15 | `/local-memory store my-store ../escape foo` | path traversal | 拒绝 | ☐ |
| E16 | `/local-memory archive my-store` | 改名 | dir 改为 `my-store.archived` | ☐ |
| E17 | `/lm list` | alias | 同 E10 | ☐ |
**E 组失败诊断**:
2026-06-09 23:15:17 +08:00
- AES 错 passphrase -> 提示重新 setSecret
- keychain 不可用 -> 自动 fallback 文件(warn 一次)
- path traversal 接受 -> audit-fix-all-40 修复未生效,重新 build
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### F 组 — Workspace API key(需配 `ANTHROPIC_API_KEY=sk-ant-api03-*`)
2026-06-09 22:02:47 +08:00
**前置**:
1. 从 https://console.anthropic.com/settings/keys 创建 API key(`sk-ant-api03-*`)
2. Windows: `setx ANTHROPIC_API_KEY "sk-ant-api03-..."` 持久化
3. **完全退出 dev REPL**(Ctrl+D / `/quit`) + 启动新 shell(让 setx 生效)+ `bun run dev`
4. 验证:`/login` 应显示 `☑ Workspace API key ANTHROPIC_API_KEY set`
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
2026-06-09 23:15:17 +08:00
| F1 | `/help`(配 key 后) | — | 4 命令 `/agents-platform` `/vault` `/memory-stores` `/skill-store` 出现 | ☐ |
2026-06-09 22:02:47 +08:00
| F2 | `/help`(不配 key) | — | 4 命令**不**出现(动态 isHidden) | ☐ |
| F3 | `/agents-platform list` | 无参 | `/v1/agents` GET 200,返回 agents 数组 | ☐ |
| F4 | `/vault list` | 无参 | `/v1/vaults` GET 200 | ☐ |
| F5 | `/vault create test-vault` | 子命令 | 创建 vault | ☐ |
2026-06-09 23:15:17 +08:00
| F6 | `/vault add-credential <vault_id> api-key sk-secret` | 子命令 | onDone 显示 `[REDACTED]` | ☐ |
| F7 | `/memory-stores list` | 无参 | `/v1/memory_stores` GET | ☐ |
2026-06-09 22:02:47 +08:00
| F8 | `/memory-stores create test-store` | 子命令 | POST | ☐ |
| F9 | `/memory-stores update-memory <id> <mid> "new"` | 子命令 | **PATCH**(不是 POST) | ☐ |
| F10 | `/skill-store list` | 无参 | `/v1/skills?beta=true` GET | ☐ |
| F11 | `/skill-store install <id>` | 子命令 | 写 `~/.claude/skills/<name>/SKILL.md` | ☐ |
| F12 | 错配(API key 不是 `sk-ant-api03-*` 前缀) | 配错 key | 友好错(不 401) | ☐ |
2026-06-09 23:15:17 +08:00
| F13 | 不配 key 时调 `/vault list` | — | 501 + 文案 "ANTHROPIC_API_KEY required" | ☐ |
2026-06-09 22:02:47 +08:00
**F 组失败诊断**:
2026-06-09 23:15:17 +08:00
- 401 with workspace key -> key 没生效(重启 REPL + 检查 `echo $ANTHROPIC_API_KEY`)
- 命令仍 isHidden -> dist staleness(rebuild + 重启)
- credential value 出现在 stdout -> audit fix 未生效
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### 全过验收标准
2026-06-09 22:02:47 +08:00
- [ ] A 组 26/26 pass
2026-06-09 23:15:17 +08:00
- [ ] B 组 >=8/10 pass(有 gh + 仓库权限的)
- [ ] C 组 >=10/17 pass(订阅环境完整)
2026-06-09 22:02:47 +08:00
- [ ] E 组 17/17 pass(path traversal 必须拒绝)
2026-06-09 23:15:17 +08:00
- [ ] F 组 >=10/13 pass(取决于 workspace key 是否配)
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
> [!warning]
> 任何 fail 立即报告:命令 + 实际输出 + 期望输出。
2026-06-09 22:02:47 +08:00
2026-06-09 23:15:17 +08:00
### 已知限制
2026-06-09 22:02:47 +08:00
| 命令 | 限制 |
|---|---|
| `/teleport` 无参 picker | 用 list-style 不是 Ink `<SelectInput>`(LocalJSXCommandCall 不能 mid-call suspend) |
| `/autofix-pr` cross-repo | 仅元数据,git source 仍来自 cwd(`repo_mismatch` 显式拒绝跨 cwd) |
| `/skill-store install` | 写到 `~/.claude/skills/`,fork 主流程不自动 load 该目录的 markdown skills(用户手动用) |
2026-06-09 23:15:17 +08:00
### 测试报告模板
2026-06-09 22:02:47 +08:00
```markdown
## 测试报告 - 2026-05-XX
### 环境
- OS: Windows 11
- Bun: <version>
- dist mtime: <date>
- HEAD: <commit-hash>
- ANTHROPIC_API_KEY: 配/未配
- gh CLI: 装/未装
### 结果
2026-06-09 23:15:17 +08:00
- A: 26/26 pass
2026-06-09 22:02:47 +08:00
- B: 8/10(B5/B8 fail)
- C: 12/17(C5/C13/C14/C15/C16 fail)
2026-06-09 23:15:17 +08:00
- E: 17/17 pass
2026-06-09 22:02:47 +08:00
- F: 12/13(F12 边界)
### 失败详情
2026-06-09 23:15:17 +08:00
B5: <command> -> 实际 <output>,期望 <expected>
2026-06-09 22:02:47 +08:00
...
```
2026-06-09 23:15:17 +08:00
## 关联笔记
- [[claude-code-best/docs/features/autofix-pr]]
- [[claude-code-best/docs/task/task-016-backward-compat-tests]]