Claude Code への質問と回答を指定のファイルに保存する方法を、チャットモード / ワンショットモード別に記します。よりよい方法があれば教えてください。
背景
Claude Code (CLI) に質問するとき、質問と回答をマークダウンファイルに保存しておくと、以下の点で便利だと思います。
- Claude の回答内容を今すぐには対応できないとき、保留しておける。
- Obsidian 保管庫下に保存すれば、マークダウンがレンダリングされて見やすい。
- さらに Dropbox で同期すれば、他デバイスからも閲覧できる。
- 例えば質問をまとめて投げてから外出して、スマートフォンで回答を確認できる。
なので、保存方法の例をケース A と B について記します。
- A. チャットモードの場合 (カスタムスラッシュコマンドで直前の質問 & 回答を保存)
- B. ワンショットモードの場合 (独自シェルスクリプトで質問と回答を保存)
なお、以下のようなディレクトリ構成を想定しています。
~/
├─ .claude/
│ └─ commands/save.md # カスタムスラッシュコマンド (チャットモードの場合)
│
├─ claudy.sh # 独自シェルスクリプト (ワンショットモードの場合) ※ どこに置いてもよいが
│
├─ aaa/ # ★ あるときはこの作業ディレクトリで質問
├─ bbb/ccc/ # ★ あるときはこの作業ディレクトリで質問
│
└─ Dropbox/obsidian/Mercury/ # 回答回収場所が Obsidian 保管庫内だとマークダウンが見やすい
│
└─ Claude/ # 回答回収場所 (※)
├─ 20260110-090000.md # 質問ディレクトリ名 & 質問 & 回答 を保存
├─ 20260110-091000.md # 質問ディレクトリ名 & 質問 & 回答 を保存
└─ 20260110-092000.md # 質問ディレクトリ名 & 質問 & 回答 を保存
また、ファイルは以下のフォーマットになります。 必要に応じて修正してください (例えばファイル名にその質問をしたディレクトリ名を含めるなども容易だと思います)。
ディレクトリ名
質問
---
回答
(※) Dropbox 管理下に頻繁に質問 & 回答を保存して取捨選択する場合は、Dropbox の同期を一時停止しておいた方がよいかもしれません (通信量節約のため)。
A. チャットモードの場合
Claude とのチャット中「この回答を保存したい」となったときに、直前の質問 & 回答だけを保存する想定です。それならそうなったとき Claude に「直前の質問 & 回答を保存してください」と頼めば可能ですが、Claude にはカスタムスラッシュコマンド が登録できるので、~/.claude/commands/save.md などに以下の内容を登録しておけば、チャット中に /save でこの指示を呼び出して保存することができます (コマンド名 = ファイル名はお好きに変更してください)。
このコマンドの直前にあるユーザーの質問 1 つと、それに対する Claude の回答 1 つだけを、
C:/Users/kazusa/Dropbox/obsidian/Mercury/Claude/YYYYMMDD-hhmmss.md
に保存してください。タイムスタンプは現在時刻にしてください。
### 形式
ディレクトリ名 (末尾のみ)
質問
---
回答
なお、上記の /save でファイルを保存するとき「このファイルを書き出してよいか?」と訊かれますが、永続的に許可する場合は作業ディレクトリに以下などを設定しておけば訊かれません (最小権限かはわかりません & 採用は慎重に検討してください)。
{
"permissions": {
"allow": ["Write"],
"additionalDirectories": ["C:/Users/kazusa/Dropbox/obsidian/Mercury/Claude"]
}
}
B. ワンショットモードの場合
1 回の質問で終了するモード claude -p "質問" の質問を保存するには、以下のようなラッパーシェル関数を用意しておけばよいと思います。
#!/usr/bin/bash
# 指定の作業ディレクトリに移動して Claude に質問し回答を回収場所に保存して戻ってきます
# これを何回分も予約しておくことができます
# 回答は回収ボックス内に YYYYMMDD-hhmmss.md という名前で保存されます
obsidian_dir=~/Dropbox/obsidian/Mercury/Claude/ # 回答マークダウンファイル回収場所
ask() { # 引数: 作業ディレクトリ, 質問文
# 作業ディレクトリに移動して Claude に質問し回答を回収場所に保存して戻ってきます
local out="$obsidian_dir/$(date '+%Y%m%d-%H%M%S').md"
pushd $1 # 作業ディレクトリに移動
echo $1$'\n' > $out
echo "$2" >> $out
echo "---"$'\n' >> $out
# 作業ディレクトリに書き込みさせないなら以下の --allowedTools=Write は不要
local answer=$(claude --allowedTools=Write -p "$2")
echo "$answer" >> $out
echo "Written to $out"
popd # 元のディレクトリに帰還
}
この関数 ask() を以下のように利用します。あるいは # ===== question 1 ===== 以降の行を上のスクリプトの下部に直接書き込んで実行しても構いません。
#!/usr/bin/bash
source ./claudy.sh # 関数を読み込み
cd ~/ # どこかの拠点に移動 (ここを拠点に各作業ディレクトリに行って帰ってくる)
# ===== question 1 =====
work_dir=./aaa/
question="\
ほげほげをしてください。
ふがふがもしてください。
"
ask "$work_dir" "$question"
# ===== question 2 =====
work_dir=./bbb/ccc/
question="\
ほげほげをしてください。
ふがふがもしてください。
"
ask "$work_dir" "$question"
B. ワンショットモードの場合のおまけ
ユースケースによっては下記 gist のように関数を追加しておいても便利かもしれません。
https://gist.github.com/CookieBox26/6eb6157478c8043eb76adc13101c1202
各関数の機能は以下です (これらは独立なので好きな方だけ追加できます)。
-
関数
wait_until_limit_reset(): Claude の回答が制限中メッセージYou've hit your limit ・ resets 5pm (Asia/Tokyo)のようなものだったときに制限解除まで待機します。- リクエスト量制限に引っ掛かるという方には役立つかもしれません。
- ご使用される場合は gist のように
ask()内でこれを呼んでください。 - お手元の制限中メッセージが
.*You've hit your limit.*resets [0-9]{1,2}[ap]m.*であって、端末の時刻とタイムゾーンが合致していることを想定しています。そうでない場合は修正いただく必要があります。
-
関数
setup(): 作業ディレクトリに設定ファイル./.claude/settings.local.jsonやシステムプロンプト./.claude/CLAUDE.mdが未生成なら自動生成します (どちらかのみ生成もできます)。必要なときにのみask()の前に呼ぶ想定です。-
claudeを呼んだことがない作業ディレクトリで書き込みを伴う依頼をするとき、予め書き込み許可したり、コーディングルールを伝えるのに使用できます。 -
~/.claude_templates/にケース別のシステムプロンプトを配置しておくことを想定しています (ここからコピーします)。各ファイルの内容例はこちらです。 - ご使用の場合は生成されるファイルの設定やルールが意図通りか確認ください。
-
~/
├─ .claude/
│ └─ CLAUDE.md # 常に適用するシステムプロンプト
│
└─ .claude_templates/ # ★ ケース別のシステムプロンプト (プロンプト量節約のため切り分け)
├─ CLAUDE.summarizing.md # 文献要約ルール
├─ CLAUDE.coding.md # コード実装ルール
└─ CLAUDE.python-coding.md # Python プロジェクトでのコード実装ルール