AXヒント2 — 直したファイルをOrcaのタブで自動的に開く

公開

  • AXヒント
  • Claude Code
  • 開発環境の自動化
  • フック

エージェントが直したファイルをすぐに見たければ、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 }] }
    ]
  }
}
ファイルを直してからタブが開くまでエージェントがファイルを直す → PostToolUseフックが実行される; PostToolUseフックが実行される → 編集ツール・実在のファイル・オフではない?; 編集ツール・実在のファイル・オフではない? → ファイルのフォルダからorca file openを切り離して実行 (はい); 編集ツール・実在のファイル・オフではない? → 何もしない (いいえ); ファイルのフォルダからorca file openを切り離して実行 → 画面はそのまま、タブだけが増えるはいいいえエージェントがファイルを直すPostToolUseフックが実行される編集ツール・実在のファイル・オフではない?何もしないファイルのフォルダからorca fileopenを切り離して実行画面はそのまま、タブだけが増える
ファイルを直してからタブが開くまで — フックは起動するだけで待たない

今の1日はどう変わったのか?

エージェントに仕事を任せて、ほかのタブを見てから戻ってくると、直したファイルがすでにタブとして開いています。パスをたどってフォルダを開く必要がなくなり、タブを左から順にめくりながら読めば、それがそのまま今回の作業のレビュー順になります。タブが画面を奪わないので、エージェントが作業している最中に、私が見ていた画面が急に変わることもありません。

このフックは、2026-10-19に52行で初めて入り、2026-10-20時点で、このファイルを直したコミットは3つです。最初に作ったときに決めた「エクスプローラーの代わりにタブ」「待たずに起動する」の2つは、それ以降変わっていません。

直したファイルを見る方法自分で探す: ターミナルでパスを読む, エクスプローラーのフォルダを1つずつ開く, 見たファイルと見ていないファイルが混ざる → フックがタブで: 直すとすぐタブが積み上がる, 見ていた画面はそのまま, タブの順序がレビュー順自分で探すターミナルでパスを読むエクスプローラーのフォルダを1つずつ開く見たファイルと見ていないファイルが混ざるフックがタブで直すとすぐタブが積み上がる見ていた画面はそのままタブの順序がレビュー順
直したファイルを見る方法

よくある質問

ファイルを直すたびに、画面がそのタブへ移りませんか?

移りません。orca file open は、既定では「開くだけで画面はそのまま」で、画面まで移したければ --focus を別に付ける必要があります。フックでは付けていません。

フックのせいで、エージェントの編集が遅くなりませんか?

フックは、コマンドを切り離したプロセスとして起動した後、結果を待たずにすぐ終わります。タブを開くのにかかる時間は、エージェントの次の動作とは関係がありません。

Orca以外のターミナルでも使えますか?

構造はそのまま使えます。フックでファイルのパスを取り出す部分はClaude Codeの機能なので同じで、orca file open のところに、使っているエディタの「ファイルを開く」コマンドを入れればよいのです。ただし、画面を奪わずに開くオプションがあるかどうかは、エディタごとに確認する必要があります。

サイトを作ってみませんか?

無料で相談する