# 斜杠命令完整测试清单 **日期**:2026-05-06 **适用范围**:本 session 累积所有恢复/新建命令(PR-1 ~ PR-4 + audit-fix + H2 refactor) **起点 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 ``` **关键提醒**:Bun 不会动态重载 dist,任何 source 改动都必须 `bun run build` + 重启 REPL。 --- ## A 组 — 纯本地(无网络/无 key,立即可测) **前置**:无 | # | 命令 | 输入 | 期望输出 | 通过 | |---|---|---|---|---| | A1 | `/version` | 直接跑 | 显示版本号(如 `1.10.10`) | ☐ | | A2 | `/env` | 直接跑 | runtime 信息 + env vars 白名单(CLAUDE_/FEATURE_/ANTHROPIC_/BUN_/NODE_/...)+ secrets masked | ☐ | | A3 | `/context` | 直接跑 | fork 原生命令:colored grid(走 `analyzeContextUsage()` 真实 API view,含 compact boundary + projectView 转换)+ token 数与 API 看到的一致 | ☐ | | A4 | `/context` 在压缩边界附近 | 直接跑 | 显示 compact boundary 后的 messages,不重复计 token | ☐ | | A5 | _(删 ctx_viz;`/context` 是唯一 context 可视化命令)_ | — | — | — | | 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`(mem+cpu+token+per-tool) | ☐ | | 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(Settings/Usage 或 Stats panel) | ☐ | | 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(PR-4 新增) | ☐ | | 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,返回 `data:[]` 或 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(v1 已有) | ☐ | **C 组失败诊断**: - 401 → 重 `/login` - `/v1/agents` 类 401 → 这些是 workspace endpoint,**预期会失败**,移到 F 组 - `/schedule` 401 → 检查 dist 含 `ccr-triggers-2026-01-30` beta header --- ## D 组 — _(已删除 2026-05-06)_ `/providers` 命令在 2026-05-06 移除。理由:与 fork 原生 `/login` 的 "Anthropic Compatible Setup" form 功能重叠(同样配 OpenAI-compat Base URL + API Key),保留单一入口避免双 UI 混淆。 **第三方 provider 配置请用** `/login` 内的 form:选 provider 后填 Base URL + API Key + Haiku/Sonnet/Opus 类别按钮。 `src/services/providerRegistry/*` utility 模块 **保留**(4 内置 cerebras/groq/qwen/deepseek 元数据 + DeepSeek 三模式 compatMatrix),可被未来 fork form 的 "Quick Select" enhancement 复用。 --- ## 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` + 警告 "secret revealed in terminal" | ☐ | | E6 | `/local-vault set bad-key C:hack` | path traversal | 拒绝(CRITICAL E1 修复) | ☐ | | 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` 出现(之前 isHidden:true) | ☐ | | 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]`,stdout grep 不到 `sk-secret` | ☐ | | F7 | `/memory-stores list` | 无参 | `/v1/memory_stores` GET,beta `managed-agents-2026-04-01` | ☐ | | 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`(手动 `/help` 找不到,但直接输入命令名) | — | 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(订阅环境完整) - [ ] D 组 8/8 pass - [ ] E 组 17/17 pass(path traversal 必须拒绝) - [ ] F 组 ≥10/13 pass(取决于 workspace key 是否配) 任何 fail 立即报告:命令 + 实际输出 + 期望输出。我针对 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(用户手动用) | | `/providers use <id>` | 输出 shell export 命令,**不**自动 mutate runtime(重启生效) | --- ## 测试报告模板 ```markdown ## 测试报告 - 2026-05-XX ### 环境 - OS: Windows 11 - Bun: <version> - dist mtime: <date> - HEAD: <commit-hash> - ANTHROPIC_API_KEY: 配/未配 - gh CLI: 装/未装 ### 结果 - A: 26/26 ✅ - B: 8/10(B5/B8 fail) - C: 12/17(C5/C13/C14/C15/C16 fail) - D: 8/8 ✅ - E: 17/17 ✅ - F: 12/13(F12 边界) ### 失败详情 B5: <command> → 实际 <output>,期望 <expected> ... ```