Skip to content

Commit dd9cd78

Browse files
feat: 问就是封包
1 parent d7a729c commit dd9cd78

67 files changed

Lines changed: 426 additions & 175 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 248 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,254 @@
22

33
Anthropic 官方 [Claude Code](https://docs.anthropic.com/en/docs/claude-code) CLI 工具的源码反编译/逆向还原项目。目标是将 Claude Code 核心功能跑通,必要时删减次级能力。
44

5-
## 核心能力
6-
7-
- API 通信(Anthropic SDK / Bedrock / Vertex)
8-
- Bash / FileRead / FileWrite / FileEdit 等核心工具
9-
- REPL 交互界面(ink 终端渲染)
10-
- 对话历史与会话管理
11-
- 权限系统
12-
- Agent / 子代理系统
13-
14-
## 已删减模块
15-
16-
| 模块 | 处理方式 |
17-
|------|----------|
18-
| Computer Use (`@ant/computer-use-*`) | stub |
19-
| Claude for Chrome MCP | stub |
20-
| Magic Docs / Voice Mode / LSP Server | 移除 |
21-
| Analytics / GrowthBook / Sentry | 空实现 |
22-
| Plugins / Marketplace / Desktop Upsell | 移除 |
23-
| Ultraplan / Tungsten / Auto Dream | 移除 |
24-
| MCP OAuth/IDP | 简化 |
25-
| DAEMON / BRIDGE / BG_SESSIONS / TEMPLATES 等 | feature flag 关闭 |
5+
## 能力清单
6+
7+
> ✅ = 已实现 ⚠️ = 部分实现 / 条件启用 ❌ = stub / 移除 / feature flag 关闭
8+
9+
### 核心系统
10+
11+
| 能力 | 状态 | 说明 |
12+
|------|------|------|
13+
| REPL 交互界面(Ink 终端渲染) || 主屏幕 5000+ 行,完整交互 |
14+
| API 通信 — Anthropic Direct || 支持 API Key + OAuth |
15+
| API 通信 — AWS Bedrock || 支持凭据刷新、Bearer Token |
16+
| API 通信 — Google Vertex || 支持 GCP 凭据刷新 |
17+
| API 通信 — Azure Foundry || 支持 API Key + Azure AD |
18+
| 流式对话与工具调用循环 (`query.ts`) || 1700+ 行,含自动压缩、token 追踪 |
19+
| 会话引擎 (`QueryEngine.ts`) || 1300+ 行,管理对话状态与归因 |
20+
| 上下文构建(git status / CLAUDE.md / memory) || `context.ts` 完整实现 |
21+
| 权限系统(plan/auto/manual 模式) || 6300+ 行,含 YOLO 分类器、路径验证、规则匹配 |
22+
| Hook 系统(pre/post tool use) || 支持 settings.json 配置 |
23+
| 会话恢复 (`/resume`) || 独立 ResumeConversation 屏幕 |
24+
| Doctor 诊断 (`/doctor`) || 版本、API、插件、沙箱检查 |
25+
| 自动压缩 (compaction) || auto-compact / micro-compact / API compact |
26+
27+
### 工具 — 始终可用
28+
29+
| 工具 | 状态 | 说明 |
30+
|------|------|------|
31+
| BashTool || Shell 执行,沙箱,权限检查 |
32+
| FileReadTool || 文件 / PDF / 图片 / Notebook 读取 |
33+
| FileEditTool || 字符串替换式编辑 + diff 追踪 |
34+
| FileWriteTool || 文件创建 / 覆写 + diff 生成 |
35+
| NotebookEditTool || Jupyter Notebook 单元格编辑 |
36+
| AgentTool || 子代理派生(fork / async / background / remote) |
37+
| WebFetchTool || URL 抓取 → Markdown → AI 摘要 |
38+
| WebSearchTool || 网页搜索 + 域名过滤 |
39+
| AskUserQuestionTool || 多问题交互提示 + 预览 |
40+
| SendMessageTool || 消息发送(peers / teammates / mailbox) |
41+
| SkillTool || 斜杠命令 / Skill 调用 |
42+
| EnterPlanModeTool || 进入计划模式 |
43+
| ExitPlanModeTool (V2) || 退出计划模式 |
44+
| TodoWriteTool || Todo 列表 v1 |
45+
| BriefTool || 简短消息 + 附件发送 |
46+
| TaskOutputTool || 后台任务输出读取 |
47+
| TaskStopTool || 后台任务停止 |
48+
| ListMcpResourcesTool || MCP 资源列表 |
49+
| ReadMcpResourceTool || MCP 资源读取 |
50+
| SyntheticOutputTool || 非交互会话结构化输出 |
51+
52+
### 工具 — 条件启用
53+
54+
| 工具 | 状态 | 启用条件 |
55+
|------|------|----------|
56+
| GlobTool || 未嵌入 bfs/ugrep 时启用(默认启用) |
57+
| GrepTool || 同上 |
58+
| TaskCreateTool | ⚠️ | `isTodoV2Enabled()` 为 true 时 |
59+
| TaskGetTool | ⚠️ | 同上 |
60+
| TaskUpdateTool | ⚠️ | 同上 |
61+
| TaskListTool | ⚠️ | 同上 |
62+
| EnterWorktreeTool | ⚠️ | `isWorktreeModeEnabled()` |
63+
| ExitWorktreeTool | ⚠️ | 同上 |
64+
| TeamCreateTool | ⚠️ | `isAgentSwarmsEnabled()` |
65+
| TeamDeleteTool | ⚠️ | 同上 |
66+
| ToolSearchTool | ⚠️ | `isToolSearchEnabledOptimistic()` |
67+
| PowerShellTool | ⚠️ | Windows 平台检测 |
68+
| LSPTool | ⚠️ | `ENABLE_LSP_TOOL` 环境变量 |
69+
| ConfigTool || `USER_TYPE === 'ant'`(永远为 false) |
70+
71+
### 工具 — Feature Flag 关闭(全部不可用)
72+
73+
| 工具 | Feature Flag |
74+
|------|-------------|
75+
| SleepTool | `PROACTIVE` / `KAIROS` |
76+
| CronCreate/Delete/ListTool | `AGENT_TRIGGERS` |
77+
| RemoteTriggerTool | `AGENT_TRIGGERS_REMOTE` |
78+
| MonitorTool | `MONITOR_TOOL` |
79+
| SendUserFileTool | `KAIROS` |
80+
| OverflowTestTool | `OVERFLOW_TEST_TOOL` |
81+
| TerminalCaptureTool | `TERMINAL_PANEL` |
82+
| WebBrowserTool | `WEB_BROWSER_TOOL` |
83+
| SnipTool | `HISTORY_SNIP` |
84+
| WorkflowTool | `WORKFLOW_SCRIPTS` |
85+
| PushNotificationTool | `KAIROS` |
86+
| SubscribePRTool | `KAIROS_GITHUB_WEBHOOKS` |
87+
| ListPeersTool | `UDS_INBOX` |
88+
| CtxInspectTool | `CONTEXT_COLLAPSE` |
89+
90+
### 工具 — Stub / 不可用
91+
92+
| 工具 | 说明 |
93+
|------|------|
94+
| TungstenTool | ANT-ONLY stub |
95+
| REPLTool | ANT-ONLY,`isEnabled: () => false` |
96+
| SuggestBackgroundPRTool | ANT-ONLY,`isEnabled: () => false` |
97+
| VerifyPlanExecutionTool |`CLAUDE_CODE_VERIFY_PLAN=true` 环境变量,且为 stub |
98+
| ReviewArtifactTool | stub,未注册到 tools.ts |
99+
| DiscoverSkillsTool | stub,未注册到 tools.ts |
100+
101+
### 斜杠命令 — 可用
102+
103+
| 命令 | 状态 | 说明 |
104+
|------|------|------|
105+
| `/add-dir` || 添加目录 |
106+
| `/advisor` || Advisor 配置 |
107+
| `/agents` || 代理列表/管理 |
108+
| `/branch` || 分支管理 |
109+
| `/btw` || 快速备注 |
110+
| `/chrome` || Chrome 集成 |
111+
| `/clear` || 清屏 |
112+
| `/color` || Agent 颜色 |
113+
| `/compact` || 压缩对话 |
114+
| `/config` (`/settings`) || 配置管理 |
115+
| `/context` || 上下文信息 |
116+
| `/copy` || 复制最后消息 |
117+
| `/cost` || 会话费用 |
118+
| `/desktop` || Claude Desktop 集成 |
119+
| `/diff` || 显示 diff |
120+
| `/doctor` || 健康检查 |
121+
| `/effort` || 设置 effort 等级 |
122+
| `/exit` || 退出 |
123+
| `/export` || 导出对话 |
124+
| `/extra-usage` || 额外用量信息 |
125+
| `/fast` || 切换 fast 模式 |
126+
| `/feedback` || 反馈 |
127+
| `/files` || 已跟踪文件 |
128+
| `/heapdump` || Heap dump(调试) |
129+
| `/help` || 帮助 |
130+
| `/hooks` || Hook 管理 |
131+
| `/ide` || IDE 连接 |
132+
| `/init` || 初始化项目 |
133+
| `/install-github-app` || 安装 GitHub App |
134+
| `/install-slack-app` || 安装 Slack App |
135+
| `/keybindings` || 快捷键管理 |
136+
| `/login` / `/logout` || 登录 / 登出 |
137+
| `/mcp` || MCP 服务管理 |
138+
| `/memory` || Memory / CLAUDE.md 管理 |
139+
| `/mobile` || 移动端 QR 码 |
140+
| `/model` || 模型选择 |
141+
| `/output-style` || 输出风格 |
142+
| `/passes` || 推荐码 |
143+
| `/permissions` || 权限管理 |
144+
| `/plan` || 计划模式 |
145+
| `/plugin` || 插件管理 |
146+
| `/pr-comments` || PR 评论 |
147+
| `/privacy-settings` || 隐私设置 |
148+
| `/rate-limit-options` || 限速选项 |
149+
| `/release-notes` || 更新日志 |
150+
| `/reload-plugins` || 重载插件 |
151+
| `/remote-env` || 远程环境配置 |
152+
| `/rename` || 重命名会话 |
153+
| `/resume` || 恢复会话 |
154+
| `/review` || 代码审查(本地) |
155+
| `/ultrareview` || 云端审查 |
156+
| `/rewind` || 回退对话 |
157+
| `/sandbox-toggle` || 切换沙箱 |
158+
| `/security-review` || 安全审查 |
159+
| `/session` || 会话信息 |
160+
| `/skills` || Skill 管理 |
161+
| `/stats` || 会话统计 |
162+
| `/status` || 状态信息 |
163+
| `/statusline` || 状态栏 UI |
164+
| `/stickers` || 贴纸 |
165+
| `/tasks` || 任务管理 |
166+
| `/theme` || 终端主题 |
167+
| `/think-back` || 年度回顾 |
168+
| `/upgrade` || 升级 CLI |
169+
| `/usage` || 用量信息 |
170+
| `/insights` || 使用分析报告 |
171+
| `/vim` || Vim 模式 |
172+
173+
### 斜杠命令 — Feature Flag 关闭
174+
175+
| 命令 | Feature Flag |
176+
|------|-------------|
177+
| `/voice` | `VOICE_MODE` |
178+
| `/proactive` | `PROACTIVE` / `KAIROS` |
179+
| `/brief` | `KAIROS` / `KAIROS_BRIEF` |
180+
| `/assistant` | `KAIROS` |
181+
| `/bridge` | `BRIDGE_MODE` |
182+
| `/remote-control-server` | `DAEMON` + `BRIDGE_MODE` |
183+
| `/force-snip` | `HISTORY_SNIP` |
184+
| `/workflows` | `WORKFLOW_SCRIPTS` |
185+
| `/web-setup` | `CCR_REMOTE_SETUP` |
186+
| `/subscribe-pr` | `KAIROS_GITHUB_WEBHOOKS` |
187+
| `/ultraplan` | `ULTRAPLAN` |
188+
| `/torch` | `TORCH` |
189+
| `/peers` | `UDS_INBOX` |
190+
| `/fork` | `FORK_SUBAGENT` |
191+
| `/buddy` | `BUDDY` |
192+
193+
### 斜杠命令 — ANT-ONLY(不可用)
194+
195+
`/tag` `/backfill-sessions` `/break-cache` `/bughunter` `/commit` `/commit-push-pr` `/ctx_viz` `/good-claude` `/issue` `/init-verifiers` `/mock-limits` `/bridge-kick` `/version` `/reset-limits` `/onboarding` `/share` `/summary` `/teleport` `/ant-trace` `/perf-issue` `/env` `/oauth-refresh` `/debug-tool-call` `/agents-platform` `/autofix-pr`
196+
197+
### CLI 子命令
198+
199+
| 子命令 | 状态 | 说明 |
200+
|--------|------|------|
201+
| `claude`(默认) || 主 REPL / 交互 / print 模式 |
202+
| `claude mcp serve/add/remove/list/get/...` || MCP 服务管理(7 个子命令) |
203+
| `claude auth login/status/logout` || 认证管理 |
204+
| `claude plugin validate/list/install/...` || 插件管理(7 个子命令) |
205+
| `claude setup-token` || 长效 Token 配置 |
206+
| `claude agents` || 代理列表 |
207+
| `claude doctor` || 健康检查 |
208+
| `claude update` / `upgrade` || 自动更新 |
209+
| `claude install [target]` || Native 安装 |
210+
| `claude server` || `DIRECT_CONNECT` flag |
211+
| `claude ssh <host>` || `SSH_REMOTE` flag |
212+
| `claude open <cc-url>` || `DIRECT_CONNECT` flag |
213+
| `claude auto-mode` || `TRANSCRIPT_CLASSIFIER` flag |
214+
| `claude remote-control` || `BRIDGE_MODE` + `DAEMON` flag |
215+
| `claude assistant` || `KAIROS` flag |
216+
| `claude up/rollback/log/error/export/task/completion` || ANT-ONLY |
217+
218+
### 服务层
219+
220+
| 服务 | 状态 | 说明 |
221+
|------|------|------|
222+
| API 客户端 (`services/api/`) || 3400+ 行,4 个 provider |
223+
| MCP (`services/mcp/`) || 24 个文件,12000+ 行 |
224+
| OAuth (`services/oauth/`) || 完整 OAuth 流程 |
225+
| 插件 (`services/plugins/`) || 基础设施完整,无内置插件 |
226+
| LSP (`services/lsp/`) | ⚠️ | 实现存在,默认关闭 |
227+
| 压缩 (`services/compact/`) || auto / micro / API 压缩 |
228+
| Hook 系统 (`services/tools/toolHooks.ts`) || pre/post tool use hooks |
229+
| 会话记忆 (`services/SessionMemory/`) || 会话记忆管理 |
230+
| 记忆提取 (`services/extractMemories/`) || 自动记忆提取 |
231+
| Skill 搜索 (`services/skillSearch/`) || 本地/远程 skill 搜索 |
232+
| 策略限制 (`services/policyLimits/`) || 策略限制执行 |
233+
| 分析 / GrowthBook / Sentry | ⚠️ | 框架存在,实际 sink 为空 |
234+
| Voice (`services/voice.ts`) || `VOICE_MODE` flag 关闭 |
235+
236+
### 内部包 (`packages/`)
237+
238+
|| 状态 | 说明 |
239+
|------|------|------|
240+
| `color-diff-napi` || 997 行完整 TypeScript 实现(语法高亮 diff) |
241+
| `audio-capture-napi` || stub,`isNativeAudioAvailable()` 返回 false |
242+
| `image-processor-napi` || stub,`getNativeModule()` 返回 null |
243+
| `modifiers-napi` || stub,`isModifierPressed()` 返回 false |
244+
| `url-handler-napi` || stub,`waitForUrlEvent()` 返回 null |
245+
| `@ant/claude-for-chrome-mcp` || stub,`createServer()` 返回 null |
246+
| `@ant/computer-use-mcp` || stub,`buildTools()` 返回 [] |
247+
| `@ant/computer-use-input` || stub,仅类型声明 |
248+
| `@ant/computer-use-swift` || stub,仅类型声明 |
249+
250+
### Feature Flags(30 个,全部返回 `false`
251+
252+
`ABLATION_BASELINE` `AGENT_MEMORY_SNAPSHOT` `BG_SESSIONS` `BRIDGE_MODE` `BUDDY` `CCR_MIRROR` `CCR_REMOTE_SETUP` `CHICAGO_MCP` `COORDINATOR_MODE` `DAEMON` `DIRECT_CONNECT` `EXPERIMENTAL_SKILL_SEARCH` `FORK_SUBAGENT` `HARD_FAIL` `HISTORY_SNIP` `KAIROS` `KAIROS_BRIEF` `KAIROS_CHANNELS` `KAIROS_GITHUB_WEBHOOKS` `LODESTONE` `MCP_SKILLS` `PROACTIVE` `SSH_REMOTE` `TORCH` `TRANSCRIPT_CLASSIFIER` `UDS_INBOX` `ULTRAPLAN` `UPLOAD_USER_SETTINGS` `VOICE_MODE` `WEB_BROWSER_TOOL` `WORKFLOW_SCRIPTS`
26253

27254
## 快速开始
28255

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
{
2-
"name": "claude-code",
2+
"name": "claude-js",
33
"version": "1.0.0",
4-
"private": true,
54
"type": "module",
65
"workspaces": [
76
"packages/*",
87
"packages/@ant/*"
98
],
9+
"files": [
10+
"dist"
11+
],
1012
"scripts": {
1113
"build": "bun build src/entrypoints/cli.tsx --outdir dist --target bun",
12-
"dev": "bun run src/entrypoints/cli.tsx"
14+
"dev": "bun run src/entrypoints/cli.tsx",
15+
"prepublishOnly": "bun run build"
1316
},
1417
"dependencies": {
1518
"@alcalzone/ansi-tokenize": "^0.3.0",

packages/color-diff-napi/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { basename, extname } from 'path'
3030
// pushed later tests in the same shard into GC-pause territory and a
3131
// beforeEach/afterEach hook timeout (officialRegistry.test.ts, PR #24150).
3232
// Same lazy pattern the NAPI wrapper used for dlopen.
33-
type HLJSApi = typeof hljsNamespace
33+
type HLJSApi = typeof hljsNamespace.default
3434
let cachedHljs: HLJSApi | null = null
3535
function hljs(): HLJSApi {
3636
if (cachedHljs) return cachedHljs

src/bootstrap/state.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1755,4 +1755,4 @@ export function getPromptId(): string | null {
17551755
export function setPromptId(id: string | null): void {
17561756
STATE.promptId = id
17571757
}
1758-
export type isReplBridgeActive = any;
1758+
export function isReplBridgeActive(): boolean { return false; }

src/cli/handlers/auth.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export async function authLogin({
159159

160160
const orgResult = await validateForceLoginOrg()
161161
if (!orgResult.valid) {
162-
process.stderr.write(orgResult.message + '\n')
162+
process.stderr.write((orgResult as { valid: false; message: string }).message + '\n')
163163
process.exit(1)
164164
}
165165

@@ -209,7 +209,7 @@ export async function authLogin({
209209

210210
const orgResult = await validateForceLoginOrg()
211211
if (!orgResult.valid) {
212-
process.stderr.write(orgResult.message + '\n')
212+
process.stderr.write((orgResult as { valid: false; message: string }).message + '\n')
213213
process.exit(1)
214214
}
215215

src/cli/handlers/mcp.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ export async function mcpListHandler(): Promise<void> {
178178
// biome-ignore lint/suspicious/noConsole:: intentional console output
179179
console.log(`${name}: ${server.url} - ${status}`);
180180
} else if (!server.type || server.type === 'stdio') {
181-
const args = Array.isArray(server.args) ? server.args : [];
181+
const args = Array.isArray((server as any).args) ? (server as any).args : [];
182182
// biome-ignore lint/suspicious/noConsole:: intentional console output
183-
console.log(`${name}: ${server.command} ${args.join(' ')} - ${status}`);
183+
console.log(`${name}: ${(server as any).command} ${args.join(' ')} - ${status}`);
184184
}
185185
}
186186
}

src/cli/print.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,7 @@ function runHeadlessStreaming(
12431243
uuid: crumb.uuid,
12441244
timestamp: crumb.timestamp,
12451245
isReplay: true,
1246-
} satisfies SDKUserMessageReplay)
1246+
} as SDKUserMessageReplay)
12471247
}
12481248
}
12491249
}
@@ -1980,7 +1980,7 @@ function runHeadlessStreaming(
19801980
parent_tool_use_id: null,
19811981
uuid: c.uuid as string,
19821982
isReplay: true,
1983-
} satisfies SDKUserMessageReplay)
1983+
} as SDKUserMessageReplay)
19841984
}
19851985
}
19861986
}
@@ -2265,8 +2265,8 @@ function runHeadlessStreaming(
22652265
output.enqueue({
22662266
type: 'system' as const,
22672267
subtype: 'files_persisted' as const,
2268-
files: result.persistedFiles,
2269-
failed: result.failedFiles,
2268+
files: (result as any).persistedFiles,
2269+
failed: (result as any).failedFiles,
22702270
processed_at: new Date().toISOString(),
22712271
uuid: randomUUID(),
22722272
session_id: getSessionId(),

src/cli/transports/ccrClient.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ export class CCRClient {
375375
if (!result.ok) {
376376
throw new RetryableError(
377377
'client event POST failed',
378-
result.retryAfterMs,
378+
(result as any).retryAfterMs,
379379
)
380380
}
381381
},
@@ -398,7 +398,7 @@ export class CCRClient {
398398
if (!result.ok) {
399399
throw new RetryableError(
400400
'internal event POST failed',
401-
result.retryAfterMs,
401+
(result as any).retryAfterMs,
402402
)
403403
}
404404
},
@@ -427,7 +427,7 @@ export class CCRClient {
427427
'delivery batch',
428428
)
429429
if (!result.ok) {
430-
throw new RetryableError('delivery POST failed', result.retryAfterMs)
430+
throw new RetryableError('delivery POST failed', (result as any).retryAfterMs)
431431
}
432432
},
433433
baseDelayMs: 500,

0 commit comments

Comments
 (0)