Skip to content
源码分析手册

Bare 模式:极致的上下文隔离与执行纯净度

在 Claude Code 中,默认的“全能模式”旨在提供无缝的上下文发现体验。然而,对于 CI/CD 脚本、单次独立任务或需要极致启动性能的场景,--bare(或 -p)模式提供了一种完全不同的运行时策略:切断所有自动化装配,回归纯粹的工具执行。

先搞清楚这是什么

--bare 模式本质上是 运行时的“零配置”隔离态

它不只是一个 UI 开关(尽管它会让界面更清爽),而是一个深刻影响执行链各个环节的标志位。它旨在通过 最小化预加载(Minimize Pre-loading) 来确保执行的可预测性和环境的纯净性。在这种模式下,Claude Code 表现得更像一个传统的、确定性的 CLI 工具,而非一个具有“自主扫描意识”的 AI 项目助手。

实现细节

--bare 模式在代码中通常由 isBareMode() 进行全局判断。它在关键路径上设置了多道“硬闸门”:

  1. 切断自动化发现(Zero-Discovery Gate): 在 claude-code-opensource/src/context.ts 中,如果探测到 isBareMode(),系统会彻底跳过对 CWD(当前工作目录)的递归扫描。这意味着它不会自动搜寻 CLAUDE.md、子目录规则文件或本地历史记忆。此时的上下文完全取决于你传入的消息和显式通过 --add-dir 指定的目录。

  2. 停用钩子系统(No Hooks Gate): 在 processSessionStartHooksprocessSetupHooks 中,Bare 模式会导致这些函数直接返回空。这就意味着:

    • 没有启动脚本注入。
    • 没有首轮消息模拟。
    • 没有来自插件目录的扩展补丁。 系统的启动响应速度因此被压缩到了极致(通常是毫秒级)。
  3. 抑制后台治理(No Bookkeeping Gate): 在 Stop 钩子处理过程中,Bare 模式会禁用几乎所有资源消耗型的后台异步任务:

    • 不预测 Prompt 建议。
    • 不进行异步记忆提取(Extract Memories)。
    • 不启动“梦境(Auto Dream)”推演逻辑。 这确保了进程在完成主任务后可以立即干净地退出,非常适合管道式(Piping)调用。
  4. 环境精简(Environment Stripping): Bare 模式还会导致系统跳过 secureStorage 的预取、Auth 状态的深度校验,甚至某些 UI 组件(如提示条、横幅)的渲染层级,确保在无交互环境(Headless)下也能稳健运行。

使用时的关键约束

  • “所见即所得”:在 Bare 模式下,Claude 完全不知道你的项目规范,除非你在 Prompt 中显式提供。它不会主动遵守你写在 CLAUDE.md 里的任何代码风格。
  • 权限闸门依然有效:Bare 模式绝不等于 bypassPermissions(跳过权限审批)。它切断的是“上下文自动装配”,而非“安全治理”。文件访问和 Bash 执行依然受到核心权限模型的约束。
  • 配置优先原则:源码中有一条重要逻辑:--bare 意味着“跳过我没要求的自动动作”,而不是“忽略我明确要求的配置”。因此你依然可以配合使用 --add-dir--model
  • 典型场景:它是 CI 流水线、分析单一零散文件、以及将 Claude Code 作为库或工具链一部分时的首选模式。

相关主题

源码锚点

  • claude-code-opensource/src/utils/envUtils.tsisBareMode 的定义逻辑(检测 -p 标志或 CLAUDE_CODE_SIMPLE)。
📄 src/utils/envUtils.ts — `isBareMode` 的定义逻辑(检测 `-p` 标志或 `CLAUDE_CODE_SIMPLE`)。L60-65 of 184
typescript
export function isBareMode(): boolean {
  return (
    isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE) ||
    process.argv.includes('--bare')
  )
}
  • claude-code-opensource/src/context.ts — 在装配 Context 时通过 shouldDisableClaudeMd 实施的逻辑切断。
📄 src/context.ts — 在装配 Context 时通过 `shouldDisableClaudeMd` 实施的逻辑切断。L165-182 of 190
typescript
    const shouldDisableClaudeMd =
      isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_CLAUDE_MDS) ||
      (isBareMode() && getAdditionalDirectoriesForClaudeMd().length === 0)
    // Await the async I/O (readFile/readdir directory walk) so the event
    // loop yields naturally at the first fs.readFile.
    const claudeMd = shouldDisableClaudeMd
      ? null
      : getClaudeMds(filterInjectedMemoryFiles(await getMemoryFiles()))
    // Cache for the auto-mode classifier (yoloClassifier.ts reads this
    // instead of importing claudemd.ts directly, which would create a
    // cycle through permissions/filesystem → permissions → yoloClassifier).
    setCachedClaudeMdContent(claudeMd || null)

    logForDiagnosticsNoPII('info', 'user_context_completed', {
      duration_ms: Date.now() - startTime,
      claudemd_length: claudeMd?.length ?? 0,
      claudemd_disabled: Boolean(shouldDisableClaudeMd),
    })
  • claude-code-opensource/src/utils/sessionStart.ts — 在启动生命周期中跳过钩子的核心闸门。
📄 src/utils/sessionStart.ts — 在启动生命周期中跳过钩子的核心闸门。L13-18 of 233
typescript
type SessionStartHooksOptions = {
  sessionId?: string
  agentType?: string
  model?: string
  forceSyncExecution?: boolean
}

基于 Claude Code v2.1.88 开源快照的深度分析