Claude Code 基础设施层深度分析
1. 基础设施层总览
Claude Code 的基础设施层由四大支柱组成:
| 模块 | 路径 | 规模 | 职责 |
|---|---|---|---|
| Utils | src/utils/ | ~329 文件 + 31 子目录 | 通用工具函数库,涵盖 auth、config、git、MCP、permissions 等 |
| Bootstrap State | src/bootstrap/state.ts | 1758 行 | 全局状态单例,会话级可变状态的唯一来源 |
| Native-TS | src/native-ts/ | 3 子目录 | 纯 TS 重写的原生模块替代方案 |
| Constants | src/constants/ | 21 文件 | 全局常量定义(工具名、限制、密钥、产品 URL 等) |
2. Utils 架构
2.1 顶层文件分类(~329 个 .ts 文件)
按领域划分为以下类别:
认证与安全 (Auth & Security) — ~10 文件
auth.ts— 主认证逻辑(2002 行),OAuth/API Key/AWS STSauthFileDescriptor.ts— 文件描述符传递 tokenauthPortable.ts— 跨平台认证(macOS keychain 抽象)aws.ts,awsAuthStatusManager.ts— AWS 认证caCerts.ts,caCertsConfig.ts— CA 证书管理crypto.ts— crypto 封装mtls.ts— mTLS 支持privacyLevel.ts— 隐私级别控制
配置管理 (Config) — ~8 文件
config.ts— 主配置管理(1817 行),ProjectConfig/GlobalConfigconfigConstants.ts— 配置相关常量settings/(17 文件) — 设置系统(schema、validation、cache、MDM)
Git 操作 — ~8 文件
git.ts— 主 git 操作(926 行),findGitRoot、diff、statusgitDiff.ts— diff 计算gitSettings.ts— git 配置读取git/(3 文件) — gitConfigParser、gitFilesystem、gitignoreworktree.ts— worktree 管理getWorktreePaths.ts,getWorktreePathsPortable.tsdetectRepository.ts
Shell 执行 — ~11 文件
Shell.ts,ShellCommand.ts— Shell 抽象shell/(10 文件) — bash/powershell provider、shell completionbash/(16 文件 + specs/) — Bash AST 解析、命令注册、heredoc、quotingpowershell/(3 文件) — PowerShell 解析、危险 cmdlet 检测which.ts— 可执行文件查找findExecutable.ts
MCP (Model Context Protocol) — ~7 文件
mcp/(2 文件) — dateTimeParser、elicitationValidationmcpInstructionsDelta.ts— MCP 指令增量更新mcpOutputStorage.ts— MCP 输出存储mcpValidation.ts— MCP 验证mcpWebSocketTransport.ts— WebSocket 传输层
权限系统 (Permissions) — 24 文件
permissions/(24 文件) — 完整的权限引擎permissions.ts— 核心权限逻辑yoloClassifier.ts— 自动模式分类器bashClassifier.ts— Bash 命令分类dangerousPatterns.ts— 危险模式检测PermissionMode.ts— 权限模式枚举permissionExplainer.ts— 权限解释pathValidation.ts— 路径验证shellRuleMatching.ts— Shell 规则匹配bypassPermissionsKillswitch.ts— 绕过权限的紧急开关
模型管理 (Model) — 16 文件
model/(16 文件)model.ts— 模型定义、别名解析modelStrings.ts— 模型字符串管理modelOptions.ts— 模型选项configs.ts— 模型配置providers.ts— API provider 管理modelCapabilities.ts— 模型能力检测bedrock.ts— AWS Bedrock 集成antModels.ts— 内部模型aliases.ts— 模型别名映射deprecation.ts— 模型弃用管理validateModel.ts— 模型验证
遥测 (Telemetry) — 9 文件
telemetry/(9 文件)events.ts— 事件定义instrumentation.ts— OpenTelemetry 插桩logger.ts— 日志sessionTracing.ts— 会话追踪betaSessionTracing.ts— Beta 会话追踪bigqueryExporter.ts— BigQuery 导出perfettoTracing.ts— Perfetto 追踪pluginTelemetry.ts— 插件遥测skillLoadedEvent.ts— 技能加载事件
插件系统 (Plugins) — 44 文件
plugins/(44 文件) — 最大的 utils 子目录- 核心:
pluginLoader.ts,managedPlugins.ts - 市场:
marketplaceManager.ts,officialMarketplace.ts - 安装:
pluginInstallationHelpers.ts,headlessPluginInstall.ts - 生命周期:
pluginAutoupdate.ts,pluginVersioning.ts - 加载:
loadPluginAgents.ts,loadPluginCommands.ts,loadPluginHooks.ts - 策略:
pluginPolicy.ts,pluginBlocklist.ts - LSP:
lspPluginIntegration.ts,lspRecommendation.ts
- 核心:
Swarm/Agent 团队 — 14 文件
swarm/(14 文件) — 多代理协作teammateInit.ts,teammateModel.ts— 队友初始化/模型teamHelpers.ts— 团队辅助inProcessRunner.ts— 进程内运行器permissionSync.ts,leaderPermissionBridge.ts— 权限同步reconnection.ts— 重连逻辑backends/— 后端实现
Hooks 系统 — 17 文件
hooks/(17 文件)AsyncHookRegistry.ts— 异步 hook 注册表hookEvents.ts— hook 事件定义hooksConfigManager.ts— hook 配置管理execAgentHook.ts,execHttpHook.ts,execPromptHook.ts— hook 执行器fileChangedWatcher.ts— 文件变更监控postSamplingHooks.ts— 采样后 hookregisterSkillHooks.ts— 技能 hook 注册ssrfGuard.ts— SSRF 防护
Computer Use — 15 文件
computerUse/(15 文件) — 桌面自动化executor.ts— 执行器hostAdapter.ts— 宿主适配setup.ts— 设置mcpServer.ts— MCP 服务器escHotkey.ts— 快捷键处理
会话管理 (Session) — ~15 文件
sessionState.ts,sessionStart.ts,sessionRestore.tssessionStorage.ts,sessionStoragePortable.tssessionTitle.ts,sessionUrl.tssessionActivity.ts,sessionEnvironment.tssessionEnvVars.ts,sessionFileAccessHooks.tssessionIngressAuth.tsconcurrentSessions.ts— 并发会话
其他重要领域
| 领域 | 文件 | 说明 |
|---|---|---|
| CLI | cliArgs.ts, cliHighlight.ts | CLI 参数和语法高亮 |
| 日志 | log.ts (362 行) | 日志系统核心 |
| 文件操作 | file.ts, fileRead.ts, fsOperations.ts, fileHistory.ts | 文件读写、操作分析 |
| 格式化 | format.ts, formatBriefTimestamp.ts, truncate.ts, treeify.ts | 输出格式化 |
| 网络 | http.ts, proxy.ts, api.ts, apiPreconnect.ts | HTTP/API 层 |
| Diff | diff.ts — diff 算法;native-ts/color-diff/ — 彩色 diff | |
| 任务 | task/ (5 文件) — 任务框架;tasks.ts — 任务管理 | |
| 存储 | secureStorage/ (6 文件) — 安全存储(macOS keychain、fallback) | |
| IDE 集成 | ide.ts, idePathConversion.ts, jetbrains.ts | IDE 集成 |
| 浏览器 | browser.ts — 浏览器控制 | |
pdf.ts, pdfUtils.ts — PDF 处理 | ||
| 图像 | imagePaste.ts, imageResizer.ts, imageStore.ts, imageValidation.ts | 图像处理管线 |
| 缓存 | cachePaths.ts, fileReadCache.ts, fileStateCache.ts, completionCache.ts | 多层缓存 |
| Sandbox | sandbox/ (2 文件) | 沙箱适配 |
| Deep Link | deepLink/ (6 文件) | 深度链接协议 |
| Claude in Chrome | claudeInChrome/ (7 文件) | Chrome 扩展集成 |
| DXT | dxt/ (2 文件) | DXT 扩展包处理 |
| Teleport | teleport/ (4 文件) | 远程会话 |
| Ultralan | ultraplan/ (2 文件) | CCR 会话 |
| Skills | skills/skillChangeDetector.ts | 技能变更检测 |
| Suggestions | suggestions/ (5 文件) | 命令/目录/历史补全 |
| Native Installer | nativeInstaller/ (5 文件) | 原生模块安装 |
2.2 Utils 设计模式
模式 1: Lazy Loading + Memoization
// src/utils/color-diff/index.ts:34-43
let cachedHljs: HLJSApi | null = null
function hljs(): HLJSApi {
if (cachedHljs) return cachedHljs
const mod = require('highlight.js')
cachedHljs = 'default' in mod && mod.default ? mod.default : mod
return cachedHljs!
}
模式 2: LRU 缓存封装
// src/utils/memoize.ts — memoizeWithLRU / memoizeWithTTLAsync
// src/utils/git.ts:27 — findGitRootImpl = memoizeWithLRU(...)
模式 3: 平台抽象(Portable 变体)
sessionStorage.ts ↔ sessionStoragePortable.ts
getWorktreePaths.ts ↔ getWorktreePathsPortable.ts
execFileNoThrow.ts ↔ execFileNoThrowPortable.ts
auth.ts + authPortable.ts
许多模块提供标准版和 Portable 版,前者依赖 Node.js 原生模块,后者用纯 JS 实现以支持 Bun/browser-sdk 构建。
模式 4: Factory + Registry
// src/utils/hooks/AsyncHookRegistry.ts
// src/utils/bash/registry.ts — 命令注册表
// src/utils/toolPool.ts — 工具池
模式 5: Signal/Event 系统
// src/bootstrap/state.ts:481
const sessionSwitched = createSignal<[id: SessionId]>()
export const onSessionSwitch = sessionSwitched.subscribe
3. Bootstrap State 设计
3.1 架构概要
src/bootstrap/state.ts 是 Claude Code 的全局状态单例,1758 行。文件顶部有醒目的注释:
// DO NOT ADD MORE STATE HERE - BE JUDICIOUS WITH GLOBAL STATE
// ALSO HERE - THINK THRICE BEFORE MODIFYING
// AND ESPECIALLY HERE (const STATE: State = getInitialState())
核心模式:私有 STATE 对象 + 公开 getter/setter 函数(不导出 STATE 本身)。
3.2 State 类型定义(全部字段)
会话标识 (Session Identity)
| 字段 | 类型 | 用途 |
|---|---|---|
sessionId | SessionId | 当前会话 UUID,每次 regenerateSessionId() 更新 |
parentSessionId | SessionId | undefined | 父会话 ID(plan mode → implementation 追踪) |
sessionProjectDir | string | null | 会话 .jsonl 所在目录;null = 从 originalCwd 推导 |
路径状态 (Paths)
| 字段 | 类型 | 用途 |
|---|---|---|
originalCwd | string | 启动时的工作目录(NFC 规范化) |
projectRoot | string | 稳定的项目根目录,不随 EnterWorktreeTool 变化 |
cwd | string | 当前工作目录 |
additionalDirectoriesForClaudeMd | string[] | --add-dir 标志的额外目录 |
成本与性能 (Cost & Performance)
| 字段 | 类型 | 用途 |
|---|---|---|
totalCostUSD | number | 累计费用 |
totalAPIDuration | number | 累计 API 调用时长 |
totalAPIDurationWithoutRetries | number | 不含重试的 API 时长 |
totalToolDuration | number | 累计工具执行时长 |
startTime | number | 会话开始时间 |
lastInteractionTime | number | 最后交互时间(Ink render 时 flush) |
totalLinesAdded | number | 累计添加行数 |
totalLinesRemoved | number | 累计删除行数 |
hasUnknownModelCost | boolean | 模型费用未知标志 |
Turn 级统计
| 字段 | 类型 | 用途 |
|---|---|---|
turnHookDurationMs | number | 当前 turn 的 hook 耗时 |
turnToolDurationMs | number | 当前 turn 的工具耗时 |
turnClassifierDurationMs | number | 当前 turn 的分类器耗时 |
turnToolCount | number | 当前 turn 的工具调用次数 |
turnHookCount | number | 当前 turn 的 hook 调用次数 |
turnClassifierCount | number | 当前 turn 的分类器调用次数 |
模型状态 (Model)
| 字段 | 类型 | 用途 |
|---|---|---|
modelUsage | { [modelName: string]: ModelUsage } | 每个模型的 token 使用量 |
mainLoopModelOverride | ModelSetting | undefined | --model CLI 标志或用户模型更新 |
initialMainLoopModel | ModelSetting | 初始模型 |
modelStrings | ModelStrings | null | 模型字符串缓存 |
遥测 (Telemetry)
| 字段 | 类型 | 用途 |
|---|---|---|
meter | Meter | null | OpenTelemetry Meter |
sessionCounter | AttributedCounter | null | 会话计数器 |
locCounter | AttributedCounter | null | 代码行计数器 |
prCounter | AttributedCounter | null | PR 计数器 |
commitCounter | AttributedCounter | null | Commit 计数器 |
costCounter | AttributedCounter | null | 费用计数器 |
tokenCounter | AttributedCounter | null | Token 计数器 |
codeEditToolDecisionCounter | AttributedCounter | null | 代码编辑决策计数器 |
activeTimeCounter | AttributedCounter | null | 活跃时间计数器 |
statsStore | { observe(name, value) } | null | 统计存储 |
loggerProvider | LoggerProvider | null | OTel Logger |
eventLogger | Logger | null | 事件日志 |
meterProvider | MeterProvider | null | OTel Meter Provider |
tracerProvider | BasicTracerProvider | null | OTel Tracer Provider |
UI/交互状态
| 字段 | 类型 | 用途 |
|---|---|---|
isInteractive | boolean | 是否交互模式 |
clientType | string | 客户端类型('cli'、'claude-vscode'等) |
questionPreviewFormat | 'markdown' | 'html' | undefined | 问题预览格式 |
agentColorMap | Map<string, AgentColorName> | Agent 颜色映射 |
agentColorIndex | number | Agent 颜色索引 |
API 请求追踪
| 字段 | 类型 | 用途 |
|---|---|---|
lastAPIRequest | Omit<BetaMessageStreamParams, 'messages'> | null | 最后 API 请求(bug report 用) |
lastAPIRequestMessages | BetaMessageStreamParams['messages'] | null | 最后 API 请求消息 |
lastClassifierRequests | unknown[] | null | 最后分类器请求 |
cachedClaudeMdContent | string | null | CLAUDE.md 内容缓存 |
lastMainRequestId | string | undefined | 主对话链的最后 requestId |
lastApiCompletionTimestamp | number | null | 最后 API 完成时间戳 |
pendingPostCompaction | boolean | 压缩后的首 API 调用标记 |
插件与扩展
| 字段 | 类型 | 用途 |
|---|---|---|
inlinePlugins | string[] | --plugin-dir 的会话插件 |
useCoworkPlugins | boolean | 是否使用 cowork_plugins 目录 |
allowedChannels | ChannelEntry[] | --channels 标志的服务器白名单 |
hasDevChannels | boolean | 是否有开发通道 |
registeredHooks | Partial<Record<HookEvent, RegisteredHookMatcher[]>> | null | 注册的 hooks |
会话模式标志
| 字段 | 类型 | 用途 |
|---|---|---|
isRemoteMode | boolean | 远程模式 |
sessionBypassPermissionsMode | boolean | 会话级绕过权限 |
scheduledTasksEnabled | boolean | 定时任务开关 |
sessionTrustAccepted | boolean | 会话级信任标志 |
sessionPersistenceDisabled | boolean | 禁用会话持久化 |
hasExitedPlanMode | boolean | 是否已退出 plan mode |
needsPlanModeExitAttachment | boolean | plan mode 退出附件标志 |
needsAutoModeExitAttachment | boolean | auto mode 退出附件标志 |
kairosActive | boolean | Kairos 激活状态 |
strictToolResultPairing | boolean | 严格工具结果配对(HFI 用) |
userMsgOptIn | boolean | 用户消息许可 |
sdkAgentProgressSummariesEnabled | boolean | SDK agent 进度摘要 |
Beta 功能 Latch
| 字段 | 类型 | 用途 |
|---|---|---|
afkModeHeaderLatched | boolean | null | Auto mode beta header 锁存 |
fastModeHeaderLatched | boolean | null | Fast mode beta header 锁存 |
cacheEditingHeaderLatched | boolean | null | Cache editing header 锁存 |
thinkingClearLatched | boolean | null | Thinking 清除锁存 |
这些是 sticky-on 锁存器:一旦激活就保持发送对应的 beta header,避免 Shift+Tab 切换导致 prompt cache 失效。
其他状态
| 字段 | 类型 | 用途 |
|---|---|---|
inMemoryErrorLog | Array<{error, timestamp}> | 内存错误日志(最多 100 条) |
sessionCronTasks | SessionCronTask[] | 会话级定时任务(不持久化) |
sessionCreatedTeams | Set<string> | 会话创建的团队(清理用) |
planSlugCache | Map<string, string> | plan slug 缓存 |
teleportedSessionInfo | object | null | 远程传送会话信息 |
invokedSkills | Map<string, InvokedSkillInfo> | 已调用技能(压缩保留) |
slowOperations | Array<{operation, durationMs, timestamp}> | 慢操作追踪 |
sdkBetas | string[] | undefined | SDK 提供的 beta 功能 |
mainThreadAgentType | string | undefined | 主线程 agent 类型 |
promptCache1hAllowlist | string[] | null | 1 小时缓存白名单 |
promptCache1hEligible | boolean | null | 1 小时缓存资格 |
systemPromptSectionCache | Map<string, string | null> | System prompt 段缓存 |
lastEmittedDate | string | null | 最后发送给模型的日期 |
promptId | string | null | 当前 prompt ID(OTel 关联) |
flagSettingsPath | string | undefined | --settings 路径 |
flagSettingsInline | Record<string, unknown> | null | --settings 行内值 |
allowedSettingSources | SettingSource[] | 允许的设置源 |
sessionIngressToken | string | null | undefined | 会话入口 token |
oauthTokenFromFd | string | null | undefined | 文件描述符 OAuth token |
apiKeyFromFd | string | null | undefined | 文件描述符 API key |
sessionSource | string | undefined | 会话来源 |
chromeFlagOverride | boolean | undefined | Chrome 标志覆盖 |
initJsonSchema | Record<string, unknown> | null | SDK init JSON schema |
directConnectServerUrl | string | undefined | 直连服务器 URL |
lspRecommendationShownThisSession | boolean | LSP 推荐是否已显示 |
3.3 初始化模式
// src/bootstrap/state.ts:260-426
function getInitialState(): State {
// 解析 symlink,NFC 规范化
let resolvedCwd = realpathSync(rawCwd).normalize('NFC')
const state: State = {
originalCwd: resolvedCwd,
projectRoot: resolvedCwd,
// ... 所有字段的默认值
startTime: Date.now(),
sessionId: randomUUID() as SessionId,
clientType: 'cli',
allowedSettingSources: ['userSettings', 'projectSettings', ...],
}
return state
}
const STATE: State = getInitialState()
3.4 消费模式
- 纯 getter/setter:
getCwdState()/setCwdState()— 最常见模式 - 累加器:
addToTotalCostState()/addToTotalDurationState()— 费用/时长累积 - 脏标记刷新:
updateLastInteractionTime()→flushInteractionTime()— 避免每次按键调用Date.now() - 一次性消费:
consumePostCompaction()— 读取后自动重置 - 信号:
onSessionSwitch— 订阅 sessionId 变化 - 仅测试:
resetStateForTests()/resetTotalDurationStateAndCost_FOR_TESTS_ONLY()— 测试环境重置
4. Native-TS 重实现
4.1 设计动机
三个子模块都是对 vendor/ 目录下 Rust/C++ 原生 NAPI 模块的纯 TypeScript 重写。目的是:
- 跨平台可移植性 — 不依赖平台特定的 native addon 编译
- Bun/browser-sdk 兼容 — 避免 NAPI 绑定的兼容性问题
- 简化构建流程 — 去除
node-gyp/napi-rs编译步骤
4.2 color-diff(999 行)
原模块: vendor/color-diff-src(Rust NAPI,使用 syntect + bat)
重写: src/native-ts/color-diff/index.ts
| 特性 | 原生版 | TS 版 |
|---|---|---|
| 语法高亮 | syntect (Rust) | highlight.js (JS) |
| Word diff | similar crate | diff npm 包 diffArrays |
| 颜色精度 | 精确匹配 syntect Monokai/GitHub | 测量对齐原版色值 |
| BAT_THEME | 完整支持 | stub(忽略) |
核心类:
ColorDiff— 渲染带语法高亮的 diff hunkColorFile— 渲染完整文件(带行号)getSyntaxTheme()— 返回主题信息
4.3 file-index(370 行)
原模块: vendor/file-index-src(Rust NAPI,使用 nucleo 模糊搜索)
重写: src/native-ts/file-index/index.ts
关键特性:
- Nucleo 风格评分:
SCORE_MATCH,BONUS_BOUNDARY,BONUS_CAMEL,BONUS_CONSECUTIVE - Bitmap 快速拒绝: O(1) 检查路径是否包含所有 needle 字母
- 异步构建:
loadFromFileListAsync()— 每 ~4ms 让出事件循环,避免阻塞主线程 - Smart Case: 小写 query = 忽略大小写;任何大写 = 区分大小写
- Top-K 优化: 维护排序的 top-k 数组,避免全量排序
- 测试文件惩罚: 包含 "test" 的路径得分 ×1.05(上限 1.0)
4.4 yoga-layout(~3000+ 行)
原模块: Meta 的 yoga(C++ flexbox 引擎)
重写: src/native-ts/yoga-layout/index.ts + enums.ts
这是一个精简的单遍 flexbox 实现,覆盖 Ink 实际使用的子集:
| 功能 | 支持 |
|---|---|
| flex-direction (row/column + reverse) | ✅ |
| flex-grow / flex-shrink / flex-basis | ✅ |
| align-items / align-self | ✅ |
| justify-content (全部 6 值) | ✅ |
| margin / padding / border / gap | ✅ |
| width / height / min / max | ✅ |
| position: relative / absolute | ✅ |
| display: flex / none / contents | ✅ |
| measure functions (文本节点) | ✅ |
| flex-wrap (multi-line) | ✅ |
| align-content | ✅ |
| baseline alignment | ✅ |
| margin: auto | ✅ |
| aspect-ratio | ❌ |
| RTL | ❌ |
性能优化亮点:
resolveEdges4Into(): 单次遍历解析 4 条边,避免 4× 调用- 脏标记缓存:
_hasL/_hasM单槽 + 多槽 (_cIn/_cOut, 4 slots) 双层缓存 - Generation stamping:
_fbGen/_cGen避免跨代缓存污染 - Fast-path flags:
_hasAutoMargin,_hasPosition,_hasPadding,_hasBorder,_hasMargin跳过常见无操作 - 基准测试: 1000 节点布局 ~微秒级,500 消息 scrollbox 重排 ~550µs
5. Constants 组织
src/constants/ 包含 21 个文件,全部是纯常量或简单函数定义:
| 文件 | 内容 |
|---|---|
apiLimits.ts | API 速率限制常量 |
betas.ts | Beta 功能标识 |
common.ts | 日期工具函数(getLocalISODate, getSessionStartDate) |
cyberRiskInstruction.ts | 安全风险指令 |
errorIds.ts | 错误 ID 追踪(下一个 ID: 346) |
figures.ts | Unicode 字符常量 |
files.ts | 文件类型常量(二进制检测等) |
github-app.ts | GitHub App 配置 |
keys.ts | GrowthBook client key |
messages.ts | 消息模板常量 |
oauth.ts | OAuth 配置常量 |
outputStyles.ts | 输出样式配置 |
product.ts | 产品 URL(claude.ai、staging) |
prompts.ts | System prompt 生成(914 行,最大的常量文件) |
spinnerVerbs.ts | Spinner 动词 |
system.ts | 系统级常量 |
systemPromptSections.ts | System prompt 段落 |
toolLimits.ts | 工具结果大小限制(50K 字符 / 100K tokens) |
tools.ts | 工具名称集合(agent 允许/禁止列表) |
turnCompletionVerbs.ts | Turn 完成动词 |
xml.ts | XML 标签常量 |
6. Config Schema 模式
6.1 hooks.ts schema
src/schemas/hooks.ts (222 行) 使用 Zod v4 定义 hook 配置的 schema:
// 基础 if 条件 schema — 权限规则语法
const IfConditionSchema = lazySchema(() =>
z.string().optional().describe('Permission rule syntax...')
)
// 三种 hook 类型的判别联合
const BashCommandHookSchema = z.object({
type: z.literal('command'),
command: z.string(),
if: IfConditionSchema(),
shell: z.enum(SHELL_TYPES).optional(),
timeout: z.number().positive().optional(),
once: z.boolean().optional(),
async: z.boolean().optional(),
asyncRewake: z.boolean().optional(), // async + 醒模型
})
const PromptHookSchema = z.object({
type: z.literal('prompt'),
prompt: z.string(),
model: z.string().optional(),
// ...
})
const HttpHookSchema = z.object({
type: z.literal('http'),
url: z.string().url(),
// ...
})
设计特点:
lazySchema()— 延迟加载避免循环依赖- 判别联合 —
type字段区分 hook 类型 - 条件过滤 —
if字段用权限规则语法过滤 hook 触发 - async + asyncRewake — 后台 hook 可以在退出码 2 时唤醒模型
once— 一次性 hook 执行后自动移除
7. 关键设计模式总结
7.1 Bootstrap 隔离规则
state.ts 作为 DAG 叶子节点,只导入 src/utils/crypto.js 和 src/utils/signal.js(通过路径别名绕过 bootstrap 隔离检查)。这保证了无循环依赖。
7.2 平台抽象(Portable 模式)
许多模块提供标准版和 Portable 版,通过 package.json 的 "browser" 字段在构建时切换:
crypto.ts↔crypto.browser.tssessionStorage.ts↔sessionStoragePortable.tsgetWorktreePaths.ts↔getWorktreePathsPortable.ts
7.3 Lazy + Memoize 复合模式
几乎每个重量级依赖(highlight.js、axios、keytar)都通过 memoize() + 延迟 require() 包装:
const getFoo = memoize(() => require('./foo'))
7.4 Feature Gate 模式
使用 bun:bundle 的 feature() 函数进行编译时特性标记:
const teamMemPaths = feature('TEAMMEM') ? require(...) : null
7.5 状态管理的函数式访问
全局状态通过纯函数访问,不暴露对象引用:
export function getCwdState(): string { return STATE.cwd }
export function setCwdState(cwd: string): void { STATE.cwd = cwd.normalize('NFC') }
防止外部直接修改导致规范化遗漏或 NFD/NFC 不一致。
7.6 Native-TS 的性能工程
yoga-layout 和 file-index 都展示了极致的 JS 性能优化:
- TypedArray (
Int32Array,Float64Array,Uint16Array) 替代对象数组 - Bitmap 位运算快速拒绝
- Generation stamping 而非逐个 dirty 清除
- 时间分片(
CHUNK_MS = 4)避免阻塞事件循环