Files
cs-note/claude-code-best/docs/introduction/what-is-claude-code.md
T

4.8 KiB
Raw Blame History

tags, create time
tags create time
claude-code
agentic-coding
architecture
CLI
terminal
2026-06-09 22:30

什么是 Claude Code

概述

Claude Code 是一个运行在本地终端中的 agentic coding system。它不给建议,而是直接在你的项目目录中读代码、改文件、跑命令、调试程序——拥有完整的 shell 能力。

正文

技术定位:terminal-native agentic system

理解 Claude Code 的关键在于三个词:

定位关键词 含义
Terminal-native 原生 CLI 应用,不是 IDE 插件、不是 Web 界面、不是 API wrapper
Agentic AI 自主决策工具调用链,不是"一问一答"的聊天模式
Coding system 面向软件工程全流程,不是通用问答工具

与同类工具的架构层面差异(不是功能清单):

工具 架构模式 运行位置 工具执行
Claude Code Terminal-native agentic loop 本地进程 直接 shell 执行
Cursor / Copilot IDE-integrated autocomplete + chat IDE 进程内 LSP / IDE API
Aider CLI chat → git patch 本地进程 文件操作为主
ChatGPT / Claude.ai Cloud chat + artifacts 浏览器/云端 沙箱容器

[!info] 核心差异 Claude Code 拥有完整的 shell 访问权——这意味着它可以做任何你在终端里能做的事,但也需要对应的安全机制来约束这个能力。

端到端示例:从输入到输出

当你在终端中输入 bun run dev 有个 TypeScript 报错,帮我修一下 时,系统发生了什么?

flowchart TD
    A["入口层 cli.tsx → main.tsx"] -->|"feature() = false, MACRO 注入, 启动 Commander.js CLI"| B["交互层 REPL.tsx — React/Ink"]
    B -->|"PromptInput 捕获用户输入 → UserMessage 加入会话"| C["编排层 QueryEngine.ts"]
    C -->|"管理 turn 生命周期, token 预算, compaction 触发"| D["核心循环 query.ts — Agentic Loop"]
    D -->|"组装上下文 → 调 API → 收流式响应 → 解析工具调用"| E["工具执行 BashTool / FileEditTool / ..."]
    E -->|"执行结果回传 → 再次调 API → 循环"| D
    D -->|"流式 HTTP, 支持 7 种 provider"| F["通信层 claude.ts → Anthropic API"]

具体到这个报错修复场景,一次典型的 agentic loop 可能包含多轮工具调用:

Turn AI 决策 工具调用 结果
1 先看报错信息 Bash("bun run dev 2>&1 | head -30") TypeScript 错误输出
2 定位到文件 Read("src/utils/foo.ts") 源代码内容
3 搜索相关类型定义 Grep("interface Foo", "src/") 类型定义位置
4 修复代码 FileEdit(old, new) 代码已修改
5 验证修复 Bash("bun run dev 2>&1 | head -10") 编译通过

[!question] 思考 每一步都是 AI 自主决策的——它决定用哪个工具、传什么参数、何时停止。这就是 "agentic" 的含义。如果你来设计这个循环,你会在哪些环节加入"人类审批"?

它不是什么

  • 不是 IDE 插件:没有图形界面,不依赖 VS Code 或任何 IDE
  • 不是 API wrapper:它有自己的工具系统、权限模型、上下文工程、会话管理
  • 不是聊天机器人:输出不是纯文本,而是实际的文件修改、命令执行
  • 不是无脑执行器:每个敏感操作都有权限检查和用户确认环节

启动入口解剖

真正的代码入口是 src/entrypoints/cli.tsx,它做了三件关键的事:

// 1. 注入运行时 polyfill —— feature() 永远返回 false
const feature = (_name: string) => false;

// 2. 注入构建时宏
globalThis.MACRO = { VERSION: "2.1.888", BUILD_TIME: ..., };

// 3. 声明构建目标
globalThis.BUILD_TARGET = "external";  // 外部构建(非 Anthropic 内部)
globalThis.BUILD_ENV = "production";
globalThis.INTERFACE_TYPE = "stdio";   // 标准 I/O 交互

然后控制流传递到 src/main.tsx:

  1. Commander.js 解析命令行参数
  2. 初始化认证、遥测、策略限制
  3. 加载工具列表(getTools())
  4. 启动 REPL(launchRepl())或管道模式(-p)

为什么选择终端

终端不是限制,而是选择。它带来了独特的能力:

  • 完整的 shell 访问:可以运行任何命令行工具,无需为每个能力写插件
  • 项目原生:直接在项目目录工作,理解文件系统结构、git 状态
  • 可组合性:管道模式(echo "..." | claude -p)允许嵌入 CI/CD 和自动化流程
  • 低延迟:没有 Electron 开销,React/Ink 渲染的 TUI 响应极快

[!tip] 代价与收获 用户需要适应命令行界面——但也正因如此,它吸引的是需要真正掌控开发环境的开发者。

关联笔记