Files
cs-note/claude-code-best/docs/testing/SLASH-COMMANDS-TEST-CHECKLIST.md

249 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [testing, 斜杠命令, 测试清单, 验收]
create time: 2026-06-09 22:30
---
# 斜杠命令完整测试清单
## 概述
本测试清单覆盖所有恢复/新建命令(PR-1 ~ PR-4 + audit-fix + H2 refactor)的完整验收测试。按功能分组,从纯本地到需要外部依赖的命令。
> [!info]
> **日期**:2026-05-06
> **适用范围**:本 session 累积所有恢复/新建命令
> **起点 commit**:`origin/main` (4f1649e2)
> **最新 commit**:`fe99cf0e`(35+ commits ahead)
## 正文
### 测试前准备
```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
# dist mtime 必须 >= HEAD commit time
# 3. 完全退出当前 dev REPL(按 Ctrl+D 或 /quit)后重启
bun run dev
```
> [!warning]
> **关键提醒**:Bun 不会动态重载 dist,任何 source 改动都必须 `bun run build` + 重启 REPL。
### A 组 — 纯本地(无网络/无 key,立即可测)
**前置**:无
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| A1 | `/version` | 直接跑 | 显示版本号(如 `1.10.10`) | ☐ |
| A2 | `/env` | 直接跑 | runtime 信息 + env vars 白名单 + secrets masked | ☐ |
| A3 | `/context` | 直接跑 | fork 原生命令:colored grid + token 数与 API 看到的一致 | ☐ |
| A4 | `/context` 在压缩边界附近 | 直接跑 | 显示 compact boundary 后的 messages,不重复计 token | ☐ |
| A6 | `/debug-tool-call` | 默认 N=5 | 列最近 5 个 tool_use+tool_result 配对 | ☐ |
| A7 | `/debug-tool-call 10` | 数字参数 | 列最近 10 个 | ☐ |
| A8 | `/perf-issue` | 直接跑 | 写 `~/.claude/perf-reports/perf-<stamp>.md` | ☐ |
| 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,下次启动重跑 | ☐ |
| A22 | `/recap` | 直接跑 | 一行 <=40 字 session recap | ☐ |
| A23 | `/away` `/catchup` | aliases of recap | 同 A22 | ☐ |
| A24 | `/usage` | 直接跑 | 合并 cost + stats | ☐ |
| A25 | `/cost` `/stats` | aliases of usage | 同 A24 | ☐ |
| A26 | `/summary` | 直接跑 | 调 manuallyExtractSessionMemory + 显示 summary.md | ☐ |
**A 组失败诊断**:
- 命令找不到 -> 检查 dist staleness + 重启 REPL
- `feature() unsupported` -> `bun run build` 时 feature flag 没注入
### B 组 — GitHub CLI(需 `gh auth login`)
**前置**:`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 | ☐ |
| B5 | `/share --allow-public-fallback` | flag | gh 失败 -> 0x0.st fallback | ☐ |
| 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 组失败诊断**:
- `gh: command not found` -> 装 https://cli.github.com/
- `gh auth status` 未登录 -> `gh auth login`
- issues disabled -> 看是否降级到 discussion
### C 组 — Subscription OAuth(已 `/login` claude.ai)
**前置**:`/login` 完成 claude.ai OAuth;`/login` 显示 `☑ Subscription`
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| C1 | `/login` | 无参 | **3 plane summary**:☑ Subscription、☐/☑ Workspace API key、4 third-party providers | ☐ |
| 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 | ☐ |
| C8 | `/autofix-pr anthropics/claude-code#999` | cwd 不匹配 | 拒绝 `repo_mismatch` | ☐ |
| C9 | `/schedule list` | 子命令 | `/v1/code/triggers` GET,返回 trigger 列表 | ☐ |
| 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` | ☐ |
| C17 | `/ultrareview <PR#>` | 参数 | preflight gate | ☐ |
**C 组失败诊断**:
- 401 -> 重 `/login`
- `/v1/agents` 类 401 -> 这些是 workspace endpoint,**预期会失败**,移到 F 组
- `/schedule` 401 -> 检查 dist 含 `ccr-triggers-2026-01-30` beta header
### E 组 — 本地兜底(PR-3 新增,订阅用户无 key 也能用)
**前置**:无
#### E.1 `/local-vault`(OS keychain + AES fallback)
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| 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)` 类似格式 | ☐ |
| E5 | `/local-vault get test-key --reveal` | 明文 + 警告 | `foo-secret-value` + 警告 | ☐ |
| E6 | `/local-vault set bad-key C:hack` | path traversal | 拒绝 | ☐ |
| 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"
```
#### E.2 `/local-memory`(多 store 持久化)
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| 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 组失败诊断**:
- AES 错 passphrase -> 提示重新 setSecret
- keychain 不可用 -> 自动 fallback 文件(warn 一次)
- path traversal 接受 -> audit-fix-all-40 修复未生效,重新 build
### F 组 — Workspace API key(需配 `ANTHROPIC_API_KEY=sk-ant-api03-*`)
**前置**:
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`
| # | 命令 | 输入 | 期望输出 | 通过 |
|---|---|---|---|---|
| F1 | `/help`(配 key 后) | — | 4 命令 `/agents-platform` `/vault` `/memory-stores` `/skill-store` 出现 | ☐ |
| 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 | ☐ |
| F6 | `/vault add-credential <vault_id> api-key sk-secret` | 子命令 | onDone 显示 `[REDACTED]` | ☐ |
| F7 | `/memory-stores list` | 无参 | `/v1/memory_stores` GET | ☐ |
| 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) | ☐ |
| F13 | 不配 key 时调 `/vault list` | — | 501 + 文案 "ANTHROPIC_API_KEY required" | ☐ |
**F 组失败诊断**:
- 401 with workspace key -> key 没生效(重启 REPL + 检查 `echo $ANTHROPIC_API_KEY`)
- 命令仍 isHidden -> dist staleness(rebuild + 重启)
- credential value 出现在 stdout -> audit fix 未生效
### 全过验收标准
- [ ] A 组 26/26 pass
- [ ] B 组 >=8/10 pass(有 gh + 仓库权限的)
- [ ] C 组 >=10/17 pass(订阅环境完整)
- [ ] E 组 17/17 pass(path traversal 必须拒绝)
- [ ] F 组 >=10/13 pass(取决于 workspace key 是否配)
> [!warning]
> 任何 fail 立即报告:命令 + 实际输出 + 期望输出。
### 已知限制
| 命令 | 限制 |
|---|---|
| `/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(用户手动用) |
### 测试报告模板
```markdown
## 测试报告 - 2026-05-XX
### 环境
- OS: Windows 11
- Bun: <version>
- dist mtime: <date>
- HEAD: <commit-hash>
- ANTHROPIC_API_KEY: 配/未配
- gh CLI: 装/未装
### 结果
- A: 26/26 pass
- B: 8/10(B5/B8 fail)
- C: 12/17(C5/C13/C14/C15/C16 fail)
- E: 17/17 pass
- F: 12/13(F12 边界)
### 失败详情
B5: <command> -> 实际 <output>,期望 <expected>
...
```
## 关联笔记
- [[claude-code-best/docs/features/autofix-pr]]
- [[claude-code-best/docs/task/task-016-backward-compat-tests]]