Skip to content

logangan/claude-code-learning-pure

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 

Repository files navigation

Claude Code 源码学习 - Harness工程化探讨

本项目是对 Claude Code 源代码的深度分析与工程化学习,旨在探讨现代AI辅助编程工具的架构设计、模块化工程实践以及大型TypeScript项目的技术实现。


项目概述

Claude Code 是 Anthropic 开发的命令行AI编程助手,通过终端与Claude大模型交互,执行软件工程任务如文件编辑、命令执行、代码搜索和工作流协调。

核心特点:

  • 运行时: Bun (高性能JavaScript运行时)
  • 语言: TypeScript (严格模式)
  • 终端UI: React + Ink (React命令行渲染库)
  • 规模: ~1,900个文件,512,000+行代码
  • 架构: 模块化、插件化、多代理协调

目录结构深度解析

src/
├── main.tsx                    # 应用入口 - Commander.js CLI解析 + React/Ink渲染器初始化
├── commands.ts                 # 命令注册中心 - 管理所有斜杠命令的注册与执行
├── Tool.ts                     # 工具类型定义 - 所有工具的基类接口和权限模型
├── QueryEngine.ts              # LLM查询引擎 - 流式响应、工具调用循环、思考模式
├── context.ts                  # 系统/用户上下文收集
├── cost-tracker.ts             # Token成本追踪
│
├── commands/                   # 斜杠命令实现 (~50个命令)
│   ├── add-dir/               # 添加目录到上下文
│   ├── agents/                # 代理管理
│   ├── bash/                  # Bash命令执行
│   ├── branch/                # Git分支操作
│   ├── bridge/                # IDE桥接
│   ├── clear/                 # 清除缓存/屏幕
│   ├── compact/               # 上下文压缩
│   ├── config/                # 配置管理
│   ├── cost/                  # 成本查询
│   ├── diff/                  # 差异查看
│   ├── doctor/                # 环境诊断
│   ├── exit/                  # 退出流程
│   ├── files/                 # 文件管理
│   ├── help/                  # 帮助系统
│   ├── init.ts                # 项目初始化
│   ├── login/                 # 认证登录
│   ├── logout/                # 登出
│   ├── memory/                # 持久化内存
│   ├── mcp/                   # MCP服务器管理
│   ├── model/                 # 模型切换
│   ├── permissions/           # 权限管理
│   ├── plan/                  # 计划模式
│   ├── plugins/               # 插件管理
│   ├── resume/                # 会话恢复
│   ├── review.ts              # 代码审查
│   ├── skills/                # 技能管理
│   ├── tasks/                 # 任务管理
│   ├── theme/                 # 主题切换
│   ├── usage/                 # 使用量统计
│   └── vim/                   # Vim模式
│
├── tools/                      # 代理工具实现 (~40个工具)
│   ├── AgentTool/             # 子代理创建与管理
│   ├── BashTool/              # Shell命令执行
│   ├── FileReadTool/          # 文件读取
│   ├── FileEditTool/          # 文件编辑
│   ├── FileWriteTool/         # 文件写入
│   ├── GlobTool/              # 文件模式匹配
│   ├── GrepTool/              # 代码搜索(ripgrep)
│   ├── LSPTool/               # LSP集成
│   ├── MCPTool/               # MCP工具调用
│   ├── NotebookEditTool/      # Jupyter笔记本编辑
│   ├── TaskCreateTool/        # 任务创建
│   ├── TeamCreateTool/        # 团队代理创建
│   ├── WebFetchTool/          # URL内容获取
│   ├── WebSearchTool/         # 网络搜索
│   └── ...
│
├── components/                 # Ink UI组件 (~140个组件)
│   ├── App.tsx                # 主应用组件
│   ├── Message.tsx            # 消息渲染
│   ├── Messages.tsx           # 消息列表
│   ├── TextInput.tsx          # 文本输入
│   ├── Spinner.tsx            # 加载动画
│   ├── StatusLine.tsx         # 状态栏
│   ├── TaskListV2.tsx         # 任务列表
│   ├── agents/                # 代理相关组件
│   ├── design-system/         # 设计系统组件
│   ├── tasks/                 # 任务相关组件
│   └── wizard/                # 向导组件
│
├── hooks/                      # React Hooks
│   ├── useCanUseTool.tsx      # 工具权限检查
│   ├── useCommandQueue.ts     # 命令队列管理
│   ├── useSettings.ts         # 设置管理
│   ├── useTasksV2.ts          # 任务状态管理
│   └── ...
│
├── services/                   # 外部服务集成
│   ├── api/                   # Anthropic API客户端
│   ├── analytics/             # GrowthBook特性开关
│   ├── lsp/                   # LSP管理器
│   ├── mcp/                   # MCP服务器连接
│   ├── oauth/                 # OAuth 2.0认证
│   └── compact/               # 对话压缩
│
├── bridge/                     # IDE桥接系统
│   ├── bridgeMain.ts          # 桥接主循环
│   ├── bridgeMessaging.ts     # 消息协议
│   ├── bridgePermissionCallbacks.ts # 权限回调
│   ├── replBridge.ts          # REPL会话桥接
│   └── jwtUtils.ts            # JWT认证
│
├── coordinator/                # 多代理协调器
├── plugins/                    # 插件系统
├── skills/                     # 技能系统
├── keybindings/                # 快捷键配置
├── vim/                        # Vim模式实现
├── voice/                      # 语音输入
├── remote/                     # 远程会话
├── server/                     # 服务器模式
├── memdir/                     # 持久化内存目录
├── tasks/                      # 任务管理
├── state/                      # 状态管理
├── migrations/                 # 配置迁移
├── schemas/                    # Zod配置模式
├── entrypoints/                # 初始化逻辑
├── ink/                        # Ink渲染器包装
├── buddy/                      # 伴侣精灵
├── utils/                      # 工具函数库
└── constants/                  # 常量定义

核心模块深度解析

1. QueryEngine.ts - LLM查询引擎 (~46K行)

核心职责:

  • 管理LLM API调用的完整生命周期
  • 处理流式响应和工具调用循环
  • 实现思考模式(Thinking Mode)
  • 重试逻辑和token计数
  • 会话状态持久化

关键类与方法:

// QueryEngine 类定义
export class QueryEngine {
  private config: QueryEngineConfig
  private mutableMessages: Message[]
  private abortController: AbortController
  private permissionDenials: SDKPermissionDenial[]
  private totalUsage: NonNullableUsage
  
  // 核心方法
  async *submitMessage(
    prompt: string | ContentBlockParam[],
    options?: { uuid?: string; isMeta?: boolean }
  ): AsyncGenerator<SDKMessage, void, unknown>
  
  interrupt(): void
  getMessages(): readonly Message[]
  getReadFileState(): FileStateCache
  setModel(model: string): void
}

// 便捷包装函数
export async function* ask({
  commands,
  prompt,
  cwd,
  tools,
  mcpClients,
  canUseTool,
  getAppState,
  setAppState,
  // ... 更多参数
}): AsyncGenerator<SDKMessage, void, unknown>

架构亮点:

  1. 生成器模式: 使用 AsyncGenerator 实现流式响应,支持实时UI更新
  2. 状态管理: 维护 mutableMessages 数组追踪对话历史
  3. 权限追踪: wrappedCanUseTool 包装器记录所有权限拒绝
  4. 预算控制: 支持 maxTurnsmaxBudgetUsd 限制
  5. 结构化输出: 通过 jsonSchema 参数支持结构化输出

消息处理流程:

用户输入 → processUserInput() → 构建系统提示 → query() → 
流式处理消息 → 工具调用循环 → 结果生成

2. Tool.ts - 工具类型定义 (~29K行)

核心职责:

  • 定义所有工具的基类接口
  • 输入模式(Input Schema)定义
  • 权限模型和进度状态类型
  • 工具构建器函数

核心类型定义:

// 工具类型定义
export type Tool<
  Input extends AnyObject = AnyObject,
  Output = unknown,
  P extends ToolProgressData = ToolProgressData,
> = {
  // 基础属性
  name: string
  aliases?: string[]
  searchHint?: string
  
  // 核心方法
  call(
    args: z.infer<Input>,
    context: ToolUseContext,
    canUseTool: CanUseToolFn,
    parentMessage: AssistantMessage,
    onProgress?: ToolCallProgress<P>,
  ): Promise<ToolResult<Output>>
  
  // 描述和提示
  description(
    input: z.infer<Input>,
    options: {
      isNonInteractiveSession: boolean
      toolPermissionContext: ToolPermissionContext
      tools: Tools
    },
  ): Promise<string>
  
  prompt(options: {
    getToolPermissionContext: () => Promise<ToolPermissionContext>
    tools: Tools
    agents: AgentDefinition[]
    allowedAgentTypes?: string[]
  }): Promise<string>
  
  // Schema定义
  readonly inputSchema: Input
  readonly inputJSONSchema?: ToolInputJSONSchema
  outputSchema?: z.ZodType<unknown>
  
  // 行为特性
  isConcurrencySafe(input: z.infer<Input>): boolean
  isReadOnly(input: z.infer<Input>): boolean
  isDestructive?(input: z.infer<Input>): boolean
  interruptBehavior?(): 'cancel' | 'block'
  
  // 权限检查
  checkPermissions(
    input: z.infer<Input>,
    context: ToolUseContext,
  ): Promise<PermissionResult>
  validateInput?(
    input: z.infer<Input>,
    context: ToolUseContext,
  ): Promise<ValidationResult>
  
  // UI渲染方法
  renderToolUseMessage(
    input: Partial<z.infer<Input>>,
    options: { theme: ThemeName; verbose: boolean; commands?: Command[] },
  ): React.ReactNode
  
  renderToolResultMessage?(
    content: Output,
    progressMessagesForMessage: ProgressMessage<P>[],
    options: {
      style?: 'condensed'
      theme: ThemeName
      tools: Tools
      verbose: boolean
      isTranscriptMode?: boolean
      isBriefOnly?: boolean
      input?: unknown
    },
  ): React.ReactNode
  
  // 其他方法...
  userFacingName(input: Partial<z.infer<Input>> | undefined): string
  getActivityDescription?(input: Partial<z.infer<Input>> | undefined): string | null
  toAutoClassifierInput(input: z.infer<Input>): unknown
  mapToolResultToToolResultBlockParam(
    content: Output,
    toolUseID: string,
  ): ToolResultBlockParam
}

// 工具构建器
export function buildTool<D extends AnyToolDef>(def: D): BuiltTool<D>

// 工具集合类型
export type Tools = readonly Tool[]

工具构建模式:

// 使用 buildTool 创建工具
const MyTool = buildTool({
  name: 'MyTool',
  inputSchema: z.object({
    path: z.string(),
    content: z.string(),
  }),
  
  async call(args, context, canUseTool, parentMessage, onProgress) {
    // 执行逻辑
    return { data: result }
  },
  
  async description(input, options) {
    return `操作文件: ${input.path}`
  },
  
  async prompt(options) {
    return '工具使用说明...'
  },
  
  isConcurrencySafe: () => true,
  isReadOnly: (input) => false,
  
  renderToolUseMessage(input, options) {
    return <Text>读取 {input.path}</Text>
  },
  
  // ... 更多方法
})

默认行为:

const TOOL_DEFAULTS = {
  isEnabled: () => true,
  isConcurrencySafe: () => false,  // 默认不安全,需显式声明
  isReadOnly: () => false,          // 默认非只读
  isDestructive: () => false,
  checkPermissions: async (input) => ({ behavior: 'allow', updatedInput: input }),
  toAutoClassifierInput: () => '',
  userFacingName: () => '',
}

3. commands.ts - 命令注册中心 (~25K行)

核心职责:

  • 管理所有斜杠命令的注册与执行
  • 使用条件导入按环境加载不同命令集
  • 支持动态技能发现
  • 命令可用性过滤

命令类型定义:

// 命令基础接口
export type Command =
  | PromptCommand      // 提示型命令(发送给模型)
  | LocalCommand       // 本地命令(立即执行)
  | LocalJSXCommand    // 本地JSX命令(渲染UI)

export type CommandBase = {
  name: string
  description: string
  aliases?: string[]
  source: 'builtin' | 'plugin' | 'skills' | 'mcp' | 'bundled'
  availability?: Array<'claude-ai' | 'console'>
  isEnabled?(): boolean
}

// 提示型命令 - 展开为提示文本发送给模型
export type PromptCommand = CommandBase & {
  type: 'prompt'
  kind?: 'skill' | 'workflow'
  contentLength?: number
  progressMessage?: string
  getPromptForCommand(
    args: string[],
    context: { getAppState(): AppState }
  ): Promise<string> | string
}

// 本地命令 - 立即执行,不发送给模型
export type LocalCommand = CommandBase & {
  type: 'local'
  execute(args: string[]): Promise<string> | string
}

// 本地JSX命令 - 渲染Ink UI组件
export type LocalJSXCommand = CommandBase & {
  type: 'local-jsx'
  execute(args: string[], context: LocalJSXCommandContext): React.ReactNode
}

命令注册与加载:

// 核心命令列表
const COMMANDS = memoize((): Command[] => [
  addDir,
  advisor,
  agents,
  branch,
  btw,
  chrome,
  clear,
  color,
  compact,
  config,
  // ... 更多命令
])

// 条件导入(死代码消除)
const proactive = feature('PROACTIVE') || feature('KAIROS')
  ? require('./commands/proactive.js').default
  : null

const voiceCommand = feature('VOICE_MODE')
  ? require('./commands/voice/index.js').default
  : null

// 加载所有命令(包括技能、插件、工作流)
const loadAllCommands = memoize(async (cwd: string): Promise<Command[]> => {
  const [
    { skillDirCommands, pluginSkills, bundledSkills, builtinPluginSkills },
    pluginCommands,
    workflowCommands,
  ] = await Promise.all([
    getSkills(cwd),
    getPluginCommands(),
    getWorkflowCommands ? getWorkflowCommands(cwd) : Promise.resolve([]),
  ])

  return [
    ...bundledSkills,
    ...builtinPluginSkills,
    ...skillDirCommands,
    ...workflowCommands,
    ...pluginCommands,
    ...COMMANDS(),
  ]
})

// 获取可用命令
export async function getCommands(cwd: string): Promise<Command[]> {
  const allCommands = await loadAllCommands(cwd)
  const dynamicSkills = getDynamicSkills()
  
  // 过滤可用命令
  const baseCommands = allCommands.filter(
    _ => meetsAvailabilityRequirement(_) && isCommandEnabled(_)
  )
  
  // 合并动态技能
  // ...
}

可用性检查:

export function meetsAvailabilityRequirement(cmd: Command): boolean {
  if (!cmd.availability) return true
  
  for (const a of cmd.availability) {
    switch (a) {
      case 'claude-ai':
        if (isClaudeAISubscriber()) return true
        break
      case 'console':
        // 控制台API密钥用户
        if (!isClaudeAISubscriber() && !isUsing3PServices() && isFirstPartyAnthropicBaseUrl())
          return true
        break
    }
  }
  return false
}

安全命令集合:

// 远程模式安全命令
export const REMOTE_SAFE_COMMANDS: Set<Command> = new Set([
  session,    // 显示二维码/远程会话URL
  exit,       // 退出TUI
  clear,      // 清屏
  help,       // 显示帮助
  theme,      // 切换主题
  cost,       // 显示会话成本
  // ...
])

// 桥接安全命令
export const BRIDGE_SAFE_COMMANDS: Set<Command> = new Set([
  compact,      // 压缩上下文
  clear,        // 清除记录
  cost,         // 显示成本
  summary,      // 总结对话
  // ...
])

4. main.tsx - 应用入口

核心职责:

  • Commander.js CLI解析
  • React/Ink渲染器初始化
  • 启动时并行预取(MDM设置、密钥链、GrowthBook)
  • 信任对话框和初始化流程

启动优化策略:

// 这些副作用必须在其他导入之前运行:
// 1. profileCheckpoint 标记入口点
// 2. startMdmRawRead 启动MDM子进程并行读取
// 3. startKeychainPrefetch 并行读取macOS密钥链

import { profileCheckpoint } from './utils/startupProfiler.js'
profileCheckpoint('main_tsx_entry')

import { startMdmRawRead } from './utils/settings/mdm/rawRead.js'
startMdmRawRead()

import { startKeychainPrefetch } from './utils/secureStorage/keychainPrefetch.js'
startKeychainPrefetch()

主函数流程:

export async function main() {
  profileCheckpoint('main_function_start')
  
  // 安全设置:防止Windows执行当前目录命令
  process.env.NoDefaultCurrentDirectoryInExePath = '1'
  
  // 初始化警告处理器
  initializeWarningHandler()
  
  // 设置进程事件处理
  process.on('exit', () => { resetCursor() })
  process.on('SIGINT', () => { /* 处理中断 */ })
  
  // 运行配置迁移
  runMigrations()
  
  // 初始化GrowthBook(特性开关)
  await initializeGrowthBook()
  
  // 加载设置
  eagerLoadSettings()
  
  // 初始化入口点标识
  initializeEntrypoint(isNonInteractive)
  
  // 获取并过滤命令
  const commands = await getCommands(cwd)
  
  // 初始化工具
  const tools = await getTools()
  
  // 启动REPL或执行非交互式命令
  if (isNonInteractive) {
    // 执行headless模式
    await runHeadless()
  } else {
    // 启动交互式REPL
    await launchRepl({
      commands,
      tools,
      // ... 其他参数
    })
  }
}

延迟预取:

export function startDeferredPrefetches(): void {
  // 跳过性能测试模式
  if (isEnvTruthy(process.env.CLAUDE_CODE_EXIT_AFTER_FIRST_RENDER) ||
      isBareMode()) {
    return
  }
  
  // 进程生成预取(用户输入时消费)
  void initUser()
  void getUserContext()
  prefetchSystemContextIfSafe()
  void getRelevantTips()
  void countFilesRoundedRg(getCwd(), AbortSignal.timeout(3000), [])
  
  // 分析和特性标志初始化
  void initializeAnalyticsGates()
  void prefetchOfficialMcpUrls()
  void refreshModelCapabilities()
  
  // 文件变更检测器
  void settingsChangeDetector.initialize()
  void skillChangeDetector.initialize()
}

工具系统详解

BashTool - Shell命令执行

核心功能:

  • 安全执行shell命令
  • 权限检查(只读/写入/破坏性)
  • 沙箱支持
  • 进度显示
  • 后台任务管理

命令分类:

// 搜索命令(可折叠显示)
const BASH_SEARCH_COMMANDS = new Set([
  'find', 'grep', 'rg', 'ag', 'ack', 'locate', 'which', 'whereis'
])

// 读取命令(可折叠显示)
const BASH_READ_COMMANDS = new Set([
  'cat', 'head', 'tail', 'less', 'more',
  'wc', 'stat', 'file', 'strings',
  'jq', 'awk', 'cut', 'sort', 'uniq', 'tr'
])

// 列表命令
const BASH_LIST_COMMANDS = new Set(['ls', 'tree', 'du'])

// 静默命令(成功时无stdout)
const BASH_SILENT_COMMANDS = new Set([
  'mv', 'cp', 'rm', 'mkdir', 'rmdir', 
  'chmod', 'chown', 'touch', 'ln', 'cd'
])

命令语义分析:

export function isSearchOrReadBashCommand(command: string): {
  isSearch: boolean
  isRead: boolean
  isList: boolean
} {
  const partsWithOperators = splitCommandWithOperators(command)
  
  for (const part of partsWithOperators) {
    // 处理重定向和操作符
    if (part === '>' || part === '>>') {
      skipNextAsRedirectTarget = true
      continue
    }
    
    const baseCommand = part.trim().split(/\s+/)[0]
    
    // 检查命令类型
    if (BASH_SEARCH_COMMANDS.has(baseCommand)) hasSearch = true
    if (BASH_READ_COMMANDS.has(baseCommand)) hasRead = true
    if (BASH_LIST_COMMANDS.has(baseCommand)) hasList = true
  }
  
  return { isSearch, isRead, isList }
}

FileReadTool - 文件读取

核心功能:

  • 多格式文件读取(文本、图片、PDF)
  • 行号添加和范围读取
  • Token限制和压缩
  • 图片处理和缩放
  • PDF页面提取

支持的文件类型:

// 图片扩展名
const IMAGE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp'])

// 阻止的设备文件路径
const BLOCKED_DEVICE_PATHS = new Set([
  '/dev/zero', '/dev/random', '/dev/urandom',
  '/dev/stdin', '/dev/stdout', '/dev/stderr',
  // ...
])

读取限制:

export class MaxFileReadTokenExceededError extends Error {
  constructor(
    public tokenCount: number,
    public maxTokens: number,
  ) {
    super(
      `File content (${tokenCount} tokens) exceeds maximum allowed tokens (${maxTokens}). ` +
      `Use offset and limit parameters to read specific portions of the file.`
    )
  }
}

macOS截图路径处理:

// macOS截图文件名中AM/PM前的空格可能是普通空格或细空格(U+202F)
const THIN_SPACE = String.fromCharCode(8239)

function getAlternateScreenshotPath(filePath: string): string | undefined {
  const filename = path.basename(filePath)
  const amPmPattern = /^(.+)([ \u202F])(AM|PM)(\.png)$/
  const match = filename.match(amPmPattern)
  
  if (!match) return undefined
  
  const currentSpace = match[2]
  const alternateSpace = currentSpace === ' ' ? THIN_SPACE : ' '
  
  return filePath.replace(
    `${currentSpace}${match[3]}${match[4]}`,
    `${alternateSpace}${match[3]}${match[4]}`,
  )
}

设计模式与工程实践

1. 并行预取模式 (Parallel Prefetch)

启动时间优化通过在重模块求值之前并行预取MDM设置、密钥链读取和API预连接:

// main.tsx - 在其他导入之前作为副作用触发
startMdmRawRead()
startKeychainPrefetch()

2. 延迟加载 (Lazy Loading)

重模块(OpenTelemetry、gRPC、分析、特性门控子系统)通过动态 import() 延迟加载:

const snipModule = feature('HISTORY_SNIP')
  ? require('./services/compact/snipCompact.js')
  : null

3. 特性标志死代码消除

使用Bun的 bun:bundle 特性标志在构建时完全剥离未使用代码:

import { feature } from 'bun:bundle'

const voiceCommand = feature('VOICE_MODE')
  ? require('./commands/voice/index.js').default
  : null

主要特性标志:

  • PROACTIVE - 主动模式
  • KAIROS - 助手模式
  • BRIDGE_MODE - IDE桥接
  • DAEMON - 守护进程模式
  • VOICE_MODE - 语音输入
  • AGENT_TRIGGERS - 代理触发器
  • MONITOR_TOOL - 监控工具

4. 代理群集 (Agent Swarms)

通过 AgentTool 生成子代理,coordinator/ 处理多代理编排,TeamCreateTool 支持团队级并行工作。

5. 技能系统 (Skill System)

skills/ 中定义的可重用工作流通过 SkillTool 执行,用户可添加自定义技能。

6. 插件架构 (Plugin Architecture)

内置和第三方插件通过 plugins/ 子系统加载。


权限系统

权限模式

type PermissionMode = 
  | 'default'      // 默认模式
  | 'plan'         // 计划模式
  | 'bypassPermissions' // 绕过权限
  | 'auto'         // 自动模式
  | 'ask'          // 总是询问

权限上下文

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

权限检查流程

  1. validateInput() - 验证输入有效性
  2. checkPermissions() - 工具特定权限检查
  3. canUseTool() - 通用权限系统检查
  4. 用户确认(如需要)

技术栈

类别 技术
运行时 Bun
语言 TypeScript (严格模式)
终端UI React + Ink
CLI解析 Commander.js
Schema验证 Zod v4
代码搜索 ripgrep
协议 MCP SDK, LSP
API Anthropic SDK
遥测 OpenTelemetry + gRPC
特性开关 GrowthBook
认证 OAuth 2.0, JWT, macOS Keychain

学习要点总结

架构设计

  1. 模块化设计: 清晰的模块边界,职责分离
  2. 插件化架构: 支持动态扩展
  3. 多模式支持: 交互式、headless、远程、桥接
  4. 状态管理: 集中式状态管理,支持持久化

工程实践

  1. 性能优化: 并行预取、延迟加载、死代码消除
  2. 类型安全: 严格的TypeScript配置
  3. 错误处理: 全面的错误分类和处理
  4. 测试友好: 依赖注入,便于测试

安全考虑

  1. 权限系统: 多层权限检查
  2. 沙箱支持: 命令执行隔离
  3. 路径验证: 防止目录遍历
  4. 输入验证: Zod schema验证

可维护性

  1. 代码组织: 清晰的目录结构
  2. 命名规范: 一致的命名约定
  3. 文档注释: 详细的JSDoc注释
  4. 迁移策略: 配置版本迁移机制

免责声明

本项目仅用于教育和工程学习目的,探讨现代AI辅助编程工具的架构设计和工程实践。原始Claude Code源代码归 Anthropic 所有。


最后更新: 2026年4月

Releases

No releases published

Packages