Claude Media
append-system-promptとsystem-promptの違い(Claude Code)

append-system-promptとsystem-promptの違い(Claude Code)

追記する--append-system-promptと丸ごと置き換える--system-prompt。併用時の結合順と--system-prompt-snapshotの再構築制御まで、v2.1.287の実機出力つきで解説します。

append-system-promptとsystem-promptの違い

claudeコマンドにはシステムプロンプトをカスタマイズするフラグが5つあり、そのうち4つが実際にテキストを設定します。--append-system-promptはデフォルトのシステムプロンプトの末尾にテキストを追記し、--system-promptはデフォルトのプロンプト全体を渡した文字列で置き換えます。どちらもインタラクティブモードと-p(非インタラクティブ)モードの両方で使えます。

claude --append-system-prompt "Always use TypeScript"
claude --system-prompt "You are a Python expert"

追記か置換かで、Claude Codeのデフォルトの振る舞いをどこまで残すかが決まります。

くらべる

追記と置換で残るもの・消えるもの

デフォルトを残す

追記(--append-system-prompt)

ツールの使い方のガイダンス、安全に関する指示、コーディング規約がそのまま残り、指定したテキストが末尾に足されます。1回の呼び出しごとの指示、出力フォーマットの指定、-pスクリプトへのドメイン知識の付与に向きます。

デフォルトを捨てる

置換(--system-prompt)

渡した文字列だけがシステムプロンプトになります。ツールガイダンスも安全指示も消えるので、タスクに必要な指示は自分で書き切る必要があります。人間が監視しないパイプラインや、コーディング以外のタスクを担うエージェントが対象です。

5つのフラグと役割の対応表

CLIリファレンスは、システムプロンプトを操作するフラグを次の5つに分けています。

フラグ挙動
--system-prompt挙動デフォルトのプロンプト全体を置き換える
--system-prompt-file挙動ファイルの内容で置き換える
--append-system-prompt挙動デフォルトのプロンプトに追記する
--append-system-prompt-file挙動ファイルの内容をデフォルトのプロンプトに追記する
--system-prompt-snapshot挙動offで毎リクエスト再構築、既定のonでは記録されたプロンプトを再利用する

テキスト版とファイル版の違いは、コマンドラインに直接書くか、ファイルから読むかだけです。置換系は置換、追記系は追記という挙動は変わりません。長文や共有ルールを置きたいときは、--append-system-prompt-fileが代替手段になります。

置換と追記は組み合わせられます。デフォルトを置き換えたうえで自分のテキストも足したいときは、置換系と追記系を一緒に渡します。置換は--system-promptか--system-prompt-file、追記は--append-system-promptか--append-system-prompt-fileです。

手元のv2.1.287でclaude --helpを絞り込むと、追記と置換の説明は次のように出ます。

claude --help | grep -A1 -e "--append-system-prompt " -e "--system-prompt "
  --append-system-prompt <prompt>       Append a system prompt to the default
                                        system prompt
--
  --system-prompt <prompt>              System prompt to use for the session

どちらを選ぶか

判断の軸は、Claude Codeのデフォルトの人格がその用途に合っているかどうかです。コーディングアシスタントのまま追加ルールを守らせたいなら追記、立場や権限モデルがClaude Codeの前提と違うなら置換です。

永続的なペルソナをプロジェクト内で切り替えたり共有したりしたい場合は、CLIフラグではなくoutput styleが候補です。プロジェクト共通で常に守らせたい規約は、システムプロンプトではなくCLAUDE.mdに書く方法もあります。-pモードでの自動化スクリプト全般の作法はheadless実行のガイドにあります。

テキスト版とファイル版を併用したときの結合順

v2.1.283で、--system-promptと--append-system-promptは、それぞれのテキスト形とファイル形を同時に渡せるように変わりました。両方を渡すと、Claude Codeは両方を使います。

手順

追記フラグを2つ渡したときの結合順

  1. 1

    デフォルトのシステムプロンプト

    置換フラグを付けていなければ、土台はこれです。

  2. 2

    -file の中身

    --append-system-prompt-fileで渡したファイルの内容が先に来ます。

  3. 3

    空行

    ファイルの内容と直書きのテキストの間に、空行が1つ入ります。

  4. 4

    直書きのテキスト

    --append-system-promptで渡した文字列が最後に来ます。

順序はコマンドラインに書いた順では決まりません。--append-system-promptを先に書いても、ファイルの内容が先に並びます。

claude -p --append-system-prompt-file ./style.md \
  --append-system-prompt "Always reply in French" "Summarize README.md"

チームで共有するstyle.mdに共通ルールを置き、その場限りの指示だけを直書きで足す使い方になります。

置換するときは「固定部分」と「変わる部分」を分ける

置換用のテキストに、毎回同じ指示と、実行ごとに変わる文脈が混ざることがあります。その間に__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__だけを書いた行を置くと、Claude Codeは最初のその行でプロンプトを分け、その行自体を取り除きます。

You are a support triage agent. Classify each ticket as bug, billing, or how-to.
Reply with one label only.
__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__
Ticket: #4821 — customer reports a duplicate charge

境界より上はキャッシュされたまま残り、下だけが実行ごとに変わります。v2.1.275以降が必要です。同じ動作はTypeScript SDKでは配列形式のSYSTEM_PROMPT_DYNAMIC_BOUNDARYで書けます。Python SDKに配列形式はありません。CLIの--system-prompt系は1つの文字列なので、マーカー行で代用する形です。

同じv2.1.275の更新履歴には、境界行を含む--system-promptで、境界より上のテキストがユーザーやマシンをまたいでキャッシュされるようになったとあります。

Agent SDKでは同じ操作をどう書くか

CLIのフラグには、Agent SDKのsystemPromptオプションに対応する書き方があります。追記はsystemPrompt: { type: "preset", preset: "claude_code", append: "..." }、置換は文字列をそのまま渡す形です。Pythonでファイルを渡すときはsystem_prompt={"type": "file", "path": "..."}と書きます。

systemPromptを指定しないと、SDKはツール呼び出しだけを扱う最小限のプロンプトを使います。claude_codeプリセットにある安全に関する指示などは入りません。この点は、既定でClaude Codeのシステムプロンプトを使うclaude -pとは違います。

CLIのフラグと同名の機能も、SDK側にあります。

  • スナップショットの無効化: オブジェクト形でsnapshotをfalseにします。@anthropic-ai/claude-agent-sdkはv0.3.257以降、Pythonのclaude-agent-sdkはv0.2.153以降が必要です
  • 動的セクションの除外: TypeScriptではexcludeDynamicSections: true、Pythonでは"exclude_dynamic_sections": Trueを渡します。TypeScript SDKはv0.2.98以降、Pythonはv0.1.58以降で、プリセット形でのみ有効です。カスタム文字列では無視されます

サブエージェントのシステムプロンプトは別フラグ

--append-system-promptと--system-promptが操作するのは、メインの会話のシステムプロンプトです。サブエージェント側を足したいときは--append-subagent-system-prompt(ファイル版は--append-subagent-system-prompt-file)を使います。

ネストしたサブエージェントにも効きますが、会話をフォークしたサブエージェント(forked subagent)は元の会話のプロンプトを引き継ぐため対象外です。非インタラクティブモード(-p)でだけ働きます。ファイル版とテキスト版は同時に使えません。

claude -p --append-subagent-system-prompt "Cite file paths in every answer" "query"

必要なバージョンは、テキスト版がv2.1.205以降、ファイル版がv2.1.261以降です。サブエージェントの定義・並列実行の設計そのものはSub-agents完全ガイドで扱っています。

除外できるのはプロンプトの一部だけ

--exclude-dynamic-system-prompt-sectionsは、追記・置換とは目的が違うフラグです。作業ディレクトリ、環境情報、メモリのパス、git statusといったマシンごとに変わる部分を、システムプロンプトから最初のユーザーメッセージへ移します。同じタスクを複数のユーザーや複数のマシンで実行するとき、プロンプトキャッシュを使い回しやすくなります。

デフォルトのシステムプロンプトを使うときだけ働き、--system-promptまたは--system-prompt-fileを指定していると無視されます。-pと組み合わせる想定のフラグです。--helpの説明はこうです。

  --exclude-dynamic-system-prompt-sections
      Move per-machine sections (cwd, env info, memory paths, git status) from
      the system prompt into the first user message. Improves cross-user
      prompt-cache reuse. Only applies with the default system prompt (ignored
      with --system-prompt). (default: false)

再開したセッションでの挙動 — snapshotフラグの役割

システムプロンプトのカスタマイズで見落としやすいのが、変更が反映されるタイミングです。Claude Codeは既定で、会話の最初のリクエスト時にシステムプロンプトを一度だけ構築し、セッションに記録します。フラグで指定したテキストも、この時点で組み込まれます。

くらべる

`--continue`で別のテキストを渡したとき

記録を使い回す

既定(snapshot on)

--resumeや--continueで戻った後も、記録済みのプロンプトが送られ続けます。別のフラグのテキストを渡しても、何も渡さなくても、会話がコンパクションされるか新しい会話を始めるまで反映されません。

毎回つくり直す

--system-prompt-snapshot off

リクエストのたびにプロンプトを組み立て直します。--append-system-promptの文面を--continueのたびに試行錯誤したいときの設定です。

--helpはこの動作を次のように説明しています(v2.1.287)。

  --system-prompt-snapshot <on|off>     Record the system prompt once per
                                        conversation and reuse it verbatim on
                                        every request and resume. on (the
                                        default): the prompt is rendered on the
                                        conversation's first request — a
                                        --system-prompt or
                                        --append-system-prompt included — sent,
                                        and recorded; every later request and
                                        resume sends the record as-is, even when
                                        a later launch passes different text,
                                        until the conversation is compacted.
                                        off: never record; the prompt is
                                        rendered fresh every request (for
                                        iterating on prompt text). No effect
                                        where system-prompt recording is not yet
                                        enabled. (choices: "on", "off")
claude --append-system-prompt "Draft rules" --system-prompt-snapshot off

--resumeとの使い分けそのものはresumeとforkの違いで扱っています。

bare mode(--bareまたはCLAUDE_CODE_SIMPLE=1)で起動すると、記録が既定でオフになります。クラウドセッションは対象外です。--system-prompt-snapshot onを明示すれば記録されます。v2.1.268より前は、フィーチャーフラグを取得しないセッションがリクエストのたびにプロンプトを再構築していました。Amazon Bedrock、Google CloudのAgent Platform、Microsoft Foundryのセッションがその例です。この期間、--system-prompt-snapshotは効果を持ちません。

--agentフラグとの違い

混同しやすいのが--agentです。定義済みのエージェントをセッションに選ぶフラグです。--helpの説明は「Agent for the current session. Overrides the 'agent' setting.」です。--system-prompt系は、テキストそのものを渡してプロンプトを組み立てます。

バージョン要件早見表

システムプロンプト関連のフラグは追加された時期がばらばらです。古いClaude Codeでは、一部が使えません。

機能必要バージョン
--append-subagent-system-prompt必要バージョンv2.1.205以降
--append-subagent-system-prompt-file必要バージョンv2.1.261以降
--system-prompt-snapshotフラグ自体必要バージョンv2.1.257以降(CLIリファレンスの記載)
システムプロンプトのフラグを渡しても既定で記録される(以前は--system-prompt-snapshot onの明示が必要)必要バージョンv2.1.265以降
フィーチャーフラグを取得しない環境でもsnapshotが機能必要バージョンv2.1.268以降
__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__による分割必要バージョンv2.1.275以降
テキスト形とファイル形の併用(追記フラグでは-fileが先に並ぶ)必要バージョンv2.1.283以降

--system-prompt-snapshotの版数は、公式の2ページで食い違っています。CLIリファレンスはv2.1.257以降と書き、更新履歴で--system-prompt-snapshot offの追加が載っているのはv2.1.267です。v2.1.257からv2.1.266で使えないときは、この差が原因の可能性があります。確実に使うならv2.1.267以降です。

手元の挙動が本記事と違うときは、まずclaude --versionで版を確かめます。更新履歴の追い方はClaude Codeの変更履歴をどこで確認するかにまとめています。

ラッパーやフックから渡すとき

セルフホストランナーでは、v2.1.281からシステムプロンプトがコマンドライン上の文字列ではなく非公開のファイルとして渡されます。長いプロンプトで起動に失敗する問題を避けるための変更です。ラッパーやcommandフックが--system-promptや--append-system-promptを付け足しているなら、切り替えが必要です。ファイル版の--system-prompt-fileか--append-system-prompt-fileを使います。

まとめ

追記か置換かは二択ではなく、置換したうえで追記を足す組み合わせもあります。CLIからSDKへ処理を移すときは、systemPromptを省くとclaude_codeプリセットの安全指示が入らない点が判断の分かれ目になります。

参照した一次ソース

この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。

  1. code.claude.com/docs/en/cli-reference
  2. code.claude.com/docs/en/changelog
  3. code.claude.com/docs/en/agent-sdk/modifying-system-prompts
この記事を共有:XはてブLinkedIn