エージェントが直したファイルをすぐに見たければ、Claude CodeのPostToolUseフックから orca file open <ファイルのパス> を呼べばよいのです。このコマンドは、今見ている画面を変えずに、そのファイルをOrcaの作業フォルダのタブとして開いておくので、エージェントが作業している間は邪魔にならず、終わった後には直したファイルがタブとして並んでいます。フックが遅くならないよう、コマンドは切り離したバックグラウンドで起動し、結果は待たないのがコツです。
この記事は、一人で使う開発環境をAIエージェント中心に変えながら(AX、AI転換)作った仕組みを、1日に1つずつ整理する連載の第2回です。第1回はセッション名をフックが先に付けるようにした話でした。
なぜ直したファイルを毎回探し回っていたのか?
私は、OrcaというターミナルアプリにClaude Codeのセッションを開いて、仕事を任せています。エージェントはファイルを読んで直し、次のファイルへ進みますが、ターミナルには「このファイルを直した」という1行だけが残って流れていきます。実際に何が変わったのかを見るには、そのパスを目で追って、エクスプローラーでフォルダを1つずつ開き、ファイルを見つけて開かなければなりませんでした。直したファイルが3、4個あるだけでも、どれを見て、どれをまだ見ていないのか分からなくなりました。
最初に望んだ姿は何だったのか?
最初に望んだのは、エクスプローラーでした。ファイルを直したら、Orcaのエクスプローラーでそのパスが開いて、ファイルが表示されればいいと考えたのです。そこで、Orca CLIのヘルプを読むところから始めました。orca file の下には、open(ファイルをタブで開く)、diff(変更の比較をタブで開く)、open-changed(gitで変わったファイルをすべてタブで開く)の3つがあり、エクスプローラーを開くコマンドはありませんでした。「エクスプローラーで表示」は画面のメニューにしかない機能で、フックから呼ぶ方法がありませんでした。
行き詰まったのはどこか?
目標を少し変えました。私が望んだのはエクスプローラーそのものではなく、「直したファイルが目の前にあること」でした。ファイルの状態(新規・変更)を色で示す仕事は、Orcaのソース管理の一覧がすでにやっています。そこで、残る仕事はファイルを開くことだけに絞られ、orca file open がそれに合っていました。このコマンドは、画面をそのタブへ移さずに開くだけで、移したいときだけ --focus を付けます。
残る障害は2つでした。1つは、このコマンドが、実行したフォルダ(cwd)を見てOrcaの作業フォルダを探すという点です。見当違いのフォルダから呼ぶと、開く先が見つかりません。もう1つは、フックが遅くなると、エージェントのすべての編集がその分だけ遅れるという点です。
フックでどう変えたのか?
PostToolUseフックは、ツール呼び出しが終わった直後に実行され、入力JSONにツール名と引数が入ってきます。編集ツールのときだけファイルのパスを取り出し、そのファイルのフォルダをcwdにしてコマンドを起動します。実際のフックを短くすると、こうなります。
TOOLS = {"Edit", "Write", "MultiEdit", "NotebookEdit"}
def target(payload, env):
if env.get("CC_EDIT_REVEAL", "1") == "0" or env.get("CLAUDE_CODE_ENTRYPOINT", "").startswith("sdk"):
return None # オフのスイッチ・無人実行は飛ばす
if payload.get("tool_name") not in TOOLS:
return None
path = (payload.get("tool_input") or {}).get("file_path")
return path if path and os.path.isabs(path) and os.path.isfile(path) else None
subprocess.Popen([orca, "file", "open", path], cwd=os.path.dirname(path), start_new_session=True,
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
start_new_session=True で、フックから切り離したプロセスとして起動し、出力はすべて捨てます。フックは Popen を呼ぶとすぐに {} を出力して終わるので、Orcaがタブを開く時間のあいだ、エージェントを引き留めません。開く先が見つからないフォルダ(Orcaの作業フォルダではない場所)では、コマンドが静かに失敗し、フックはその結果を見ないので、エージェント側には何も起こりません。
人が画面を見ていない無人実行(claude -p)は、開いてあげる人がいないので飛ばします。しばらくオフにしたいときは、環境変数 CC_EDIT_REVEAL=0 1つで済みます。登録は、設定ファイルのPostToolUseに1行です。フックが失敗しても空のJSONを出すよう、後ろに || echo '{}' を付け、時間制限は5秒と短くしました。
{
"hooks": {
"PostToolUse": [
{ "hooks": [{ "type": "command", "command": "python3 ~/.claude/hooks/edit_reveal.py 2>/dev/null || echo '{}'", "timeout": 5 }] }
]
}
}
今の1日はどう変わったのか?
エージェントに仕事を任せて、ほかのタブを見てから戻ってくると、直したファイルがすでにタブとして開いています。パスをたどってフォルダを開く必要がなくなり、タブを左から順にめくりながら読めば、それがそのまま今回の作業のレビュー順になります。タブが画面を奪わないので、エージェントが作業している最中に、私が見ていた画面が急に変わることもありません。
このフックは、2026-10-19に52行で初めて入り、2026-10-20時点で、このファイルを直したコミットは3つです。最初に作ったときに決めた「エクスプローラーの代わりにタブ」「待たずに起動する」の2つは、それ以降変わっていません。
よくある質問
ファイルを直すたびに、画面がそのタブへ移りませんか?
移りません。orca file open は、既定では「開くだけで画面はそのまま」で、画面まで移したければ --focus を別に付ける必要があります。フックでは付けていません。
フックのせいで、エージェントの編集が遅くなりませんか?
フックは、コマンドを切り離したプロセスとして起動した後、結果を待たずにすぐ終わります。タブを開くのにかかる時間は、エージェントの次の動作とは関係がありません。
Orca以外のターミナルでも使えますか?
構造はそのまま使えます。フックでファイルのパスを取り出す部分はClaude Codeの機能なので同じで、orca file open のところに、使っているエディタの「ファイルを開く」コマンドを入れればよいのです。ただし、画面を奪わずに開くオプションがあるかどうかは、エディタごとに確認する必要があります。