Bare 模式:极致的上下文隔离与执行纯净度
在 Claude Code 中,默认的“全能模式”旨在提供无缝的上下文发现体验。然而,对于 CI/CD 脚本、单次独立任务或需要极致启动性能的场景,--bare(或 -p)模式提供了一种完全不同的运行时策略:切断所有自动化装配,回归纯粹的工具执行。
先搞清楚这是什么
--bare 模式本质上是 运行时的“零配置”隔离态。
它不只是一个 UI 开关(尽管它会让界面更清爽),而是一个深刻影响执行链各个环节的标志位。它旨在通过 最小化预加载(Minimize Pre-loading) 来确保执行的可预测性和环境的纯净性。在这种模式下,Claude Code 表现得更像一个传统的、确定性的 CLI 工具,而非一个具有“自主扫描意识”的 AI 项目助手。
实现细节
--bare 模式在代码中通常由 isBareMode() 进行全局判断。它在关键路径上设置了多道“硬闸门”:
切断自动化发现(Zero-Discovery Gate): 在
claude-code-opensource/src/context.ts中,如果探测到isBareMode(),系统会彻底跳过对 CWD(当前工作目录)的递归扫描。这意味着它不会自动搜寻CLAUDE.md、子目录规则文件或本地历史记忆。此时的上下文完全取决于你传入的消息和显式通过--add-dir指定的目录。停用钩子系统(No Hooks Gate): 在
processSessionStartHooks和processSetupHooks中,Bare 模式会导致这些函数直接返回空。这就意味着:- 没有启动脚本注入。
- 没有首轮消息模拟。
- 没有来自插件目录的扩展补丁。 系统的启动响应速度因此被压缩到了极致(通常是毫秒级)。
抑制后台治理(No Bookkeeping Gate): 在
Stop钩子处理过程中,Bare 模式会禁用几乎所有资源消耗型的后台异步任务:- 不预测 Prompt 建议。
- 不进行异步记忆提取(Extract Memories)。
- 不启动“梦境(Auto Dream)”推演逻辑。 这确保了进程在完成主任务后可以立即干净地退出,非常适合管道式(Piping)调用。
环境精简(Environment Stripping): Bare 模式还会导致系统跳过
secureStorage的预取、Auth 状态的深度校验,甚至某些 UI 组件(如提示条、横幅)的渲染层级,确保在无交互环境(Headless)下也能稳健运行。
使用时的关键约束
- “所见即所得”:在 Bare 模式下,Claude 完全不知道你的项目规范,除非你在 Prompt 中显式提供。它不会主动遵守你写在
CLAUDE.md里的任何代码风格。 - 权限闸门依然有效:Bare 模式绝不等于
bypassPermissions(跳过权限审批)。它切断的是“上下文自动装配”,而非“安全治理”。文件访问和 Bash 执行依然受到核心权限模型的约束。 - 配置优先原则:源码中有一条重要逻辑:
--bare意味着“跳过我没要求的自动动作”,而不是“忽略我明确要求的配置”。因此你依然可以配合使用--add-dir或--model。 - 典型场景:它是 CI 流水线、分析单一零散文件、以及将 Claude Code 作为库或工具链一部分时的首选模式。
相关主题
- 如果你想了解如何彻底跳过权限审批,请看 Bypass Permissions:高风险的自动化执行。
- 如果你想了解
--add-dir如何在 Bare 模式下外挂临时上下文,请看 添加工作目录:手动扩展边界。 - 如果你关心 Headless 环境下的行为细节,请看 CLI 启动模式与关键参数:交互与非交互执行。
源码锚点
claude-code-opensource/src/utils/envUtils.ts—isBareMode的定义逻辑(检测-p标志或CLAUDE_CODE_SIMPLE)。
📄 src/utils/envUtils.ts — `isBareMode` 的定义逻辑(检测 `-p` 标志或 `CLAUDE_CODE_SIMPLE`)。L60-65 of 184
export function isBareMode(): boolean {
return (
isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE) ||
process.argv.includes('--bare')
)
}2
3
4
5
6
claude-code-opensource/src/context.ts— 在装配 Context 时通过shouldDisableClaudeMd实施的逻辑切断。
📄 src/context.ts — 在装配 Context 时通过 `shouldDisableClaudeMd` 实施的逻辑切断。L165-182 of 190
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),
})2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
claude-code-opensource/src/utils/sessionStart.ts— 在启动生命周期中跳过钩子的核心闸门。
📄 src/utils/sessionStart.ts — 在启动生命周期中跳过钩子的核心闸门。L13-18 of 233
type SessionStartHooksOptions = {
sessionId?: string
agentType?: string
model?: string
forceSyncExecution?: boolean
}2
3
4
5
6