Claude Code を CI や自動化スクリプトから叩いて、特定の会話IDを自分で割り当てて後で開き直したい人向け
CI や夜間バッチから Claude Code を呼び出していて、後から特定の会話を狙い撃ちで開き直したい場面で叩く。たとえば記事レビューやバグ票処理で「対象ファイル名」と「会話ID」を対応表に残しておき、翌日その会話を claude --resume <UUID> で続きから再開したいときに、起動時点で自分側でUUIDを採番して渡しておく
Claude Code を CI(自動でビルドや検査を回す仕組み)や夜間バッチから叩いていると、後で「あの会話、もう一回開きたい」と思っても、どのIDで動いたか分からなくて開けないことが結構あります。普段の対話モードなら --resume で picker(履歴一覧画面)から選べばいいんですが、claude -p や Agent SDK 経由のセッションは picker に出てきません。
そこで使えるのが --session-id です。会話のIDを自分で指定してから起動できるので、後で「このIDの会話を再開」と狙い撃ちで戻れるようになります。
噛み砕くと
新しい職場で席に着いた初日に「あなたの社員番号は今日から 550e8400-... です」と自分で宣言してから働き始めるイメージです。普段は受付が勝手に番号を振ってくれますが、自分で番号を持ち込めば、人事システムの一覧に出てこない契約形態でも、後から「あの社員番号の作業ログを開いて」と検索できます。
つまり「会話の住所をこっちで決めて教える」やり方です。
大事な前提:「会話のID」は UUID 形式じゃないと受け付けてくれない
このコマンドが一番ハマるポイントが UUID 形式の縛りです。公式は "must be a valid UUID" と書いていて、session-001 や my-blog-review のような自分で命名した文字列は通りません。
UUID とは「8桁-4桁-4桁-4桁-12桁」の決まった形式です。たとえばこういう見た目になります。
550e8400-e29b-41d4-a716-446655440000
Macなら uuidgen を打てば1個もらえます。
人が読みやすい「auth-refactor」みたいな名前を付けたい場合は --session-id ではなく --name の方を使う、と覚えておくと混乱しません。
「料理ブログの新着レシピレビュー」を例に、実際の手順を見る
毎週新しいレシピ記事を10本くらい入稿していて、AI に下読みレビューさせたい、という想定です。記事ごとに会話のIDを決め打ちしておけば、後日「先週レビューしたレシピ005の続き」をピンポイントで開ける運用になります。
ステップ1: まず普通に1本レビューさせて、自動で割り振られたIDを確認する
最初は --session-id を付けず、普通に起動して中身の感触をつかみます。Claude Code は会話に勝手にIDを振っていて、出力形式を JSON にすると session_id という項目に乗ってきます。
$ claude -p "recipe-001.md をレビューして、改善点を3つ出して" --output-format json
{
"session_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"result": "1. 分量の単位が大さじと grams で混在...",
...
}
この f47ac10b-... が今回の会話の住所です。後で claude --resume f47ac10b-58cc-4372-a567-0e02b2c3d479 と打てば、この会話に戻れます。
ステップ2: 自分でIDを採番して、そのIDで起動する
CI から回す場合、IDを後から拾うより「先にこっちで採番してログに残す」方が運用が楽です。Bashなら uuidgen で1本作れます。
$ UUID=$(uuidgen | tr 'A-Z' 'a-z')
$ echo $UUID
9b2d4c11-8e6f-4a3b-9c2e-5d7f1a8b6c43
$ claude -p "recipe-002.md をレビューして、改善点を3つ出して" \
--session-id "$UUID" \
--output-format json
これで「recipe-002.md のレビュー会話 = 9b2d4c11-...」という対応がCI側で確定します。
ステップ3: 採番したIDをDBやCSVに記録しておく
レシピのファイル名と会話のIDをペアでログに残します。これがないと後から「あのレシピの会話、IDなんだっけ」になります。
recipe-002.md, 9b2d4c11-8e6f-4a3b-9c2e-5d7f1a8b6c43, 2026-05-17
recipe-003.md, 7c1a9d22-3b4e-4c8f-a1d2-6e9b3f5a8c71, 2026-05-17
ステップ4: 翌日、特定のレシピだけ会話を再開する
「recipe-002 のレビュー結果に追加の質問をしたい」となったら、CSVから該当のIDを引いて --resume に渡します。
$ claude --resume 9b2d4c11-8e6f-4a3b-9c2e-5d7f1a8b6c43 \
"前回の指摘1番目について、具体的な書き直し案を出して"
前回の会話の文脈をそのまま引き継いで、続きから話せます。-p 由来の会話は公式の sessions ドキュメントに「picker には出てこない」と明記されているので、このやり方で開かないと辿り着けません。
ステップ5: 会話履歴がディスクのどこに保存されているか確認する
会話の中身は ~/.claude/projects/<プロジェクト名>/<UUID>.jsonl という1ファイルにまとまっています。プロジェクト名は作業フォルダの場所から自動で決まります。
$ ls ~/.claude/projects/-Users-yourname-cooking-blog/
9b2d4c11-8e6f-4a3b-9c2e-5d7f1a8b6c43.jsonl
7c1a9d22-3b4e-4c8f-a1d2-6e9b3f5a8c71.jsonl
f47ac10b-58cc-4372-a567-0e02b2c3d479.jsonl
ここで初心者がやりがちな勘違いがある。UUID を新しく振り直すと、上のファイルが上書きされたり中身が混ざったりするんじゃないか、と心配する人がいます。違います。UUID を変えると別の新規ファイルが作られるだけで、過去のファイルは触られません。混ぜたくないなら新しいUUIDを、足したいなら既存UUIDで --resume、と覚えておけば事故りません。
ステップ6: 保存先の特殊事情を把握しておく
保存先には2つだけクセがあります。
1つ目。保存場所を ~/.claude ではなく別フォルダにしたい場合は、CLAUDE_CONFIG_DIR という設定値を上書きします。これでCIマシン専用の保管場所を切れます。
2つ目。会話ファイルは 30日経つと自動で削除されます。長期保存したいなら cleanupPeriodDays という設定で日数を伸ばすか、定期的に別ストレージへコピーする運用が必要です。
つまり --session-id は何をしてくれるのか
- やってくれる: 会話の住所(UUID)を起動時にこっちから指定する。指定したIDで会話履歴ファイル
<UUID>.jsonlが作られる。後で--resume <UUID>で同じ会話に戻れる - やってくれない: 既に存在するIDを指定したときの挙動は公式リファレンスに書かれていない。上書き・追記・拒否のどれが起きるか未確定なので、意図せず同じIDを2回叩くのは避けたほうが安全
- 意味が薄い場面: 普通に対話モードで使うだけで、後でCIから狙い撃ちで開く予定がない場合。
--nameで人間が読める名前を付けるほうが picker から探しやすい
使いどころ3シナリオ(具体題材で再現)
シナリオ1: 料理ブログの新着レシピを CI で下読みさせる
GitHub Actions などで「recipes/ フォルダに新しい .md が追加されたら Claude にレビューさせる」ワークフローを組むケース。記事ごとにCI側でUUIDを採番して --session-id に渡し、ファイル名とUUIDをスプレッドシートに記録します。翌日エディタ担当が「recipe-005の指摘、もう少し掘って」と思ったら、スプレッドシートからUUIDを引いて claude --resume <UUID> で会話の続きから入れる、という運用ができます。
シナリオ2: 家計簿アプリのバグ修正で「再現させてみた会話」を後から開きたい
夜間バッチで「今日報告されたバグ票を Claude に読ませて、再現手順を起こす」処理を回したい、という場面。バグ票のID BUG-1234 から決まったルールで UUID を作って --session-id に渡しておけば、後日 PM が「BUG-1234 を Claude にどう説明したっけ」と思った瞬間に、バグ票IDから UUID を逆算して会話を開けます。バグ票ID→UUID の対応表を SaaS側 DB に1列足すだけで、追跡しやすいログが残ります。
シナリオ3: OSS の脆弱性チェックを定期実行で回す
毎週月曜の朝、依存パッケージの脆弱性レポートを Claude に読ませて「うちのコードベースで影響あるかどうか」を判定させる、という運用。CVE 番号ごとにUUIDを採番して --session-id 付きで起動すれば、後日「CVE-2026-XXXX、Claudeはどう判断してた?」が即座に再生できます。-p から起動する非対話セッションは picker に出ないので、このやり方でIDを外に出しておかないと、判断の根拠を後から見返せず、結局もう一度同じ質問を投げ直すハメになります。
初心者が踏みやすい落とし穴
- UUID 以外の文字列はそのまま拒否される。
--session-id "recipe-001"や--session-id "abc123"は通らない。公式リファレンスにも valid UUID の指定が必須と明記されている。人が読める名前を付けたい場合は--nameの方を使う - 同じUUIDで何度も叩いてもセッションが累積するわけではない。新しい会話を作るだけのつもりで毎回違うUUIDを渡すと、当然それは別々の会話になる。続きを話したいなら
--session-idではなく--resume <UUID>を使う --no-session-persistenceと一緒に使うと履歴が残らない。IDを指定したのにディスクに保存されない、という矛盾構成になる。両方付けるのは設定ミスのサイン- 30日経つと会話ファイルは自動削除される。長期保存したい用途、たとえば監査ログや過去事例の引き出しでは
cleanupPeriodDaysを伸ばすか、別ストレージへコピーする運用を組まないと、後から開こうとしたときにファイルが消えていて空振りする - 既存のUUIDをそのまま
--session-idに渡したときの挙動は公式に書かれていない。上書きか追記か拒否か未確定なので、新規セッションを作るたびに新しいUUIDを採番するのが安全 - 会話履歴の保存先はプロジェクトフォルダごとに分かれている。
~/.claude/projects/<プロジェクト名>/<UUID>.jsonlのプロジェクト名部分は作業フォルダの場所から自動生成される。別フォルダから同じUUIDで起動しても、別の場所に別ファイルができるだけで、共有はされない - 会話の分岐(ブランチ)が欲しいなら
--fork-sessionの方。既存の会話から枝分かれして新しいUUIDの会話を作りたい場合は、--session-idではなく--resume <UUID> --fork-sessionの組み合わせを使う
書き方
claude --session-id "<UUID形式の文字列>"
やってみるとこうなる
入力
claude -p "recipe-001.md をレビューして" --session-id "550e8400-e29b-41d4-a716-446655440000" --output-format json
出力例
{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"result": "レビュー結果...",
...
}
会話履歴は ~/.claude/projects/<プロジェクト名>/550e8400-e29b-41d4-a716-446655440000.jsonl に保存される。後で claude --resume 550e8400-e29b-41d4-a716-446655440000 で続きから再開できる
このページに出てきた言葉
- UUID
- 世界中で被らないように設計された識別子の形式。「8桁-4桁-4桁-4桁-12桁」の決まった形。例: <code>550e8400-e29b-41d4-a716-446655440000</code>。Macなら <code>uuidgen</code> コマンドで1個もらえる
- セッション
- Claude Code との1回分の会話のかたまり。質問と返答のやり取り一式が1セッションで、ディスクに <code><UUID>.jsonl</code> という1ファイルにまとめて保存される
- CI
- 「Continuous Integration」の略。コードを更新するたびに自動でテストやビルドを走らせる仕組み。GitHub Actions などが代表例
- 非対話モード
- 人がキーボードを叩くのではなく、スクリプトの中から1回だけ質問して答えを受け取る使い方。<code>claude -p "質問"</code> の形で起動する
- JSONL
- 1行ごとに JSON データが入っているファイル形式。<code>.jsonl</code> という拡張子で、1行1メッセージで会話履歴が並んでいる
- CLAUDE_CONFIG_DIR
- パソコンが起動時に覚えてる設定値の1つで、Claude Code が会話履歴や設定を保存するフォルダ場所を指定する
- cleanupPeriodDays
- settings.json で指定できる項目で、何日経った会話履歴を消すかを決める。標準は30日