<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Claude Code on niuzj</title>
    <link>https://niuzj.org/tags/claude-code/</link>
    <description>Recent content in Claude Code on niuzj</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Tue, 14 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://niuzj.org/tags/claude-code/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>翻了 Claude Code 源码，搞明白了 Skill Prompt 该往哪塞</title>
      <link>https://niuzj.org/posts/claude-code-skill-prompt-injection/</link>
      <pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://niuzj.org/posts/claude-code-skill-prompt-injection/</guid>
      <description>&lt;p&gt;做 Agent 做到需要动态加载 prompt 的时候，第一直觉是做成一个 tool——模型识别到场景后调这个 tool，把对应的 prompt 作为 tool result 返回。&lt;/p&gt;&#xA;&lt;p&gt;直觉很自然，但效果一般。模型对 tool result 里的内容遵从度不高，时不时就自己发挥，跳过关键步骤。&lt;/p&gt;&#xA;&lt;p&gt;带着这个问题去翻了 Claude Code 的源码。Claude Code 有一套 Skill 系统，&lt;code&gt;/commit&lt;/code&gt;、&lt;code&gt;/review-pr&lt;/code&gt; 这些斜杠命令背后都是一段完整的 prompt，场景完全一样。它是怎么处理的？&lt;/p&gt;&#xA;&lt;h2 id=&#34;系统提示词是动态拼装的&#34;&gt;系统提示词是动态拼装的&lt;/h2&gt;&#xA;&lt;p&gt;先看系统提示词的架构。Claude Code 的 system prompt 不是一整块文本，而是在 &lt;code&gt;constants/prompts.ts&lt;/code&gt; 的 &lt;code&gt;getSystemPrompt()&lt;/code&gt; 里运行时拼装的：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; [&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// --- 静态部分（跨用户可缓存）---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getSimpleIntroSection&lt;/span&gt;(),        &lt;span style=&#34;color:#75715e&#34;&gt;// 身份&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getSimpleSystemSection&lt;/span&gt;(),       &lt;span style=&#34;color:#75715e&#34;&gt;// 系统规则&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getSimpleDoingTasksSection&lt;/span&gt;(),   &lt;span style=&#34;color:#75715e&#34;&gt;// 任务规则&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getActionsSection&lt;/span&gt;(),            &lt;span style=&#34;color:#75715e&#34;&gt;// 操作安全&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getUsingYourToolsSection&lt;/span&gt;(),     &lt;span style=&#34;color:#75715e&#34;&gt;// 工具使用&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getSimpleToneAndStyleSection&lt;/span&gt;(), &lt;span style=&#34;color:#75715e&#34;&gt;// 语气&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;getOutputEfficiencySection&lt;/span&gt;(),   &lt;span style=&#34;color:#75715e&#34;&gt;// 输出效率&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// === 缓存分界线 ===&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;SYSTEM_PROMPT_DYNAMIC_BOUNDARY&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// --- 动态部分（会话相关）---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;sessionGuidance&lt;/span&gt;,     &lt;span style=&#34;color:#75715e&#34;&gt;// 会话级指引&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;memory&lt;/span&gt;,              &lt;span style=&#34;color:#75715e&#34;&gt;// 记忆&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;envInfo&lt;/span&gt;,             &lt;span style=&#34;color:#75715e&#34;&gt;// 环境信息&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;language&lt;/span&gt;,            &lt;span style=&#34;color:#75715e&#34;&gt;// 语言偏好&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;mcpInstructions&lt;/span&gt;,     &lt;span style=&#34;color:#75715e&#34;&gt;// MCP 服务器指令&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;].&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;s&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;中间那个 &lt;code&gt;SYSTEM_PROMPT_DYNAMIC_BOUNDARY&lt;/code&gt; 是缓存分界线。之前的内容对所有用户一样，命中 prompt cache；之后的内容每个会话可能不同。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
