[Claude Code] CLI と SDK でセッションを継続する
Introduction
以前の記事では、Claude Code SDKで会話を継続する方法について紹介しました。
これはSDKでの継続方法ですが、Claude Code CLIでの作業をSDKで継続する方法もあります。
ここで、
「Claude Codeは自身のメタデータに直接アクセスできないけどhooksとかでとれるよ」とのやりとりがありました。
これを参考にして、本記事ではCLIで実施した作業をSDKで継続してみます。
Environment
- MacBook Pro (14-inch, M3, 2023)
- OS : MacOS 14.5
- Claude Code SDK: v1.0.85
- Node.js: v20.x
- jq : 1.8.1
Session ID?
Claude Codeは、各会話に対して以下のような一意のセッションIDを割り当てます。
#example session id
67dc7d72-2fee-4bc8-806d-6a5b1638ef95
このIDを使用することで、処理を中断してもそれまでのコンテキストを
維持した状態で処理を再開できます。
これができれば、なんらかの理由で作業を中断しても、後で正確に継続することが可能です。
また、CLIで開始した作業をSDK経由のプログラムで引き継げます。
Try
では実際にデモを作成して試してみましょう。
hooksを使ってSessionIdをログに出力し、そのIDをSDKで指定してコンテキストを引き継げるか確認します。
プロジェクトを作成する
まずは任意のデモ用プロジェクトを以下の構造で作成します。
your-project/
├── .claude/
│ ├── settings.json # フック設定
│ └── hooks/
│ └── save-session.sh # セッション保存スクリプト
├── .work/
│ └── sessions/ # セッション情報保存用(自動作成)
│ ├── latest.json # 最新のセッション情報
│ ├── {session_id}.json # 個別セッション情報
│ └── history.log # セッション履歴
└── any_directory/ # このリポジトリのコード本体
├── hoge.ts
└── fuga.js
.claude/hooksディレクトリを作成し、
後述するシェルとsettings.jsonを作成します。
作成したら、とりあえずclaudeを起動して/initだけしておきましょう。
hooksの設定
Claude CodeのhooksはClaude Codeがツール実行や処理中断など、いくつか定義されている処理の前後に、自動で実行させることができる拡張処理です。
まずはセッションIDを保存するための、
hooksから実行されるスクリプト(.claude/hooks/save-session.sh)
を作成します。
このスクリプトは各プロンプト送信時に自動的にセッション情報を保存します。
(jq使うのであらかじめインストールしておいてください)
#!/bin/bash
INPUT=$(cat)
# JSONから必要な情報を抽出
SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty')
CWD=$(echo "$INPUT" | jq -r '.cwd // empty')
# 会話履歴ファイルのパス
TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path // empty')
# timestamp
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
if [ -n "$SESSION_ID" ]; then
# セッション情報をJSON形式で構造化
SESSION_DATA=$(jq -n \
--arg id "$SESSION_ID" \
--arg cwd "$CWD" \
--arg transcript "$TRANSCRIPT_PATH" \
--arg ts "$TIMESTAMP" \
'{
sessionId: $id,
workingDirectory: $cwd,
transcriptPath: $transcript,
timestamp: $ts
}')
# セッション情報を保存
# プロジェクトルートの.work/sessionsディレクトリに保存
SESSIONS_DIR="${CLAUDE_PROJECT_DIR}/.work/sessions"
mkdir -p "$SESSIONS_DIR"
# 最新のセッション情報として保存
echo "$SESSION_DATA" > "$SESSIONS_DIR/latest.json"
# セッションIDごとに個別ファイルとして保存
echo "$SESSION_DATA" > "$SESSIONS_DIR/${SESSION_ID}.json"
# ログファイルに記録
echo "[$TIMESTAMP] Session: $SESSION_ID | CWD: $CWD" >> "$SESSIONS_DIR/history.log"
# 成功メッセージをstderr出力
echo "📝 Session ID saved: $SESSION_ID" >&2
fi
exit 0
${CLAUDE_PROJECT_DIR}
はClaude Codeが提供する環境変数で、対象プロジェクトのパスを表します。
このシェルが実行されると、${CLAUDE_PROJECT_DIR}/.work/sessions/
にて
以下のファイルが作成・更新されます。
- latest.json : 最新のセッション情報(上書き更新)
- {session_id}.json : 個別セッション情報(履歴保存用)
- history.log : 全セッションの実行ログ
次に、.claude/settings.json
を作成して以下のように記述しましょう。
save-session.shをUserPromptSubmit(ユーザーがCLIでプロンプトを送信した時)のタイミングで実行されるようにします。
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/save-session.sh"
}
]
}
]
}
}
実行できるように権限も付与しておきましょう。
% chmod +x .claude/hooks/save-session.sh
Claude Code SDKのプログラム作成
SDKでClaude Codeを実行するためのプログラムを作成します。
% mkdir path/your/sdk-demo && cd path/your/sdk-demo
% npm init -y
npm install @anthropic-ai/claude-code@^1.0.85 dotenv chalk typescript tsx @types/node
package.jsonは以下。
{
"name": "sdk-continue",
"version": "1.0.0",
"scripts": {
"verify": "tsx verify-session.ts"
},
"dependencies": {
"@anthropic-ai/claude-code": "^1.0.85",
"dotenv": "^16.3.1",
"chalk": "^5.3.0"
},
"devDependencies": {
"@types/node": "^20.10.0",
"tsx": "^4.6.2",
"typescript": "^5.3.3"
}
}
verify-session.ts
を作成します。
import { query } from '@anthropic-ai/claude-code';
import * as dotenv from 'dotenv';
dotenv.config();
async function verifySession(sessionId: string, workingDir?: string) {
console.log(' ** CLIセッション継続テスト ** ');
console.log(`Session ID: ${sessionId}`);
if (workingDir) {
console.log(`Working Directory: ${workingDir}`);
}
console.log('='.repeat(60));
const prompt =
"これまでの会話の要約と、実施した作業内容を教えてください。";
try {
let responseText = '';
for await (const message of query({
prompt,
options: {
resume: sessionId, //CLIのセッションIDを渡す
cwd: workingDir || process.cwd(),
}
})) {
if (message.type === 'assistant' && message.message?.content) {
const content = message.message.content;
if (Array.isArray(content)) {
content.forEach((item: any) => {
if (item.type === 'text') {
responseText += item.text;
}
});
}
} else if (message.type === 'completion') {
console.log('\n 応答:');
console.log(responseText);
}
}
console.log('\n✨ セッション継続テスト完了');
} catch (error) {
console.error('エラー:', error);
}
}
// メイン実行
const sessionId = process.argv[2];
const workingDir = process.argv[3];
verifySession(sessionId, workingDir).catch(console.error);
あとは、SDKでClaude Codeが使えるよう、ClaudeのAPIキーを取得して
.envにANTHROPIC_API_KEYを記述してください。
CLIとSDKを動かしてみる
CLIで適当な指示を出します。(VSCodeからでもOK)
% cd path/your-project
% claude
> 適当なテキストファイルを作成してください
.work/sessionsをみてみましょう。
history.jsonやlatest.jsonが更新されてます。
{
"sessionId": "xxxxxx",
"workingDirectory": "/path/your/project",
"transcriptPath": "・・・・.jsonl",
"timestamp": "2025-08-20T05:47:06Z"
}
このsessionIdをコピーして、先ほど作成したverify-session.tsを実行します。
プログラムではいままでの会話内容を教えてもらうように指示します。
% npm run verify xxxxxx /path/your/project
・・・・
** CLIセッション継続テスト **
Session ID: xxxxxx
Working Directory: xxxxx
============================================================
プロンプト 1:
これまでの会話の要約と、実施した作業内容を教えてください。
------------------------------------------------------------
## 会話の要約
ユーザーから次に実装すべき機能について質問を受け、現在のコードベースを分析して機能提案を行いました。その後、テスト用のテキストファイル作成を依頼されました。
## 実施した作業内容
1. **プロジェクトの現状把握**
- README.mdを読み、プロジェクトの概要と機能を確認
- CHANGELOG.mdを確認し、これまでの実装履歴を把握
2. **次期実装機能の提案**
- 優先度別に9つの機能改善案を提示
- 最重要機能として「インクリメンタルインデックス更新」を推奨
3. **テストファイルの作成**(最後の作業)
- **ファイル名**: `/test_sample.txt`
- **作成内容**:
- 日本語と英語の混在テキスト
- 複数段落構成
- 数値データ(バージョン、日付、ファイルサイズ)を含む
- 約500文字程度のテスト用サンプルテキスト
- **用途**: xxxxxxx
============================================================
セッション継続テスト完了
↑のように、CLIやIDE上で実施したやりとりがSDK経由でも表示されます。
※セッションによってより詳細な会話履歴が表示される場合もあり
Summary
本記事では、Claude Code CLIとSDK間でセッションを継続する方法を解説しました。
これにより、CLIで開始した作業をSDKで継続させることができ、
作業の継続性が向上します。