9.2 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is a reverse-engineered / decompiled version of Anthropic's official Claude Code CLI tool. The goal is to restore core functionality while trimming secondary capabilities. Many modules are stubbed or feature-flagged off. The codebase has ~1341 tsc errors from decompilation (mostly unknown/never/{} types) — these do not block Bun runtime execution.
Commands
# Install dependencies
bun install
# Dev mode (runs cli.tsx with MACRO defines injected via -d flags)
bun run dev
# Pipe mode
echo "say hello" | bun run src/entrypoints/cli.tsx -p
# Build (code splitting, outputs dist/cli.js + ~450 chunk files)
bun run build
# Test
bun test # run all tests
bun test src/utils/__tests__/hash.test.ts # run single file
bun test --coverage # with coverage report
# Lint & Format (Biome)
bun run lint # check only
bun run lint:fix # auto-fix
bun run format # format all src/
详细的测试规范、覆盖状态和改进计划见 docs/testing-spec.md。
Architecture
Runtime & Build
- Runtime: Bun (not Node.js). All imports, builds, and execution use Bun APIs.
- Build:
build.ts执行Bun.build()withsplitting: true,入口src/entrypoints/cli.tsx,输出dist/cli.js+ ~450 chunk files。构建后自动替换import.meta.require为 Node.js 兼容版本(产物 bun/node 都可运行)。 - Dev mode:
scripts/dev.ts通过 Bun-dflag 注入MACRO.*defines,运行src/entrypoints/cli.tsx。scripts/defines.ts集中管理 define map。 - Module system: ESM (
"type": "module"), TSX withreact-jsxtransform. - Monorepo: Bun workspaces — internal packages live in
packages/resolved viaworkspace:*. - Lint/Format: Biome (
biome.json)。bun run lint/bun run lint:fix/bun run format。
Entry & Bootstrap
src/entrypoints/cli.tsx— True entrypoint. Sets up runtime globals:globalThis.MACRO— build-time macro values (VERSION, BUILD_TIME, etc.),通过scripts/dev.ts的-dflags 注入。BUILD_TARGET,BUILD_ENV,INTERFACE_TYPEglobals。feature()由bun:bundle内置模块提供,不需要在此 polyfill。
src/main.tsx— Commander.js CLI definition. Parses args, initializes services (auth, analytics, policy), then launches the REPL or runs in pipe mode.src/entrypoints/init.ts— One-time initialization (telemetry, config, trust dialog).
Core Loop
src/query.ts— The main API query function. Sends messages to Claude API, handles streaming responses, processes tool calls, and manages the conversation turn loop.src/QueryEngine.ts— Higher-level orchestrator wrappingquery(). Manages conversation state, compaction, file history snapshots, attribution, and turn-level bookkeeping. Used by the REPL screen.src/screens/REPL.tsx— The interactive REPL screen (React/Ink component). Handles user input, message display, tool permission prompts, and keyboard shortcuts.
API Layer
src/services/api/claude.ts— Core API client. Builds request params (system prompt, messages, tools, betas), calls the Anthropic SDK streaming endpoint, and processesBetaRawMessageStreamEventevents.- Supports multiple providers: Anthropic direct, AWS Bedrock, Google Vertex, Azure.
- Provider selection in
src/utils/model/providers.ts.
Tool System
src/Tool.ts— Tool interface definition (Tooltype) and utilities (findToolByName,toolMatchesName).src/tools.ts— Tool registry. Assembles the tool list; some tools are conditionally loaded viafeature()flags orprocess.env.USER_TYPE.src/tools/<ToolName>/— Each tool in its own directory (e.g.,BashTool,FileEditTool,GrepTool,AgentTool).- Tools define:
name,description,inputSchema(JSON Schema),call()(execution), and optionally a React component for rendering results.
UI Layer (Ink)
src/ink.ts— Ink render wrapper with ThemeProvider injection.src/ink/— Custom Ink framework (forked/internal): custom reconciler, hooks (useInput,useTerminalSize,useSearchHighlight), virtual list rendering.src/components/— React components rendered in terminal via Ink. Key ones:App.tsx— Root provider (AppState, Stats, FpsMetrics).Messages.tsx/MessageRow.tsx— Conversation message rendering.PromptInput/— User input handling.permissions/— Tool permission approval UI.
- Components use React Compiler runtime (
react/compiler-runtime) — decompiled output has_c()memoization calls throughout.
State Management
src/state/AppState.tsx— Central app state type and context provider. Contains messages, tools, permissions, MCP connections, etc.src/state/store.ts— Zustand-style store for AppState.src/bootstrap/state.ts— Module-level singletons for session-global state (session ID, CWD, project root, token counts).
Context & System Prompt
src/context.ts— Builds system/user context for the API call (git status, date, CLAUDE.md contents, memory files).src/utils/claudemd.ts— Discovers and loads CLAUDE.md files from project hierarchy.
Feature Flag System
Feature flags control which functionality is enabled at runtime. The system works as follows:
- 在代码中使用: 统一通过
import { feature } from 'bun:bundle'导入,调用feature('FLAG_NAME')返回boolean。不要在cli.tsx或其他文件里自己定义feature函数或覆盖这个 import。 - 启用方式: 通过环境变量
FEATURE_<FLAG_NAME>=1。例如FEATURE_BUDDY=1 bun run dev启用 BUDDY 功能。 - Dev 模式:
scripts/dev.ts自动扫描所有FEATURE_*环境变量,转换为 Bun 的--feature参数传递给运行时。 - Build 模式:
build.ts同样读取FEATURE_*环境变量,传入Bun.build({ features })数组。 - 默认行为: 不设置任何
FEATURE_*环境变量时,所有feature()调用返回false,即所有 feature-gated 代码不执行。 - 常见 flag 名称:
BUDDY、FORK_SUBAGENT、PROACTIVE、KAIROS、VOICE_MODE、DAEMON等(见src/commands.ts中的使用)。 - 类型声明:
src/types/internal-modules.d.ts中声明了bun:bundle模块的feature函数签名。
新增功能的正确做法: 如果要让某个 feature-gated 模块(如 buddy)永久启用,应保留代码中 import { feature } from 'bun:bundle' + feature('FLAG_NAME') 的标准模式,在运行时通过环境变量或配置控制,而不是绕过 feature flag 直接 import。
Stubbed/Deleted Modules
| Module | Status |
|---|---|
Computer Use (@ant/*) |
Stub packages in packages/@ant/ |
*-napi packages (audio, image, url, modifiers) |
Stubs in packages/ (except color-diff-napi which is fully implemented) |
| Analytics / GrowthBook / Sentry | Empty implementations |
| Magic Docs / Voice Mode / LSP Server | Removed |
| Plugins / Marketplace | Removed |
| MCP OAuth | Simplified |
Key Type Files
src/types/global.d.ts— DeclaresMACRO,BUILD_TARGET,BUILD_ENVand internal Anthropic-only identifiers.src/types/internal-modules.d.ts— Type declarations forbun:bundle,bun:ffi,@anthropic-ai/mcpb.src/types/message.ts— Message type hierarchy (UserMessage, AssistantMessage, SystemMessage, etc.).src/types/permissions.ts— Permission mode and result types.
Testing
- 框架:
bun:test(内置断言 + mock) - 单元测试: 就近放置于
src/**/__tests__/,文件名<module>.test.ts - 集成测试:
tests/integration/,共享 mock/fixture 在tests/mocks/ - 命名:
describe("functionName")+test("behavior description"),英文 - Mock 模式: 对重依赖模块使用
mock.module()+await import()解锁(必须内联在测试文件中,不能从共享 helper 导入) - 当前状态: 1286 tests / 67 files / 0 fail(详见
docs/testing-spec.md的覆盖状态表和评分)
Working with This Codebase
- Don't try to fix all tsc errors — they're from decompilation and don't affect runtime.
- Feature flags — 默认全部关闭(
feature()返回false)。启用方式见上方 Feature Flag System 章节。不要在cli.tsx中重定义feature函数。 - React Compiler output — Components have decompiled memoization boilerplate (
const $ = _c(N)). This is normal. bun:bundleimport —import { feature } from 'bun:bundle'是 Bun 内置模块,由运行时/构建器解析。不要用自定义函数替代它。src/path alias — tsconfig mapssrc/*to./src/*. Imports likeimport { ... } from 'src/utils/...'are valid.- MACRO defines — 集中管理在
scripts/defines.ts。Dev mode 通过bun -d注入,build 通过Bun.build({ define })注入。修改版本号等常量只改这个文件。 - 构建产物兼容 Node.js —
build.ts会自动后处理import.meta.require,产物可直接用node dist/cli.js运行。