Skip to content

zggtws/cc-source

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

Claude Code 项目技术分析文档

分析日期: 2026-03-31 项目: Claude Code CLI 技术栈: TypeScript/Node.js/Bun 文档版本: 1.0


1. 项目整体与核心模块分析

1.1 项目概述

Claude Code 是一个基于终端的交互式 AI 编程助手 CLI 工具,运行在 Bun/Node.js 运行时上,深度集成 Anthropic Claude API,提供代码编辑、文件操作、终端执行、多智能体协作等功能。

1.2 核心功能模块

1.2.1 入口与初始化模块 (src/main.tsx, src/setup.ts)

职责: 应用程序启动、配置加载、会话初始化

关键组件:

  • main.tsx (804KB) - 主入口文件,负责 CLI 命令解析、会话设置、REPL 启动
  • setup.ts - 会话初始化逻辑,包括 UDS 通信、终端备份恢复、Git 工作区设置

启动流程:

CLI 参数解析 → 环境检查 (Node.js 版本) → 权限模式初始化 →
MDM/Keychain 预取 → 插件/技能加载 → UDS 通信服务器 →
终端备份恢复 → Git 工作区创建 → REPL 启动

核心代码位置:

  • src/main.tsx:1-200 - 导入与初始化
  • src/setup.ts:56-200 - setup 函数

1.2.2 工具系统模块 (src/Tool.ts, src/tools.ts, src/tools/*)

职责: 定义和管理所有可供 AI 调用的工具

工具类型:

工具类型 前缀 说明
local_bash b 本地 Bash 命令执行
local_agent a 本地子代理执行
remote_agent r 远程代理执行
in_process_teammate t 进程内协作者
local_workflow w 本地工作流
monitor_mcp m MCP 监控
dream d Dream 模式

核心工具列表:

  • AgentTool - 子代理管理
  • BashTool - Bash 命令执行
  • FileReadTool / FileEditTool / FileWriteTool - 文件操作
  • GlobTool / GrepTool - 文件搜索
  • WebFetchTool / WebSearchTool - 网络请求
  • TodoWriteTool / TaskCreateTool / TaskUpdateTool - 任务管理
  • SkillTool - 技能系统
  • ListMcpResourcesTool / ReadMcpResourceTool - MCP 资源
  • LSPTool - 语言服务器协议

工具定义接口 (src/Tool.ts:362-695):

export type Tool<Input, Output, Progress> = {
  name: string
  call(args, context, canUseTool, parentMessage, onProgress): Promise<ToolResult>
  description(input, options): Promise<string>
  inputSchema: ZodType
  outputSchema?: ZodType
  isConcurrencySafe(input): boolean
  isReadOnly(input): boolean
  isDestructive?(input): boolean
  checkPermissions(input, context): Promise<PermissionResult>
  validateInput?(input, context): Promise<ValidationResult>
  renderToolUseMessage(input, options): React.ReactNode
  renderToolResultMessage(content, options): React.ReactNode
  // ... 更多渲染和配置方法
}

1.2.3 查询引擎模块 (src/query.ts, src/QueryEngine.ts)

职责: 处理 AI API 请求、消息流、工具编排

核心功能:

  • 消息规范化与 API 请求构建
  • 流式响应处理
  • 工具调用编排 (src/services/tools/toolOrchestration.ts)
  • Token 预算管理 (src/query/tokenBudget.ts)
  • 自动压缩 (src/services/compact/autoCompact.ts)
  • 思考块处理

查询流程:

消息接收 → 上下文构建 → Token 检查 → API 请求 →
流式响应 → 工具调用 → 结果处理 → 消息更新

关键代码:

  • src/query.ts:181- QueryParams 和主查询循环
  • src/services/tools/toolOrchestration.ts - runTools 函数

1.2.4 命令系统模块 (src/commands.ts, src/commands/*)

职责: 用户可执行的 slash 命令 (/help, /config, /skills 等)

命令类型:

  • prompt - 扩展为文本提示
  • local - 本地执行产生文本输出
  • local-jsx - 渲染 Ink UI 组件

命令注册流程 (src/commands.ts:256-520):

const COMMANDS = memoize((): Command[] => [
  addDir, advisor, agents, branch, /* ... 80+ 内置命令 */
])

// 动态技能加载
async function getSkills(cwd): Promise<{
  skillDirCommands: Command[]
  pluginSkills: Command[]
  bundledSkills: Command[]
  builtinPluginSkills: Command[]
}>

核心命令分类:

类别 命令示例
会话管理 /session, /resume, /compact, /clear
配置 /config, /model, /theme, /permissions
工具 /mcp, /skills, /plugins, /hooks
调试 /debug-tool-call, /heapdump, /ant-trace
协作 /review, /pr_comments, /commit

1.2.5 状态管理模块 (src/state/AppState.tsx, src/state/Store.ts)

职责: 管理应用程序全局状态

AppState 核心字段:

interface AppState {
  messages: Message[]           // 对话消息历史
  tools: Tools                  // 可用工具
  mcp: {                        // MCP 配置
    tools: Command[]
    commands: Command[]
    resources: Record<string, ServerResource[]>
  }
  permissionContext: ToolPermissionContext
  tasks: Task[]                 // 任务列表
  // ... 更多状态字段
}

状态更新模式:

type SetAppState = (f: (prev: AppState) => AppState) => void

采用不可变更新模式,通过函数式更新确保状态一致性。


1.2.6 权限系统模块 (src/utils/permissions/)

职责: 工具调用权限控制

权限模式 (src/utils/permissions/PermissionMode.ts):

  • default - 默认模式
  • auto - 自动模式
  • bypass - 绕过模式

权限检查流程:

工具调用 → validateInput() → checkPermissions() →
deny rules 匹配 → 用户确认 (如需) → 执行

权限上下文 (src/Tool.ts:123-148):

export type ToolPermissionContext = {
  mode: PermissionMode
  additionalWorkingDirectories: Map<string, AdditionalWorkingDirectory>
  alwaysAllowRules: ToolPermissionRulesBySource
  alwaysDenyRules: ToolPermissionRulesBySource
  alwaysAskRules: ToolPermissionRulesBySource
  isBypassPermissionsModeAvailable: boolean
  isAutoModeAvailable?: boolean
}

1.2.7 MCP 集成模块 (src/services/mcp/)

职责: Model Context Protocol 服务器集成

核心功能:

  • MCP 服务器连接管理 (src/services/mcp/client.ts)
  • 资源配置 (src/services/mcp/config.ts)
  • 工具桥接 (src/services/mcp/types.ts)

MCP 工具类型:

interface MCPServerConnection {
  serverName: string
  status: 'connected' | 'disconnected' | 'error'
  tools: Tool[]
  resources: ServerResource[]
}

1.2.8 技能系统模块 (src/skills/, src/tools/SkillTool/)

职责: 可扩展的技能/插件机制

技能类型:

  • Bundled Skills - 内置技能
  • Directory Skills - /skills/ 目录加载
  • Plugin Skills - 插件提供
  • MCP Skills - MCP 服务器提供

技能加载流程 (src/commands.ts:353-398):

async function getSkills(cwd) {
  const skillDirCommands = await getSkillDirCommands(cwd)
  const pluginSkills = await getPluginSkills()
  const bundledSkills = getBundledSkills()
  const builtinPluginSkills = getBuiltinPluginSkillCommands()
  return { skillDirCommands, pluginSkills, bundledSkills, builtinPluginSkills }
}

1.2.9 终端 UI 模块 (src/ink/, src/components/)

职责: 终端界面渲染 (基于 Ink/React)

核心组件:

  • src/ink/renderer.ts - 渲染引擎
  • src/ink/layout/engine.ts - 布局引擎 (基于 Yoga)
  • src/ink/events/ - 事件处理 (键盘、鼠标、焦点)
  • src/components/ - UI 组件库

渲染流程:

React 组件 → Fiber 协调 → Yoga 布局 → 终端输出

1.2.10 分析与服务模块 (src/services/analytics/, src/services/api/)

职责: 遥测、API 通信、重试机制

核心服务:

  • src/services/analytics/ - 事件日志、GrowthBook 功能开关
  • src/services/api/ - API 客户端、重试逻辑、错误处理
  • src/services/compact/ - 上下文压缩
  • src/services/lsp/ - 语言服务器管理
  • src/services/plugins/ - 插件管理
  • src/services/policyLimits/ - 策略限制

1.3 模块依赖关系

┌─────────────────────────────────────────────────────────────┐
│                        main.tsx                             │
│  (入口:CLI 解析、初始化、REPL 启动)                              │
└─────────────────────────────────────────────────────────────┘
                              │
         ┌────────────────────┼────────────────────┐
         ▼                    ▼                    ▼
┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
│     setup.ts    │  │   commands.ts   │  │    tools.ts     │
│  (会话初始化)    │  │  (命令系统)      │  │   (工具集合)     │
└─────────────────┘  └─────────────────┘  └─────────────────┘
         │                    │                    │
         ▼                    ▼                    ▼
┌─────────────────────────────────────────────────────────────┐
│                      query.ts                                │
│              (AI 请求处理、工具编排、流式响应)                      │
└─────────────────────────────────────────────────────────────┘
                              │
         ┌────────────────────┼────────────────────┐
         ▼                    ▼                    ▼
┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
│  services/api/  │  │services/mcp/    │  │ services/compact│
│  (API 通信)      │  │  (MCP 集成)      │  │  (上下文压缩)    │
└─────────────────┘  └─────────────────┘  └─────────────────┘

2. 设计模式与架构风格分析

2.1 架构模式

2.1.1 命令查询职责分离 (CQRS 变体)

位置: src/query.ts vs src/commands.ts

  • 查询侧: query.ts 处理 AI 对话请求、工具调用
  • 命令侧: commands.ts 处理用户 slash 命令

优点:

  • 清晰的职责边界
  • 独立演进能力
  • 不同的权限和审计策略

2.1.2 工具模式 (Tool Pattern)

位置: src/Tool.ts, src/tools/*

这是项目的核心架构模式,所有功能都通过 Tool 接口暴露:

export type Tool = {
  call(args, context, canUseTool, parentMessage, onProgress): Promise<ToolResult>
  // ... 配置和渲染方法
}

实现分析:

  • 符合策略模式 - 每个工具是一种策略实现
  • 支持装饰器模式 - buildTool() 函数添加默认行为
  • 统一的权限检查接口 - checkPermissions()

代码示例 (src/Tool.ts:757-792):

const TOOL_DEFAULTS = {
  isEnabled: () => true,
  isConcurrencySafe: () => false,
  isReadOnly: () => false,
  checkPermissions: (input) => Promise.resolve({ behavior: 'allow', updatedInput: input }),
}

export function buildTool<D extends AnyToolDef>(def: D): BuiltTool<D> {
  return { ...TOOL_DEFAULTS, ...def }
}

2.1.3 不可变状态管理

位置: src/state/Store.ts, src/bootstrap/state.ts

模式:

type SetAppState = (f: (prev: AppState) => AppState) => void

优点:

  • 可预测的状态变更
  • 支持时间旅行调试
  • 安全的并发更新

2.1.4 依赖注入 (工具上下文)

位置: src/Tool.ts:158-300

export type ToolUseContext = {
  options: { commands, tools, mcpClients, ... }
  abortController: AbortController
  getAppState(): AppState
  setAppState(f: (prev) => prev): void
  readFileState: FileStateCache
  // ... 更多依赖
}

所有工具通过上下文获取依赖,而非直接导入。


2.1.5 观察者模式 (文件/设置监听)

位置:

  • src/utils/hooks/fileChangedWatcher.ts
  • src/utils/settings/changeDetector.ts
  • src/utils/skills/skillChangeDetector.ts

实现:

initializeFileChangedWatcher(cwd)  // 文件变更监听
settingsChangeDetector()           // 设置变更监听
skillChangeDetector()              // 技能变更监听

2.1.6 策略模式 (权限模式)

位置: src/utils/permissions/PermissionMode.ts

不同权限模式决定工具调用的审批流程:

  • default - 标准审批
  • auto - 自动审批 (有护栏)
  • bypass - 完全绕过

2.2 设计模式识别

模式 位置 说明
Builder src/Tool.ts:buildTool() 构建完整工具对象
Strategy src/tools/* 每个工具是一种策略
Decorator src/Tool.ts:TOOL_DEFAULTS 为工具添加默认行为
Singleton src/state/Store.ts 全局状态存储
Observer src/utils/hooks/ 文件/设置变更监听
Command src/commands.ts 用户命令封装
Template Method src/query.ts 查询循环模板
Factory src/tools/AgentTool/ 代理实例创建
Adapter src/services/mcp/ MCP 协议适配
Facade src/tools.ts 工具池组装

2.3 架构层级

┌─────────────────────────────────────────────────────────┐
│                    Presentation Layer                    │
│  src/main.tsx, src/ink/, src/components/ (终端 UI)        │
├─────────────────────────────────────────────────────────┤
│                    Application Layer                     │
│  src/commands.ts, src/tools/, src/query.ts (业务逻辑)    │
├─────────────────────────────────────────────────────────┤
│                    Domain Layer                          │
│  src/Tool.ts, src/Task.ts, src/types/ (领域模型)         │
├─────────────────────────────────────────────────────────┤
│                    Infrastructure Layer                  │
│  src/services/, src/utils/ (外部服务、工具函数)          │
└─────────────────────────────────────────────────────────┘

这是一个典型的 Clean Architecture 变体,依赖方向由外向内。


2.4 架构优点

  1. 高度模块化 - 工具、命令、服务职责清晰
  2. 可扩展性强 - 通过工具/技能/插件机制
  3. 类型安全 - TypeScript 严格模式 + Zod 验证
  4. 测试友好 - 依赖注入 + 接口抽象
  5. 功能开关 - GrowthBook 集成支持渐进发布

2.5 潜在问题

  1. 循环依赖风险 - 多处使用 require() 懒加载打破循环
  2. 条件编译复杂 - feature() 标志遍布代码库
  3. 大文件问题 - main.tsx (804KB)、query.ts (69KB)
  4. 隐式耦合 - 部分模块依赖全局状态 (AppState)

3. 可视化图表

3.1 系统架构图

graph TB
    subgraph "终端用户界面层"
        CLI[CLI 入口 main.tsx]
        REPL[REPL 交互]
        InkUI[Iink React 组件]
    end

    subgraph "应用服务层"
        Commands[命令系统 commands.ts]
        Tools[工具系统 tools.ts]
        Query[查询引擎 query.ts]
        State[状态管理 AppState]
    end

    subgraph "核心工具层"
        AgentTool[AgentTool]
        BashTool[BashTool]
        FileTools[FileRead/Edit/Write]
        SkillTool[SkillTool]
        TaskTools[TaskCreate/Update/List]
    end

    subgraph "基础设施服务"
        API[Anthropic API]
        MCP[MCP Servers]
        LSP[LSP Servers]
        Hooks[Hooks 系统]
        Analytics[Analytics]
    end

    subgraph "外部依赖"
        Git[Git]
        FS[文件系统]
        Shell[Bash/Shell]
        Network[网络]
    end

    CLI --> REPL
    REPL --> InkUI
    REPL --> Commands
    REPL --> Query

    Commands --> Tools
    Query --> Tools

    Tools --> AgentTool
    Tools --> BashTool
    Tools --> FileTools
    Tools --> SkillTool
    Tools --> TaskTools

    AgentTool --> Query
    BashTool --> Shell
    FileTools --> FS
    SkillTool --> Hooks

    Query --> API
    Tools --> MCP
    Tools --> LSP

    State -.-> Commands
    State -.-> Query
    State -.-> Tools

    Hooks --> FS
    Analytics --> API
Loading

3.2 核心业务流程图 - 工具调用流程

sequenceDiagram
    participant AI as Claude AI
    participant Query as Query Engine
    participant Tool as Tool System
    participant Perm as Permission System
    participant Exec as Tool Executor
    participant State as AppState

    AI->>Query: 流式响应含 tool_use
    Query->>Tool: 解析 tool_use 块
    Tool->>Tool: validateInput()
    alt 验证失败
        Tool-->>Query: 返回错误
        Query-->>AI: 错误消息
    else 验证通过
        Tool->>Perm: checkPermissions()
        Perm->>Perm: 匹配 deny rules
        alt 被拒绝
            Perm-->>Tool: 拒绝
            Tool-->>Query: 权限错误
        else 需要确认
            Perm->>State: 触发权限对话框
            State-->>AI: 等待用户确认
            alt 用户确认
                State-->>Perm: 确认
            else 用户拒绝
                State-->>Perm: 拒绝
            end
        else 自动允许
            Perm-->>Tool: 允许
        end

        Tool->>Exec: 执行工具
        Exec->>Exec: 调用实际实现
        Exec-->>Tool: 工具结果
        Tool->>State: 更新状态
        State-->>Query: 新消息
        Query->>AI: 发送 tool_result
    end
Loading

3.3 查询循环流程图

flowchart TD
    Start[开始查询] --> BuildConfig[构建查询配置]
    BuildConfig --> CheckBudget[检查 Token 预算]
    CheckBudget -->|超出预算 | BudgetError[预算错误]
    CheckBudget -->|正常 | SendRequest[发送 API 请求]

    SendRequest --> StreamLoop{流式循环}
    StreamLoop -->|thinking 块 | HandleThinking[处理思考]
    StreamLoop -->|tool_use | HandleTool[处理工具调用]
    StreamLoop -->|text 内容 | HandleText[处理文本]
    StreamLoop -->|error | HandleError[处理错误]
    StreamLoop -->|done | EndLoop{循环结束}

    HandleTool --> RunTools[执行 runTools]
    RunTools --> CollectResults[收集结果]
    CollectResults --> ContinueLoop[继续循环]

    HandleThinking --> ContinueLoop
    HandleText --> ContinueLoop

    EndLoop -->|需要继续 | SendRequest
    EndLoop -->|完成 | Finalize[完成查询]

    HandleError -->|max_output_tokens | RetryWithRecovery[恢复重试]
    HandleError -->|其他错误 | ReportError[报告错误]

    RetryWithRecovery --> SendRequest
Loading

4. 二次开发与架构优化建议

4.1 建议一:重构大模块,提升可维护性

目标模块: src/main.tsx (804KB), src/query.ts (69KB)

当前问题:

  • 单文件过大,难以理解和维护
  • 隐式耦合多,测试困难
  • 新人上手成本高

实施方案:

  1. main.tsx 拆分为多个子模块:

    • main.cli.ts - CLI 参数解析
    • main.session.ts - 会话管理
    • main.repl.ts - REPL 启动
    • main.dialogs.ts - 对话框启动器
  2. query.ts 拆分:

    • query.loop.ts - 主循环
    • query.budget.ts - Token 预算 (已有部分)
    • query.compact.ts - 压缩逻辑
    • query.hooks.ts - Hook 处理 (已有部分)

预期收益:

  • 可维护性提升 50%+
  • 代码审查效率提升
  • 并行开发更容易

风险与成本:

  • 需要仔细处理导入路径
  • 可能需要 2-3 天重构时间
  • 需要全面回归测试

4.2 建议二:引入领域事件总线,解耦状态更新

目标区域: src/state/, src/tools/, src/query/

当前问题:

  • 工具直接调用 setAppState() 更新状态
  • 状态变更逻辑分散在各处
  • 难以追踪状态变更来源

实施方案:

引入领域事件总线:

// 新增 src/domain/events.ts
export type DomainEvent =
  | { type: 'TOOL_CALLED'; toolName: string; input: unknown }
  | { type: 'TOOL_COMPLETED'; toolName: string; result: unknown }
  | { type: 'MESSAGE_ADDED'; message: Message }
  | { type: 'TASK_CREATED'; taskId: string }
  // ...

export type EventHandler = (event: DomainEvent) => void

export class EventBus {
  private handlers: Map<string, EventHandler[]> = new Map()

  subscribe(type: string, handler: EventHandler): () => void
  publish(event: DomainEvent): void
}

状态更新集中化:

// 新增 src/state/reducer.ts
export function appStateReducer(
  state: AppState,
  event: DomainEvent
): AppState {
  switch (event.type) {
    case 'MESSAGE_ADDED':
      return { ...state, messages: [...state.messages, event.message] }
    case 'TASK_CREATED':
      return { ...state, tasks: [...state.tasks, event.task] }
    // ...
  }
}

预期收益:

  • 状态变更可追溯
  • 支持事件回放调试
  • 更容易添加副作用处理

风险与成本:

  • 需要迁移现有 setAppState 调用
  • 约 1-2 周迁移时间
  • 需要事件schema 版本管理

4.3 建议三:增强工具编排的可观测性

目标区域: src/services/tools/toolOrchestration.ts

当前问题:

  • 工具调用链路不透明
  • 性能瓶颈难以定位
  • 调试复杂工具交互困难

实施方案:

添加结构化日志:

// 新增 src/utils/observability/toolTracing.ts
export function traceToolCall<T>(
  toolName: string,
  input: unknown,
  fn: () => Promise<T>
): Promise<T> {
  const span = startSpan({
    name: `tool:${toolName}`,
    attributes: { input: sanitize(input) }
  })

  try {
    const result = await fn()
    span.end({ status: 'ok', result: sanitize(result) })
    return result
  } catch (error) {
    span.end({ status: 'error', error })
    throw error
  }
}

添加性能指标:

// 新增 src/utils/observability/metrics.ts
export interface ToolMetrics {
  toolName: string
  callCount: number
  avgDurationMs: number
  p95DurationMs: number
  errorRate: number
}

export function recordToolMetric(toolName: string, durationMs: number, success: boolean)
export function getToolMetrics(): Map<string, ToolMetrics>

预期收益:

  • 工具性能可视化
  • 快速定位慢工具
  • 支持容量规划

风险与成本:

  • 额外性能开销 (<5%)
  • 需要指标存储和展示
  • 约 3-5 天实施

4.4 建议四:统一错误处理策略

目标区域: 全局

当前问题:

  • 错误处理不一致 (throw vs return vs log)
  • 错误消息对用户不友好
  • 错误恢复策略分散

实施方案:

定义统一错误类型:

// 新增 src/errors/AppError.ts
export abstract class AppError extends Error {
  abstract readonly code: string
  abstract readonly severity: 'low' | 'medium' | 'high' | 'critical'
  abstract readonly userMessage: string
  readonly context?: Record<string, unknown>

  constructor(message: string, context?: Record<string, unknown>) {
    super(message)
    this.context = context
  }
}

export class ToolExecutionError extends AppError {
  readonly code = 'TOOL_EXECUTION_ERROR'
  readonly severity = 'medium'
  readonly userMessage = '工具执行失败,请检查输入或重试'
}

export class PermissionDeniedError extends AppError {
  readonly code = 'PERMISSION_DENIED'
  readonly severity = 'low'
  readonly userMessage = '操作被拒绝:权限不足'
}

统一错误边界:

// 新增 src/errors/ErrorBoundary.tsx
export function withErrorBoundary<T>(
  fn: () => Promise<T>,
  handler: (error: AppError) => T
): Promise<T>

预期收益:

  • 一致的用户体验
  • 更容易添加错误恢复
  • 支持错误分析和告警

5. 项目目录结构解析

5.1 目录树

claude-code/
├── src/                          # 核心源代码
│   ├── main.tsx                  # 主入口 (804KB)
│   ├── setup.ts                  # 会话初始化
│   ├── query.ts                  # AI 查询引擎 (69KB)
│   ├── QueryEngine.ts            # 查询引擎类 (47KB)
│   ├── commands.ts               # 命令系统 (25KB)
│   ├── tools.ts                  # 工具集合 (17KB)
│   ├── Tool.ts                   # 工具类型定义 (29KB)
│   ├── Task.ts                   # 任务类型定义
│   ├── context.ts                # 上下文获取 (Git, CLAUDE.md)
│   ├── history.ts                # 会话历史
│   ├── replLauncher.tsx          # REPL 启动器
│   │
│   ├── assistant/                # 助手模式
│   ├── bootstrap/                # 启动状态管理
│   ├── bridge/                   # 桥接模式 (远程会话)
│   ├── buddy/                    # Buddy 功能
│   ├── cli/                      # CLI 子命令
│   │   ├── handlers/             # 命令处理器
│   │   └── transports/           # 传输层 (SSE, WebSocket)
│   │
│   ├── commands/                 # Slash 命令实现
│   │   ├── add-dir/              # /add-dir
│   │   ├── agents/               # /agents
│   │   ├── config/               # /config
│   │   ├── mcp/                  # /mcp
│   │   ├── permissions/          # /permissions
│   │   ├── skills/               # /skills
│   │   └── ... (80+ 命令目录)
│   │
│   ├── components/               # React 组件
│   │   ├── CustomSelect/         # 自定义选择器
│   │   └── design-system/        # 设计系统
│   │
│   ├── constants/                # 常量定义
│   │   ├── apiLimits.ts          # API 限制
│   │   ├── tools.ts              # 工具常量
│   │   └── ...
│   │
│   ├── coordinator/              # 协调器模式
│   ├── entrypoints/              # 入口点类型
│   ├── hooks/                    # React Hooks
│   │   ├── toolPermission/       # 权限 Hooks
│   │   └── ...
│   │
│   ├── ink/                      # 终端 UI 引擎
│   │   ├── components/           # Ink 组件
│   │   ├── events/               # 事件系统
│   │   ├── hooks/                # Ink Hooks
│   │   ├── layout/               # 布局引擎 (Yoga)
│   │   └── ...
│   │
│   ├── keybindings/              # 键盘绑定
│   ├── memdir/                   # 记忆目录
│   ├── migrations/               # 数据迁移
│   ├── moreright/                # (内部模块)
│   ├── native-ts/                # 原生 TypeScript 绑定
│   ├── outputStyles/             # 输出样式
│   ├── plugins/                  # 插件系统
│   ├── query/                    # 查询子模块
│   │   ├── config.ts             # 查询配置
│   │   ├── deps.ts               # 查询依赖
│   │   ├── stopHooks.ts          # 停止 Hooks
│   │   ├── tokenBudget.ts        # Token 预算
│   │   └── transitions.ts        # 状态转换
│   │
│   ├── remote/                   # 远程会话
│   ├── screens/                  # 屏幕管理
│   ├── schemas/                  # Zod schemas
│   ├── server/                   # 服务器功能
│   ├── services/                 # 基础设施服务
│   │   ├── analytics/            # 分析服务
│   │   ├── api/                  # API 客户端
│   │   ├── compact/              # 上下文压缩
│   │   ├── lsp/                  # LSP 管理
│   │   ├── mcp/                  # MCP 集成
│   │   ├── plugins/              # 插件管理
│   │   ├── policyLimits/         # 策略限制
│   │   ├── remoteManagedSettings/ # 远程设置
│   │   ├── SessionMemory/        # 会话记忆
│   │   ├── tips/                 # 提示系统
│   │   └── tools/                # 工具服务
│   │       ├── StreamingToolExecutor.ts
│   │       └── toolOrchestration.ts
│   │
│   ├── skills/                   # 技能系统
│   │   ├── bundled/              # 内置技能
│   │   └── loadSkillsDir.ts      # 技能加载
│   │
│   ├── state/                    # 状态管理
│   │   ├── AppState.tsx          # 状态定义
│   │   ├── AppStateStore.ts      # 状态存储
│   │   ├── onChangeAppState.ts   # 状态变更监听
│   │   └── Store.ts              # Store 实现
│   │
│   ├── tasks/                    # 任务功能
│   ├── tools/                    # 工具实现
│   │   ├── AgentTool/            # 代理工具
│   │   ├── BashTool/             # Bash 工具
│   │   ├── FileEditTool/         # 文件编辑
│   │   ├── FileReadTool/         # 文件读取
│   │   ├── FileWriteTool/        # 文件写入
│   │   ├── SkillTool/            # 技能工具
│   │   ├── TaskCreateTool/       # 任务创建
│   │   ├── TodoWriteTool/        # TODO 工具
│   │   ├── WebFetchTool/         # 网页抓取
│   │   ├── WebSearchTool/        # 网络搜索
│   │   └── ... (40+ 工具目录)
│   │
│   ├── types/                    # TypeScript 类型
│   │   ├── command.ts            # 命令类型
│   │   ├── message.ts            # 消息类型
│   │   ├── permissions.ts        # 权限类型
│   │   ├── tools.ts              # 工具类型
│   │   └── ...
│   │
│   ├── upstreamproxy/            # 上游代理
│   ├── utils/                    # 工具函数库
│   │   ├── permissions/          # 权限工具
│   │   ├── settings/             # 设置工具
│   │   ├── model/                # 模型工具
│   │   ├── plugins/              # 插件工具
│   │   ├── hooks/                # Hooks 工具
│   │   ├── swarm/                # 集群工具
│   │   └── ... (100+ 工具文件)
│   │
│   ├── vim/                      # Vim 模式
│   └── voice/                    # 语音功能
│
└── src.zip                       # 源码压缩包

5.2 关键目录说明

目录 职责 核心文件
src/ 核心业务代码 main.tsx, query.ts, commands.ts
src/tools/ 工具实现 40+ 工具目录
src/commands/ Slash 命令 80+ 命令目录
src/services/ 基础设施 API, MCP, LSP, Analytics
src/state/ 状态管理 AppState, Store
src/ink/ 终端 UI 渲染引擎、布局、事件
src/utils/ 工具函数 100+ 工具文件

6. 新开发者实战入门指南

6.1 环境搭建

6.1.1 软件要求

软件 最低版本 推荐版本
Node.js 18.x 20.x LTS
Bun 1.0.x 最新稳定版
Git 2.x 最新

6.1.2 依赖安装

# 克隆仓库
git clone <repository-url>
cd claude-code

# 安装依赖 (使用 Bun)
bun install

# 或者使用 npm
npm install

6.1.3 环境变量配置

创建 .env 文件或设置环境变量:

# API 密钥
export ANTHROPIC_API_KEY="your-api-key"

# 可选:调试模式
export NODE_ENV=development
export DEBUG=true

# 可选:功能开关
export CLAUDE_CODE_SIMPLE=true  # 简单模式

6.2 从 0 到运行

6.2.1 克隆代码

git clone <repository-url>
cd claude-code

6.2.2 安装依赖

bun install

6.2.3 启动项目

开发模式:

bun run dev

生产模式:

bun run start

带参数运行:

bun run start --help
bun run start --verbose
bun run start --model claude-sonnet-4-6

6.3 最小改动示例 (Hello World)

6.3.1 新增一个简单的 Slash 命令

目标: 添加 /hello 命令,输出 "Hello, World!"

步骤 1: 创建命令文件

mkdir -p src/commands/hello
touch src/commands/hello/index.ts

步骤 2: 编写命令实现

// src/commands/hello/index.ts
import type { Command } from '../../types/command.js'

const helloCommand: Command = {
  type: 'prompt',
  name: 'hello',
  description: '输出 Hello, World!',
  source: 'builtin',
  contentLength: 0,
  async getPromptForCommand() {
    return 'Hello, World! 这是一个测试命令。'
  }
}

export default helloCommand

步骤 3: 注册命令

编辑 src/commands.ts, 在导入区域添加:

import hello from './commands/hello/index.js'

COMMANDS() 数组中添加:

const COMMANDS = memoize((): Command[] => [
  addDir,
  advisor,
  // ... 其他命令
  hello,  // 新增
])

步骤 4: 运行验证

bun run start
# 在 REPL 中输入 /hello

6.3.2 新增一个简单的工具

目标: 添加 HelloTool, 返回问候语

步骤 1: 创建工具文件

mkdir -p src/tools/HelloTool
touch src/tools/HelloTool/HelloTool.ts

步骤 2: 编写工具实现

// src/tools/HelloTool/HelloTool.ts
import { z } from 'zod/v4'
import { buildTool } from '../Tool.js'

const inputSchema = z.object({
  name: z.string().describe('要问候的名字')
})

export const HelloTool = buildTool({
  name: 'HelloTool',
  description: '向某人问好',
  inputSchema,
  call: async (args) => {
    return {
      data: `Hello, ${args.name}!`
    }
  },
  isConcurrencySafe: () => true,
  isReadOnly: () => true,
})

步骤 3: 注册工具

编辑 src/tools.ts, 在导入区域添加:

import { HelloTool } from './tools/HelloTool/HelloTool.js'

getAllBaseTools() 数组中添加:

export function getAllBaseTools(): Tools {
  return [
    AgentTool,
    // ... 其他工具
    HelloTool,  // 新增
  ]
}

步骤 4: 运行验证

bun run start
# 让 AI 调用 HelloTool

6.4 调试技巧

6.4.1 启用调试日志

export DEBUG=true
export NODE_ENV=development
bun run start

6.4.2 查看日志文件

日志文件位于:

  • macOS: ~/Library/Logs/Claude Code/
  • Windows: %APPDATA%\Claude Code\logs\
  • Linux: ~/.config/Claude Code/logs/

6.4.3 使用 REPL 调试

# 进入 REPL
bun run start

# 使用内部命令
/debug-tool-call   # 调试工具调用
/ant-trace         # 查看追踪
/heapdump          # 内存快照

6.5 代码规范

6.5.1 代码格式化

# 使用 Biome 格式化
bun run format

# 使用 ESLint 检查
bun run lint

6.5.2 类型检查

bun run typecheck

6.5.3 测试

# 运行所有测试
bun test

# 运行特定测试
bun test src/tools/BashTool

附录

A. 关键配置文件

文件 说明
package.json 项目配置、依赖、脚本
tsconfig.json TypeScript 配置
bunfig.toml Bun 配置
.claude/settings.json Claude Code 用户设置

B. 常用命令

命令 说明
/help 显示帮助
/config 查看配置
/skills 列出技能
/model 切换模型
/compact 压缩上下文
/clear 清空屏幕

C. 资源链接


文档结束

About

cc-source

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • TypeScript 100.0%