Claude Codeのセッション名は、人が /rename で付ける前に、フックが先に付けるようにすればよいのです。SessionStartフックが出力JSONに sessionTitle を入れると /rename と同じ効果になり、ターミナルのタブの題名が会話の話題で揺れず、最初から [大][中]-小 の形式で固定されます。名前の真ん中に「分析」「開発」のような役割タグを入れておけば、別のフックがその名前を読んで、分析用のセッションでコードを直そうとするミスまで止められます。
この記事は、一人で使う開発環境をAIエージェント中心に変えながら(AX、AI転換)作った仕組みを、1日に1つずつ整理する連載の第1回です。
なぜタブの題名が何度も変わったのか?
私は、Orcaというターミナルアプリに、Claude Codeのセッションをいくつも開いておきます。ブログ記事を書くタブ、サイトを直すタブ、自動化を手直しするタブが、同時に開いているわけです。ところが、名前を付けていないセッションは、Claude Codeがプロンプトごとに会話の話題からターミナルの題名を新しく付けます。簡単な計算を1つ聞いただけのタブは、題名が 1+1の計算 に変わっていました。タブが増えると、どのタブが何をしていた場所なのか、毎回クリックして確かめなければなりませんでした。
最初は何を試したのか?
最初に、タブを作るときに題名を決めてみました。orca terminal create --title で題名を渡して開いたのですが、Claude Codeが起動した途端に、題名を Claude Code で上書きしました。2つ目は、環境変数 CLAUDE_CODE_DISABLE_TERMINAL_TITLE=1 で、題名の変更自体をオフにしました。揺れは止まりましたが、今度はセッション名まで題名に出なくなり、すべてのタブが同じに見えました。どちらも2026-10-07に自分で試して、捨てた方法です。
行き詰まったのはどこか?
試してみて、ルールが分かりました。セッションに名前があれば、題名はその名前で固定され、名前がないときだけ話題に従って変わります。結局、答えは「常に名前を付ける」でしたが、問題は、私が /rename をよく忘れることでした。人が覚えておくべきルールは、忙しいときにいちばん先に抜け落ちます。そこで、覚えておく仕事をフックに任せることにしました。
フックでどう変えたのか?
SessionStartフックは、セッションを新しく開くとき、続きから開くとき、分岐して開くときに実行されます。出力の hookSpecificOutput に sessionTitle を入れると、その名前がセッションに付きます。実際のフックを短くすると、こうなります。
APPLY_SOURCES = ("startup", "resume", "fork") # clear・compactには適用されない
def auto_title(payload):
if payload.get("session_title") or payload.get("source") not in APPLY_SOURCES:
return None # すでに名前があれば触らない
return "[%s][分析]-基本" % major_of(payload["cwd"])
out = {"hookEventName": "SessionStart", "sessionTitle": auto_title(payload)}
print(json.dumps({"hookSpecificOutput": out}))
先頭の大分類は、同じフォルダで最近使ったセッション名のうち、最も多く使われたものを選びます。最初は最新の1つだけを見ていたのですが、一度出たタイプミスがそのまま次のセッション名に移ってしまったため、「最も多く使われたもの」に変えました。基本の役割は「分析」にしています。分析セッションでファイルを直したりコミットしようとしたりすると、別のフック(PreToolUse)が名前を読んで止めるようにしてあるので、いちばん安全な側を既定値にしたのです。
最後の欄である「小」は、やる仕事に応じて変えます。最初の入力がスラッシュコマンドなら、フックが小をそのコマンド名にすぐ変え、それ以外は -基本 のままにしておいて、最初の作業が終わるときにエージェントが内容を見て名前を付けます。名前を変える小さなスクリプトは、新しい名前をファイルに書いておき、次のプロンプトのUserPromptSubmitフックがそのファイルを読んで sessionTitle として適用します。同じ瞬間に、orca terminal rename でOrcaのタブ名も一緒に変えます。
人が答えられない無人実行(claude -p)には、名前を尋ねる案内を入れません。無人実行のテストで、この案内が最後の答えを横取りして、見当違いの質問で終わったことがあったからです。
今の1日はどう変わったのか?
タブをざっと見渡すと、何をしているセッションなのかがすぐ分かります。[ブログ][開発]-robots、[サイト][分析]-検索統計 のように、大分類・役割・テーマが1行に出ます。2026-10-19に測った値で、2026-10-12以降に使ったセッション記録211件のうち、206件に名前が付いていました。名前を付ける2つのフックのファイルを直したコミットは、これまでに10件です。今では名前付けは、私が覚えておくことではなく、フックがやることです。
よくある質問
フックが付けた名前が、自分で決めた名前を上書きすることはありませんか?
すでに名前があるセッションには触りません。フックに渡される値にセッション名があれば、すぐに処理を抜け、名前がないセッションを新しく開くときや続きから開くときだけ、基本の名前を付けます。
/clear やコンパクトの後にも名前は付きますか?
SessionStartフックが clear・compact で返した名前は適用されないので、最初から対象から外しました。
Orcaのようなターミナルアプリが必須ですか?
いいえ。セッション名はClaude Codeの機能なので、どのターミナルでもタブの題名が固定されます。Orcaのタブ名を一緒に変える部分だけが、Orca専用です。