--- 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-.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 ` | 多 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]]