internal/context/builder.go 实现 system prompt 的组装逻辑,对标 TypeScript src/utils/queryContext.ts 和 src/context.ts。

BuildSystemPrompt()

入口函数,返回 SystemPromptParts:

type SystemPromptParts struct {
    SystemPrompt string              // 组装后的完整 system prompt
    UserContext  map[string]string   // 每轮注入:claudeMd, currentDate
    SystemContext map[string]string  // 每轮注入:gitStatus
}

CLAUDE.md 加载(4 级优先级)

从低优先级到高优先级依次加载,后加载的内容在 context 中出现更晚(模型更关注):

优先级来源路径
1(最低)Managed memory/etc/claude-code/CLAUDE.md
2User memory~/.claude/CLAUDE.md
3Project memory<projectDir>/CLAUDE.md、.claude/CLAUDE.md、.claude/rules/*.md(从根目录到 cwd 依次)
4(最高)Local memory<projectDir>/CLAUDE.local.md(从根目录到 cwd 依次)

多个文件内容用 \n\n---\n\n 分隔拼接。

默认 System Prompt 结构

当没有自定义 prompt 时,buildDefaultPrompt() 按如下章节组装:

1. 介绍段(you are an interactive agent...)
2. # System(输出格式、tool 执行规则、hook 提示等)
3. # Doing tasks(任务处理原则,含 PRODUCE_DIR 规则)
4. # Environment(cwd、platform、shell、sessionID、时间)
5. # Session-specific guidance(当有 Skill tool 时注入 skill 使用指引)

动态注入字段

以下内容在每轮请求时动态生成:

字段内容注入方式
currentDate今日日期UserContext → system-reminder
claudeMd合并后的 CLAUDE.mdUserContext → system-reminder
gitStatusgit 状态快照SystemContext → system-reminder

Git 状态包含:当前分支、主分支名、git user、working tree status(最多 2000 字符)、最近 5 条 commit。

PRODUCE_DIR

环境变量 PRODUCE_DIR 指定输出目录,会注入到 Doing tasks 章节:

“When generating output files or artifacts, save them to the Output directory unless explicitly specified.”

相关页面

  • query-engine — BuildSystemPrompt 调用时机
  • skills — skill 指引注入(getSkillGuidanceSection)
  • overview — CLAUDE.md 多级加载机制