Files
claude-code/docs/features/ultrareview-system-analysis.md
unraid 95fece4b51 feat: 整合功能恢复与技能学习闭环(含 ECC v2.1 parity + Opus 4.7 接入 + prompt 工程优化)
主要变更:
- Skill Learning 闭环系统 (9/9 AC)
- Opus 4.7 模型层接入 + adaptive thinking
- Prompt 工程优化 (64 审计测试)
- Agent Teams 简化门控 (默认启用)
- Windows Terminal 后端修复 (EncodedCommand/WT_SESSION)
- TF-IDF 技能搜索精准化 (字段加权/CJK 优化)
- Autonomy 系统 (/autonomy 命令)
- ACP 协议完整实现
- mock.module 泄漏修复 (CI 全绿)
- 152+ lint/type 修复
2026-04-22 16:07:42 +08:00

704 lines
28 KiB
Markdown
Raw 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.
# Ultra Review 系统完整分析
## 1. 概述
Ultra Review内部代号 `tengu_review`)是 Claude Code 的**云端代码审查**功能。用户通过 `/ultrareview` 斜杠命令发起系统将当前仓库PR 或 branch diff传送到 CCRClaude Code on the web远程环境在云端运行 "bughunter" 编排器(一个多 agent 舰队)来查找、验证和去重 bug最终将审查结果通过 task-notification 管道注入回本地会话。
整个过程约 1020 分钟,完全在云端异步执行,本地 CLI 通过轮询获取进度和结果。
---
## 2. 文件清单
### 2.1 核心文件8 个)
| 文件路径 | 行数 | 职责 |
|----------|------|------|
| `src/commands/review.ts` | 57 | 入口文件,注册 `/review`(本地)和 `/ultrareview`(云端)两个 Command |
| `src/commands/review/ultrareviewEnabled.ts` | 14 | GrowthBook 运行时门控函数 |
| `src/commands/review/ultrareviewCommand.tsx` | 74 | `/ultrareview` 命令的 `call` 处理器,管理计费门控和对话框流程 |
| `src/commands/review/reviewRemote.ts` | 320 | 核心引擎:计费检查 + PR/Branch 两种模式的远程会话创建 |
| `src/commands/review/UltrareviewOverageDialog.tsx` | 56 | Ink 超额计费确认对话框组件 |
| `src/services/api/ultrareviewQuota.ts` | 38 | 配额查询 API 客户端(`/v1/ultrareview/quota` |
| `src/utils/ultraplan/keyword.ts` (101112 行) | 12 | 输入框 rainbow 关键词检测(复用 ultraplan 的关键词框架) |
| `src/components/tasks/RemoteSessionProgress.tsx` | 183 | 远程审查会话的进度展示组件(◇/◆ + rainbow text + 计数) |
### 2.2 深度关联文件
| 文件路径 | 与 Ultra Review 的关系 |
|----------|----------------------|
| `src/tasks/RemoteAgentTask/RemoteAgentTask.tsx` | 远程任务框架:任务注册、轮询引擎、日志解析、进度提取、通知生发 |
| `src/components/tasks/RemoteSessionDetailDialog.tsx` | 远程会话详情对话框(含 "Stop ultrareview" 交互) |
| `src/utils/teleport.tsx` | `teleportToRemote()` — 将仓库传送到 CCR 环境的传输层 |
| `src/services/api/usage.ts` | `fetchUtilization()` — Extra Usage 余额查询 |
| `src/components/PromptInput/PromptInput.tsx` | 输入框中 "ultrareview" 关键词的 rainbow 高亮和提示通知 |
| `src/constants/figures.ts` (2629) | 状态图标:◇ DIAMOND_OPEN运行中、◆ DIAMOND_FILLED已完成/失败) |
| `src/constants/xml.ts` (4449) | XML 标签常量:`remote-review``remote-review-progress` |
| `src/commands.ts` (41, 352) | 命令注册表:导入并注册 `ultrareview` 命令 |
| `src/commands/bughunter/index.js` | **Stub**`/bughunter` 本地命令(`isEnabled: () => false` |
---
## 3. 架构详解
### 3.1 命令注册
```
src/commands.ts
├── import review, { ultrareview } from './commands/review.js'
└── allCommands = [ ..., review, ultrareview, ... ]
```
`review.ts` 导出两个 Command 对象:
- **`review`**type: `'prompt'`)— 纯本地审查。向 Claude 发送 prompt 让模型调用 `gh pr diff` 做本地代码审查。
- **`ultrareview`**type: `'local-jsx'`)— 云端审查。`isEnabled()` 由 GrowthBook 门控,`load()` 懒加载 `ultrareviewCommand.tsx`
```typescript
// review.ts
const ultrareview: Command = {
type: 'local-jsx',
name: 'ultrareview',
description: `~1020 min · Finds and verifies bugs in your branch. Runs in Claude Code on the web.`,
isEnabled: () => isUltrareviewEnabled(),
load: () => import('./review/ultrareviewCommand.js'),
}
```
### 3.2 门控层
#### 3.2.1 可见性门控GrowthBook
```typescript
// ultrareviewEnabled.ts
export function isUltrareviewEnabled(): boolean {
const cfg = getFeatureValue_CACHED_MAY_BE_STALE<Record<string, unknown> | null>(
'tengu_review_bughunter_config', null
)
return cfg?.enabled === true
}
```
- 从 GrowthBook 远程配置读取 `tengu_review_bughunter_config` feature flag
-`cfg.enabled !== true` 时,`/ultrareview` 命令在 `getCommands()` 中被过滤掉,用户完全看不到
- **fork 环境问题**GrowthBook 连接通常返回空值,导致命令永远不可见
#### 3.2.2 计费门控OverageGate
```typescript
// reviewRemote.ts
export type OverageGate =
| { kind: 'proceed'; billingNote: string }
| { kind: 'not-enabled' }
| { kind: 'low-balance'; available: number }
| { kind: 'needs-confirm' }
```
`checkOverageGate()` 的决策树:
```
checkOverageGate()
├─ Team/Enterprise 订阅 → proceed免费包含
├─ 并行获取 quota + utilization
│ ├─ quota 不可用(非订阅/API 失败)→ proceed服务端处理
│ ├─ reviews_remaining > 0 → proceed + billingNote"免费第 N/M 次"
│ ├─ utilization 不可用 → proceed降级容错
│ ├─ Extra Usage 未启用 → not-enabled
│ ├─ 余额 < $10 → low-balance
│ ├─ 未在本会话确认过 → needs-confirm
│ └─ 已确认 → proceed + billingNote"Extra Usage 计费"
└─ 会话级确认标志 sessionOverageConfirmed一次确认全会话生效
```
### 3.3 命令处理器
```typescript
// ultrareviewCommand.tsx — call() 函数
export const call: LocalJSXCommandCall = async (onDone, context, args) => {
const gate = await checkOverageGate()
switch (gate.kind) {
case 'not-enabled':
// 显示 "启用 Extra Usage" 提示
onDone('Free ultrareviews used...', { display: 'system' })
case 'low-balance':
// 显示余额不足提示
onDone(`Balance too low ($X.XX available, $10 minimum)...`)
case 'needs-confirm':
// 渲染 UltrareviewOverageDialog 组件
return <UltrareviewOverageDialog
onProceed={async (signal) => {
await launchAndDone(args, context, onDone, billingNote, signal)
if (!signal.aborted) confirmOverage() // 持久化确认
}}
onCancel={() => onDone('Ultrareview cancelled.')}
/>
case 'proceed':
// 直接启动
await launchAndDone(args, context, onDone, gate.billingNote)
}
}
```
### 3.4 超额计费对话框
```
UltrareviewOverageDialog.tsx
┌──────────────────────────────────────────┐
│ Ultrareview billing │
│ │
│ Your free ultrareviews for this │
│ organization are used. Further │
│ reviews bill as Extra Usage. │
│ │
│ > Proceed with Extra Usage billing │
│ Cancel │
└──────────────────────────────────────────┘
```
特性:
- Escape 键取消并通过 AbortController signal 中止正在进行的 launch
- launch 失败(`onProceed` reject恢复 Select 让用户重试
- 只有非中止的成功 launch 才调用 `confirmOverage()`
### 3.5 远程会话启动reviewRemote.ts
`launchRemoteReview()` 是核心引擎,支持两种模式:
#### 3.5.1 PR 模式
```
用户输入: /ultrareview 123
→ args = "123", isPrNumber = true
→ detectCurrentRepositoryWithHost()
→ 必须是 github.com其他 host 返回 null
→ teleportToRemote({
branchName: "refs/pull/123/head",
environmentId: CODE_REVIEW_ENV_ID,
environmentVariables: {
BUGHUNTER_PR_NUMBER: "123",
BUGHUNTER_REPOSITORY: "owner/repo",
...commonEnvVars
}
})
```
#### 3.5.2 Branch 模式
```
用户输入: /ultrareview无参数
→ isPrNumber = false
→ getDefaultBranch() || "main"
→ git merge-base <baseBranch> HEAD → mergeBaseSha
├─ 失败 → "Could not find merge-base"
└─ 成功 → git diff --shortstat <sha>
├─ 无变更 → "No changes against fork point"
└─ 有变更 → teleportToRemote({
useBundle: true, // 打包工作树
environmentId: CODE_REVIEW_ENV_ID,
environmentVariables: {
BUGHUNTER_BASE_BRANCH: mergeBaseSha,
...commonEnvVars
}
})
├─ 返回 null → "Repo is too large, use PR mode"
└─ 成功 → 注册任务
```
#### 3.5.3 Bughunter 配置参数
从 GrowthBook `tengu_review_bughunter_config` 读取,带安全上限:
| 环境变量 | 含义 | 默认值 | 上限 |
|----------|------|--------|------|
| `BUGHUNTER_DRY_RUN` | 干运行标志 | `"1"` | — |
| `BUGHUNTER_FLEET_SIZE` | agent 舰队大小 | 5 | 20 |
| `BUGHUNTER_MAX_DURATION` | 单 agent 最大运行时间(分钟) | 10 | 25 |
| `BUGHUNTER_AGENT_TIMEOUT` | 单 agent 超时(秒) | 600 | 1800 |
| `BUGHUNTER_TOTAL_WALLCLOCK` | 总运行时间上限(分钟) | 22 | 27 |
| `BUGHUNTER_DEV_BUNDLE_B64` | 开发用 bundle可选 | — | — |
`posInt()` 辅助函数对每个参数做类型检查、正整数验证和上限约束。wallclock 上限 27 分钟留出 ~3 分钟给合成阶段,以适配 RemoteAgentTask 的 30 分钟轮询超时。
#### 3.5.4 远程环境 ID
```typescript
const CODE_REVIEW_ENV_ID = 'env_011111111111111111111113'
```
这是一个合成的 CCR 环境 IDGo 的 `taggedid.FromUUID` 编码),不需要 per-org CCR 环境配置即可工作。
#### 3.5.5 前置条件检查
`checkRemoteAgentEligibility()` 检查 6 种前置条件:
| 前置条件 | 说明 | ultrareview 处理 |
|----------|------|-----------------|
| `not_logged_in` | 未登录 Claude.ai OAuth | 阻止启动 |
| `no_remote_environment` | 无云端环境 | **跳过**(合成 env ID 绕过) |
| `not_in_git_repo` | 不在 git 仓库中 | 阻止启动 |
| `no_git_remote` | 无 GitHub remote | 阻止启动 |
| `github_app_not_installed` | Claude GitHub App 未安装 | 阻止启动 |
| `policy_blocked` | 组织策略禁止远程会话 | 阻止启动 |
### 3.6 任务注册与轮询
#### 3.6.1 任务注册
```typescript
// reviewRemote.ts 末尾
registerRemoteAgentTask({
remoteTaskType: 'ultrareview', // 任务类型
session, // { id, title }
command, // "/ultrareview" 或 "/ultrareview 123"
context, // ToolUseContext
isRemoteReview: true, // 启用 review 专用逻辑
})
```
`registerRemoteAgentTask()` 执行:
1. 生成 `taskId``generateTaskId('remote_agent')`
2. 初始化磁盘输出文件(`initTaskOutput(taskId)`
3. 创建 `RemoteAgentTaskState`(初始 status: `'running'`
4. 注册到全局任务框架(`registerTask()`
5. 持久化到 session sidecar支持 `--resume`
6. 启动轮询循环(`startRemoteSessionPolling()`
#### 3.6.2 RemoteAgentTaskStatereview 相关字段)
```typescript
type RemoteAgentTaskState = TaskStateBase & {
type: 'remote_agent'
remoteTaskType: 'ultrareview'
sessionId: string
command: string
title: string
todoList: TodoList
log: SDKMessage[]
pollStartedAt: number
isRemoteReview: true // review 专用标志
reviewProgress?: { // 实时进度
stage?: 'finding' | 'verifying' | 'synthesizing'
bugsFound: number
bugsVerified: number
bugsRefuted: number
}
}
```
#### 3.6.3 轮询引擎
`startRemoteSessionPolling()` 是一个 1 秒间隔的异步轮询循环:
```
每 1 秒轮询一次:
├─ pollRemoteSessionEvents(sessionId, lastEventId)
│ → 获取新事件 + 会话状态
├─ 事件增量扫描:
│ ├─ 追加到 accumulatedLog
│ ├─ 写入磁盘输出文件
│ ├─ 提取 <remote-review-progress> → reviewProgress
│ └─ 提取 <remote-review> 标签 → cachedReviewContent
├─ 会话状态 = archived → 完成
├─ 完成条件判断:
│ ├─ cachedReviewContent !== null → 有审查输出
│ ├─ stableIdle (5 次连续 idle + 有 assistant 输出 + 非 bughunter 模式)
│ └─ reviewTimedOut (pollStartedAt + 30min)
├─ 成功完成:
│ → enqueueRemoteReviewNotification(reviewContent)
│ → evictTaskOutput() + removeRemoteAgentMetadata()
└─ 失败:
→ updateTaskState(status: 'failed')
→ enqueueRemoteReviewFailureNotification(reason)
失败原因:
- "remote session returned an error"
- "remote session exceeded 30 minutes"
- "no review output — orchestrator may have exited early"
```
**Bughunter 模式 vs Prompt 模式的区别**
| 特征 | Bughunter 模式 | Prompt 模式 |
|------|---------------|------------|
| 产出位置 | SessionStart hook 的 stdout | assistant 消息 |
| 完成信号 | `<remote-review>` 标签出现 | stableIdle5 次连续 idle |
| 进度来源 | `<remote-review-progress>` 心跳 | 无 |
| 判别依据 | `hook_event === 'SessionStart'` 存在 | 不存在 |
#### 3.6.4 进度数据格式
```xml
<remote-review-progress>
{"stage":"finding","bugs_found":3,"bugs_verified":1,"bugs_refuted":0}
</remote-review-progress>
```
轮询器从 `hook_progress` / `hook_response` 事件的 stdout 中提取最后一个此标签(`lastIndexOf`),解析 JSON 并映射到 `reviewProgress`
#### 3.6.5 审查输出提取
`extractReviewFromLog()` 按优先级扫描 4 个来源:
1. **hook stdout 逐条扫描**`hook_progress` / `hook_response``<remote-review>` 标签)
2. **assistant 消息逐条扫描**`<remote-review>` 标签)
3. **hook stdout 拼接回退**(处理大 JSON 跨两个事件的情况)
4. **全部 assistant 文本拼接回退**(无标签时的兜底)
`extractReviewTagFromLog()` 是增量扫描变体,**不使用第 4 个回退**,避免早期 assistant 消息(如 "I'm analyzing the diff...")误触发完成。
### 3.7 通知管道
#### 3.7.1 成功通知
```xml
<task-notification>
<task-id>{taskId}</task-id>
<task-type>remote_agent</task-type>
<status>completed</status>
<summary>Remote review completed</summary>
</task-notification>
The remote review produced the following findings:
{reviewContent}
```
- 审查内容**直接注入**消息队列(`task-notification` mode不通过文件间接引用
- 远程会话**不归档**(保持 alive用户可通过 claude.ai URL 随时回看
- TTL 自动清理过期会话
#### 3.7.2 失败通知
```xml
<task-notification>
<task-id>{taskId}</task-id>
<task-type>remote_agent</task-type>
<status>failed</status>
<summary>Remote review failed: {reason}</summary>
</task-notification>
Remote review did not produce output ({reason}).
Tell the user to retry /ultrareview, or use /review for a local review instead.
```
### 3.8 配额 API
```typescript
// ultrareviewQuota.ts
type UltrareviewQuotaResponse = {
reviews_used: number // 已使用的免费次数
reviews_limit: number // 免费次数上限
reviews_remaining: number // 剩余免费次数
is_overage: boolean // 是否已超额
}
// GET /v1/ultrareview/quota
// Headers: OAuth + x-organization-uuid
// Timeout: 5000ms
// 前置条件: isClaudeAISubscriber()
```
### 3.9 UI 层
#### 3.9.1 进度展示RemoteSessionProgress.tsx
Review 任务使用 `ReviewRainbowLine` 子组件,呈现三种状态:
**运行中**
```
◇ ultrareview · finding / 3 found · 1 verified
```
- ◇ 菱形为 teal 色
- "ultrareview" 文字带 rainbow 渐变动画(每 3 帧推进一个相位)
- 计数用 `useSmoothCount` 逐帧递增2→5 显示为 2→3→4→5
**已完成**
```
◆ ultrareview ready · shift+↓ to view
```
**失败**
```
◆ ultrareview · error
```
#### 3.9.2 阶段计数格式化
```typescript
formatReviewStageCounts(stage, found, verified, refuted):
stage='finding' "3 found" "finding"0
stage='verifying' "3 found · 1 verified" + refuted>0
stage='synthesizing' "1 verified · deduping" + refuted>0
stage=undefined "3 found · 1 verified"pre-stage
```
#### 3.9.3 详情对话框RemoteSessionDetailDialog.tsx
展示完整的远程会话信息,包含:
- 标题栏:◇/◆ + "ultrareview" + 运行时间 + 状态
- 会话消息流(标准化后的 Message 组件)
- 操作菜单:
- "Open in Claude Code on the web"(打开浏览器)
- "Stop ultrareview"(运行中时,需二次确认)
- "Back" / "Dismiss"
停止确认对话框:
```
┌──────────────────────────────────────────┐
│ Stop ultrareview? │
│ │
│ This archives the remote session and │
│ stops local tracking. The review will │
│ not complete and any findings so far │
│ are discarded. │
│ │
│ > Stop ultrareview │
│ Back │
└──────────────────────────────────────────┘
```
#### 3.9.4 输入框 Rainbow 高亮PromptInput.tsx
```typescript
// 在用户输入中检测 "ultrareview" 关键词
const ultrareviewTriggers = useMemo(
() => isUltrareviewEnabled()
? findUltrareviewTriggerPositions(displayedValue)
: [],
[displayedValue]
)
// 对关键词应用 per-character rainbow 渐变
for (const trigger of ultrareviewTriggers) {
// 与 ultraplan 相同的 rainbow 处理
}
// 显示提示通知
useEffect(() => {
if (isUltrareviewEnabled() && ultrareviewTriggers.length) {
addNotification({
key: 'ultrareview-active',
text: 'Run /ultrareview after Claude finishes to review these changes in the cloud',
priority: 'immediate',
timeoutMs: 5000,
})
}
}, [ultrareviewTriggers.length])
```
---
## 4. 数据流全景
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 用户输入 /ultrareview [PR#] │
└────────────────────────────────────┬────────────────────────────────────────┘
┌──────────────────────┐
│ ultrareviewEnabled │
│ GrowthBook 门控 │
│ tengu_review_ │
│ bughunter_config │
└──────────┬───────────┘
│ enabled === true
┌───────────────────────────────┐
│ ultrareviewCommand.tsx │
│ checkOverageGate() │
└──────────┬────────────────────┘
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────────┐ ┌───────────┐
│ proceed │ │ needs-confirm│ │ not- │
│ │ │ │ │ enabled / │
│ │ │ Overage │ │ low- │
│ │ │ Dialog │ │ balance │
└─────┬─────┘ └──────┬───────┘ └───────────┘
│ │ ×
│ 用户确认 │
▼ ▼
┌──────────────────────────────┐
│ reviewRemote.ts │
│ launchRemoteReview() │
└──────────┬───────────────────┘
┌──────────┼──────────┐
│ PR 模式 │ Branch 模式
▼ ▼
┌────────────────┐ ┌──────────────────────┐
│ detect repo │ │ merge-base + diff │
│ github.com only│ │ empty diff → 中止 │
│ │ │ useBundle: true │
└───────┬────────┘ └──────────┬───────────┘
│ │
└───────────┬───────────┘
┌──────────────────────┐
│ teleportToRemote() │
│ → CCR 远程环境 │
│ env_01...13 │
│ BUGHUNTER_* 环境变量 │
└──────────┬───────────┘
┌──────────────────────────────┐
│ registerRemoteAgentTask() │
│ type: 'ultrareview' │
│ isRemoteReview: true │
└──────────┬───────────────────┘
┌────────────────────────────────────┐
│ startRemoteSessionPolling() │
│ 每 1 秒轮询 │
│ │
│ ┌───────────────────────────┐ │
│ │ pollRemoteSessionEvents() │ │
│ │ → 增量事件 + 会话状态 │ │
│ └───────────┬───────────────┘ │
│ │ │
│ ┌────────┼────────┐ │
│ ▼ ▼ ▼ │
│ progress review timeout │
│ 心跳解析 标签提取 30 min │
│ │
│ finding → verifying → synth. │
└──────────┬─────────────────────────┘
│ 完成
┌──────────────────────────────────────┐
│ enqueueRemoteReviewNotification() │
│ → task-notification 消息队列 │
│ → 本地 Claude 模型接收并叙述结果 │
└──────────────────────────────────────┘
```
---
## 5. 遥测事件
| 事件名 | 触发时机 |
|--------|---------|
| `tengu_review_overage_not_enabled` | 免费次数用完且 Extra Usage 未启用 |
| `tengu_review_overage_low_balance` | Extra Usage 余额 < $10 |
| `tengu_review_overage_dialog_shown` | 超额确认对话框弹出 |
| `tengu_review_remote_precondition_failed` | 前置条件检查失败(含 `precondition_errors` 字段) |
| `tengu_review_remote_teleport_failed` | teleport 传输失败session = null |
| `tengu_review_remote_launched` | 远程会话成功创建 |
---
## 6. 缺失与问题分析
### 6.1 Stub`/bughunter` 命令
```javascript
// src/commands/bughunter/index.js
export default { isEnabled: () => false, isHidden: true, name: 'stub' }
```
这是 bughunter 编排器的**本地调试入口**,完全被 stub 掉。在生产环境中 bughunter 逻辑运行在 CCR 远端容器(`run_hunt.sh`),所以这个 stub 不影响 ultrareview 功能。但如果需要本地调试 bughunter 编排器,需要恢复此命令。
### 6.2 零测试覆盖
`src/commands/review/` 目录下没有 `__tests__/` 目录。以下函数完全无测试:
- `isUltrareviewEnabled()` — 门控函数
- `checkOverageGate()` — 计费决策树4 个分支 × 多种 quota/utilization 组合)
- `launchRemoteReview()` — 核心引擎PR/Branch 两条路径 + 多种失败场景)
- `UltrareviewOverageDialog` — React 组件(用户交互 + abort 信号 + 错误恢复)
- `fetchUltrareviewQuota()` — API 客户端
- `extractReviewFromLog()` / `extractReviewTagFromLog()` — 日志解析4 个回退层级)
- `formatReviewStageCounts()` — 阶段格式化
- `ReviewRainbowLine` / `useSmoothCount` — 动画组件
其中 `checkOverageGate()``extractReview*FromLog()` 的分支复杂度最高,最需要测试。
### 6.3 GrowthBook 门控无本地回退
`isUltrareviewEnabled()` 完全依赖远程 GrowthBook 配置。与 ultraplan 等功能不同,没有 `LOCAL_GATE_DEFAULTS` 或环境变量覆盖。在 fork 环境中:
- GrowthBook 连接返回 `null`
- `cfg?.enabled === true` 永远为 `false`
- `/ultrareview` 命令对用户完全不可见
**修复方案**:添加环境变量回退,如 `FEATURE_ULTRAREVIEW=1``true`
### 6.4 CCR 依赖
Ultra Review 整条链路依赖 Claude Code on the webCCR
- `teleportToRemote()` — 需要 OAuth 认证 + CCR 会话 API
- `isClaudeAISubscriber()` — 配额查询的前提
- `pollRemoteSessionEvents()` — 需要 CCR 事件流 API
- 合成环境 ID `env_011111111111111111111113` — CCR 服务端识别
对于非 Anthropic 订阅用户或离线环境ultrareview 不可用。`/review` 命令作为本地回退方案。
### 6.5 TODO 项
代码中存在一个未完成的 TODO
```
// reviewRemote.ts:9
// TODO(#22051): pass useBundleMode once landed so local-only / uncommitted
// repo state is captured. The GitHub-clone path (current) only works for
// pushed branches on repos with the Claude GitHub app installed.
```
Branch 模式已经实现了 `useBundle: true`(打包工作树),但 PR 模式仍然只通过 GitHub 克隆,不能捕获本地未提交的改动。
---
## 7. 与 `/review` 的对比
| 维度 | `/review` | `/ultrareview` |
|------|-----------|---------------|
| 类型 | `prompt` | `local-jsx` |
| 执行位置 | 本地 | CCR 云端 |
| 时间 | 即时(取决于模型速度) | 1020 分钟 |
| 机制 | 发送 prompt 让 Claude 调用 `gh pr diff` | teleport + bughunter 多 agent 舰队 |
| 门控 | 无 | GrowthBook + 计费门控 |
| 依赖 | `gh` CLI + GitHub token | OAuth + CCR + Claude GitHub App |
| 输出 | 模型直接回复 | task-notification 异步注入 |
| 适用场景 | 快速轻量审查 | 深度 bug 挖掘 + 验证 |
---
## 8. 与 `/ultraplan` 的共享基础设施
Ultra Review 大量复用了 ultraplan 建立的基础设施:
| 共享模块 | 用途 |
|----------|------|
| `teleportToRemote()` | 仓库传送到 CCR |
| `registerRemoteAgentTask()` | 远程任务注册 |
| `startRemoteSessionPolling()` | 轮询引擎 |
| `RemoteAgentTaskState` | 任务状态类型 |
| `RemoteSessionDetailDialog` | 详情对话框 |
| `findKeywordTriggerPositions()` | 输入框关键词检测 |
| `RainbowText` / `getRainbowColor()` | rainbow 渐变动画 |
| `checkRemoteAgentEligibility()` | 前置条件检查 |
| `persistRemoteAgentMetadata()` | session sidecar 持久化 |
| `restoreRemoteAgentTasks()` | `--resume` 恢复 |
差异点:
- ultrareview 使用 `isRemoteReview: true` 标志走 review 专用分支
- ultrareview 有自己的轮询完成逻辑(`<remote-review>` 标签 vs ultraplan 的 `ExitPlanMode` 扫描)
- ultrareview 有配额 + 计费门控ultraplan 没有)
- ultrareview 有 bughunter 环境变量配置层ultraplan 没有)