入口模块详细分析 (src/entrypoints/)
本文档详细分析 Claude Code CLI 的入口点模块
模块概述
入口模块负责处理 CLI 启动时的快速路径判断和初始化流程,确保最小化不必要的模块加载,优化启动性能。
1. cli.tsx - 命令行入口
1.1 核心职责
cli.tsx 是 CLI 的主入口点,负责:
- 处理快速路径(最小模块加载)
- 分发特殊命令到专用处理流程
- 延迟加载主 CLI 模块
1.2 启动流程
typescript
async function main(): Promise<void> {
const args = process.argv.slice(2)
// 1. 快速路径检查
// 2. 特殊命令处理
// 3. 加载主 CLI
}
1.3 快速路径处理
版本输出 (--version/-v/-V)
typescript
if (args.length === 1 && (args[0] === '--version' || args[0] === '-v' || args[0] === '-V')) {
console.log(`${MACRO.VERSION} (Claude Code)`)
return
}
特点:
- 零模块导入 - 直接输出版本号
MACRO.VERSION在构建时内联
系统提示导出 (--dump-system-prompt)
typescript
if (feature('DUMP_SYSTEM_PROMPT') && args[0] === '--dump-system-prompt') {
// 1. enableConfigs()
// 2. 获取模型参数
// 3. getSystemPrompt()
// 4. 输出结果
return
}
用途:用于提取特定 commit 的系统提示,用于敏感度评估
1.4 特殊命令路径
Claude in Chrome MCP Server
typescript
if (process.argv[2] === '--claude-in-chrome-mcp') {
await runClaudeInChromeMcpServer()
return
}
Chrome Native Host
typescript
else if (process.argv[2] === '--chrome-native-host') {
await runChromeNativeHost()
return
}
Computer Use MCP (CHICAGO_MCP)
typescript
else if (feature('CHICAGO_MCP') && process.argv[2] === '--computer-use-mcp') {
await runComputerUseMcpServer()
return
}
Daemon Worker
typescript
if (feature('DAEMON') && args[0] === '--daemon-worker') {
await runDaemonWorker(args[1])
return
}
特点:
- 无
enableConfigs()- 保持轻量 - 无分析 sinks - 工作器是精简的
Remote Control (Bridge Mode)
typescript
if (feature('BRIDGE_MODE') &&
(args[0] === 'remote-control' || args[0] === 'rc' ||
args[0] === 'remote' || args[0] === 'sync' || args[0] === 'bridge')) {
// 1. enableConfigs()
// 2. Auth 检查
// 3. GrowthBook gate 检查
// 4. Policy limits 检查
// 5. bridgeMain(args.slice(1))
return
}
启动流程:
typescript
// Auth 检查必须在 GrowthBook 检查之前
// 因为没有 auth,GrowthBook 无法获取用户上下文
if (!getClaudeAIOAuthTokens()?.accessToken) {
exitWithError(BRIDGE_LOGIN_ERROR)
}
const disabledReason = await getBridgeDisabledReason()
if (disabledReason) {
exitWithError(`Error: ${disabledReason}`)
}
// Policy limits 检查
await waitForPolicyLimitsToLoad()
if (!isPolicyAllowed('allow_remote_control')) {
exitWithError("Error: Remote Control is disabled by your organization's policy.")
}
Daemon Supervisor
typescript
if (feature('DAEMON') && args[0] === 'daemon') {
enableConfigs()
initSinks()
await daemonMain(args.slice(1))
return
}
Background Sessions
typescript
if (feature('BG_SESSIONS') &&
(args[0] === 'ps' || args[0] === 'logs' ||
args[0] === 'attach' || args[0] === 'kill' ||
args.includes('--bg') || args.includes('--background'))) {
enableConfigs()
// 分发到对应 handler
return
}
Template Jobs
typescript
if (feature('TEMPLATES') &&
(args[0] === 'new' || args[0] === 'list' || args[0] === 'reply')) {
await templatesMain(args)
process.exit(0) // Ink TUI 可能有残留 handles
return
}
Environment Runner (BYOC)
typescript
if (feature('BYOC_ENVIRONMENT_RUNNER') && args[0] === 'environment-runner') {
await environmentRunnerMain(args.slice(1))
return
}
Self-Hosted Runner
typescript
if (feature('SELF_HOSTED_RUNNER') && args[0] === 'self-hosted-runner') {
await selfHostedRunnerMain(args.slice(1))
return
}
Tmux + Worktree
typescript
const hasTmuxFlag = args.includes('--tmux') || args.includes('--tmux=classic')
if (hasTmuxFlag && (args.includes('-w') || args.includes('--worktree') ||
args.some(a => a.startsWith('--worktree=')))) {
enableConfigs()
if (isWorktreeModeEnabled()) {
const result = await execIntoTmuxWorktree(args)
if (result.handled) return
// 失败则继续正常 CLI
}
}
1.5 标志重定向
typescript
// 重定向常见更新标志错误
if (args.length === 1 && (args[0] === '--update' || args[0] === '--upgrade')) {
process.argv = [process.argv[0], process.argv[1], 'update']
}
1.6 环境变量设置
typescript
// --bare: 设置 SIMPLE 标志
if (args.includes('--bare')) {
process.env.CLAUDE_CODE_SIMPLE = '1'
}
1.7 正常 CLI 启动
typescript
// 1. 开始捕获早期输入
startCapturingEarlyInput()
// 2. 加载主模块
const { main: cliMain } = await import('../main.js')
// 3. 执行主函数
await cliMain()
1.8 Ablation Baseline
typescript
// Harness-science L0 ablation baseline
if (feature('ABLATION_BASELINE') && process.env.CLAUDE_CODE_ABLATION_BASELINE) {
for (const k of [
'CLAUDE_CODE_SIMPLE',
'CLAUDE_CODE_DISABLE_THINKING',
'DISABLE_INTERLEAVED_THINKING',
'DISABLE_COMPACT',
'DISABLE_AUTO_COMPACT',
'CLAUDE_CODE_DISABLE_AUTO_MEMORY',
'CLAUDE_CODE_DISABLE_BACKGROUND_TASKS'
]) {
process.env[k] ??= '1'
}
}
1.9 CCR 堆内存优化
typescript
if (process.env.CLAUDE_CODE_REMOTE === 'true') {
const existing = process.env.NODE_OPTIONS || ''
process.env.NODE_OPTIONS = existing
? `${existing} --max-old-space-size=8192`
: '--max-old-space-size=8192'
}
1.10 Corepack 禁用
typescript
process.env.COREPACK_ENABLE_AUTO_PIN = '0'
2. init.ts - 初始化模块
2.1 核心职责
init.ts 负责:
- 配置系统启用
- 遥测初始化
- 安全环境变量应用
- 全局 mTLS 和代理配置
- 清理钩子注册
2.2 初始化流程
typescript
export const init = memoize(async (): Promise<void> => {
// 1. enableConfigs()
// 2. applySafeConfigEnvironmentVariables()
// 3. applyExtraCACertsFromConfig()
// 4. setupGracefulShutdown()
// 5. initialize1PEventLogging()
// 6. populateOAuthAccountInfoIfNeeded()
// 7. initJetBrainsDetection()
// 8. detectCurrentRepository()
// 9. initializeRemoteManagedSettingsLoadingPromise()
// 10. configureGlobalMTLS()
// 11. configureGlobalAgents()
// 12. preconnectAnthropicApi()
// 13. initUpstreamProxy()
// 14. setShellIfWindows()
// 15. registerCleanup()
// 16. ensureScratchpadDir()
})
2.3 配置启用
typescript
enableConfigs()
功能:
- 加载用户配置 (
~/.claude/settings.json) - 加载项目配置 (
./.claude/settings.local.json) - 加载本地配置 (
./.claude/settings.json) - 验证配置 schema
2.4 安全环境变量
typescript
applySafeConfigEnvironmentVariables()
applyExtraCACertsFromConfig()
区别:
applySafeConfigEnvironmentVariables()- 仅应用安全变量(信任对话框之前)applyConfigEnvironmentVariables()- 应用完整环境变量(信任之后)
2.5 优雅退出
typescript
setupGracefulShutdown()
功能:
- 注册
SIGINT、SIGTERM处理器 - 确保会话数据写入完成
- 清理临时文件
2.6 一方事件日志
typescript
void Promise.all([
import('../services/analytics/firstPartyEventLogger.js'),
import('../services/analytics/growthbook.js'),
]).then(([fp, gb]) => {
fp.initialize1PEventLogging()
gb.onGrowthBookRefresh(() => {
void fp.reinitialize1PEventLoggingIfConfigChanged()
})
})
异步启动:
- 不阻塞主流程
- GrowthBook 刷新时重新配置
2.7 OAuth 账户信息
typescript
void populateOAuthAccountInfoIfNeeded()
功能:
- 从 Claude.ai 获取账户信息
- 缓存到本地配置
- VSCode 扩展登录时可能缺失
2.8 IDE 检测
typescript
void initJetBrainsDetection()
void detectCurrentRepository()
异步缓存填充:
- JetBrains IDE 运行状态检测
- GitHub repository 信息缓存
2.9 远程管理设置
typescript
if (isEligibleForRemoteManagedSettings()) {
initializeRemoteManagedSettingsLoadingPromise()
}
if (isPolicyLimitsEligible()) {
initializePolicyLimitsLoadingPromise()
}
超时保护:
- 包含超时机制防止死锁
- Agent SDK 测试环境可能不调用完整加载
2.10 mTLS 配置
typescript
configureGlobalMTLS()
功能:
- 设置客户端证书
- 配置 TLS 验证选项
2.11 HTTP 代理配置
typescript
configureGlobalAgents()
功能:
- 设置 HTTP/HTTPS 代理
- 配置自定义 CA 证书
2.12 API 预连接
typescript
preconnectAnthropicApi()
目的:
- 重叠 TCP+TLS 握手 (~100-200ms)
- 与初始化工作并行
- 减少首次 API 请求延迟
2.13 上游代理初始化
typescript
if (isEnvTruthy(process.env.CLAUDE_CODE_REMOTE)) {
const { initUpstreamProxy, getUpstreamProxyEnv } = await import('../upstreamproxy/upstreamproxy.js')
registerUpstreamProxyEnvFn(getUpstreamProxyEnv)
await initUpstreamProxy()
}
CCR 功能:
- 本地 CONNECT relay
- 凭据注入
- 子进程代理配置
2.14 清理钩子注册
typescript
registerCleanup(shutdownLspServerManager)
registerCleanup(async () => {
const { cleanupSessionTeams } = await import('../utils/swarm/teamHelpers.js')
await cleanupSessionTeams()
})
2.15 Scratchpad 目录
typescript
if (isScratchpadEnabled()) {
await ensureScratchpadDir()
}
3. agentSdkTypes.ts - SDK 类型定义
3.1 核心职责
导出公共 SDK API 类型:
sdk/coreTypes.ts- 可序列化类型sdk/runtimeTypes.ts- 运行时类型(回调、接口)sdk/controlTypes.ts- 控制协议类型
3.2 SDK 函数签名
query 函数
typescript
export function query(_params: {
prompt: string | AsyncIterable<SDKUserMessage>
options?: InternalOptions
}): InternalQuery
export function query(_params: {
prompt: string | AsyncIterable<SDKUserMessage>
options?: Options
}): Query
签名差异:
InternalOptions- 内部选项(包含敏感配置)Options- 公开选项(用户可见)
会话管理
typescript
// V2 API - UNSTABLE
export function unstable_v2_createSession(_options: SDKSessionOptions): SDKSession
export function unstable_v2_resumeSession(_sessionId: string, _options: SDKSessionOptions): SDKSession
export async function unstable_v2_prompt(_message: string, _options: SDKSessionOptions): Promise<SDKResultMessage>
会话信息查询
typescript
export async function getSessionMessages(_sessionId: string, _options?: GetSessionMessagesOptions): Promise<SessionMessage[]>
export async function listSessions(_options?: ListSessionsOptions): Promise<SDKSessionInfo[]>
export async function getSessionInfo(_sessionId: string, _options?: GetSessionInfoOptions): Promise<SDKSessionInfo | undefined>
export async function renameSession(_sessionId: string, _title: string, _options?: SessionMutationOptions): Promise<void>
export async function tagSession(_sessionId: string, _tag: string | null, _options?: SessionMutationOptions): Promise<void>
export async function forkSession(_sessionId: string, _options?: ForkSessionOptions): Promise<ForkSessionResult>
3.3 MCP Server 工具定义
typescript
export function tool<Schema extends AnyZodRawShape>(
_name: string,
_description: string,
_inputSchema: Schema,
_handler: (args: InferShape<Schema>, extra: unknown) => Promise<CallToolResult>,
_extras?: {
annotations?: ToolAnnotations
searchHint?: string
alwaysLoad?: boolean
},
): SdkMcpToolDefinition<Schema>
export function createSdkMcpServer(_options: CreateSdkMcpServerOptions): McpSdkServerConfigWithInstance
3.4 Daemon 相关类型
CronTask
typescript
export type CronTask = {
id: string
cron: string
prompt: string
createdAt: number
recurring?: boolean
}
CronJitterConfig
typescript
export type CronJitterConfig = {
recurringFrac: number
recurringCapMs: number
oneShotMaxMs: number
oneShotFloorMs: number
oneShotMinuteMod: number
recurringMaxAgeMs: number
}
ScheduledTaskEvent
typescript
export type ScheduledTaskEvent =
| { type: 'fire'; task: CronTask }
| { type: 'missed'; tasks: CronTask[] }
ScheduledTasksHandle
typescript
export type ScheduledTasksHandle = {
events(): AsyncGenerator<ScheduledTaskEvent>
getNextFireTime(): number | null
}
watchScheduledTasks
typescript
export function watchScheduledTasks(_opts: {
dir: string
signal: AbortSignal
getJitterConfig?: () => CronJitterConfig
}): ScheduledTasksHandle
3.5 Remote Control 类型
InboundPrompt
typescript
export type InboundPrompt = {
content: string | unknown[]
uuid?: string
}
ConnectRemoteControlOptions
typescript
export type ConnectRemoteControlOptions = {
dir: string
name?: string
workerType?: string
branch?: string
gitRepoUrl?: string | null
getAccessToken: () => string | undefined
baseUrl: string
orgUUID: string
model: string
}
RemoteControlHandle
typescript
export type RemoteControlHandle = {
sessionUrl: string
environmentId: string
bridgeSessionId: string
write(msg: SDKMessage): void
sendResult(): void
sendControlRequest(req: unknown): void
sendControlResponse(res: unknown): void
sendControlCancelRequest(requestId: string): void
inboundPrompts(): AsyncGenerator<InboundPrompt>
controlRequests(): AsyncGenerator<unknown>
permissionResponses(): AsyncGenerator<unknown>
onStateChange(cb: (state: 'ready' | 'connected' | 'reconnecting' | 'failed', detail?: string) => void): void
teardown(): Promise<void>
}
4. 设计模式总结
4.1 快速路径优先
- 版本检查:零导入
- 特殊命令:最小导入
- 主 CLI:完整导入
4.2 Feature Flags DCE
所有 feature() 检查在编译时进行死代码消除:
typescript
if (feature('BRIDGE_MODE')) {
// 仅在 bridge 构建中存在
}
4.3 异步初始化
typescript
void Promise.all([...]) // fire-and-forget
void populateOAuthAccountInfoIfNeeded() // 不阻塞
4.4 配置分层
- Safe env vars - 信任对话框之前
- Full env vars - 信任之后
- Remote settings - 远程管理覆盖
5. 性能优化点
5.1 预连接
typescript
preconnectAnthropicApi() // TCP+TLS 握手重叠
5.2 懒加载
typescript
const { main: cliMain } = await import('../main.js') // 仅在需要时加载
5.3 Memoize
typescript
export const init = memoize(async () => {...}) // 单次初始化
5.4 早期输入捕获
typescript
startCapturingEarlyInput() // 在模块加载期间捕获用户输入
6. 文件列表
| 文件 | 描述 |
|---|---|
cli.tsx |
命令行入口 |
init.ts |
初始化模块 |
agentSdkTypes.ts |
SDK 类型导出 |
sdk/coreTypes.ts |
核心类型 |
sdk/runtimeTypes.ts |
运行时类型 |
sdk/controlTypes.ts |
控制协议类型 |
sdk/toolTypes.ts |
工具类型 |
sdk/settingsTypes.generated.ts |
设置类型(生成) |
7. 依赖关系
bash
cli.tsx
├── utils/startupProfiler.js
├── utils/config.js
├── utils/process.js
├── utils/earlyInput.js
├── main.js
└── [动态导入各特殊模块]
init.ts
├── utils/config.js
├── utils/gracefulShutdown.js
├── utils/mtls.js
├── utils/proxy.js
├── utils/apiPreconnect.js
├── services/analytics/
└── upstreamproxy/
agentSdkTypes.ts
├── sdk/coreTypes.ts
├── sdk/runtimeTypes.ts
├── sdk/controlTypes.ts
└── @modelcontextprotocol/sdk
本模块分析完成