AX 提示 2 — 把修改過的檔案自動用 Orca 分頁打開

發布

  • AX 提示
  • Claude Code
  • 開發環境自動化
  • hook

如果想立刻看到代理修改過的檔案,只要在 Claude Code 的 PostToolUse hook 裡呼叫 orca file open <檔案路徑> 就行了。這個指令不會改變目前正在看的畫面,只是把那個檔案在 Orca 工作資料夾中開成分頁,所以代理工作的期間不會被打擾,結束後修改過的檔案就排成一排分頁。訣竅是把指令分離到背景啟動,並且不等待結果,這樣 hook 才不會變慢。

這篇文章是連載的第二篇,連載內容是把一個人使用的開發環境改成以 AI 代理為中心(AX,AI 轉型)的過程中,每天整理一個我做出來的機制。第一篇是讓 hook 先替工作階段命名的故事。

為什麼每次都要到處找修改過的檔案?

我在一個叫 Orca 的終端機應用程式裡開著 Claude Code 工作階段,把工作交給它們。代理讀檔案、修改、再換下一個檔案,終端機只留下「修改了這個檔案」的一行就滑過去了。要看實際改了什麼,得用眼睛追著那個路徑,在檔案總管裡一個個展開資料夾,找到檔案再打開。修改過的檔案只要有三四個,就會搞不清哪些看過、哪些還沒看。

一開始想要的是什麼?

一開始想要的是檔案總管。我想,如果檔案一被修改,Orca 的檔案總管就展開那個路徑並標示出檔案,會很好。所以我先讀了 Orca CLI 的說明。在 orca file 底下有三個指令:open(把檔案開成分頁)、diff(把變更比較開成分頁)、open-changed(把 git 中有變動的檔案全部開成分頁),沒有展開檔案總管的指令。「在檔案總管中顯示」只存在於畫面選單,hook 無法呼叫。

卡在哪裡?

我稍微調整了目標。我要的不是檔案總管本身,而是「修改過的檔案就在眼前」。用顏色顯示檔案狀態(新增、修改)這件事,Orca 的原始碼控制清單已經在做了。所以剩下的工作縮減成只要打開檔案,而 orca file open 正好適合。這個指令只是打開,不會把畫面移到那個分頁,只有想移過去時才加上 --focus。

剩下的障礙有兩個。一個是這個指令會依照執行時的資料夾(cwd)來尋找 Orca 工作資料夾。如果從不相干的資料夾呼叫,就找不到要開啟的地方。另一個是,hook 一旦變慢,代理的每一次編輯都會跟著慢同樣的時間。

用 hook 怎麼改?

PostToolUse hook 在工具呼叫結束後立刻執行,輸入的 JSON 裡有工具名稱與參數。只有在編輯工具時才取出檔案路徑,並把該檔案所在資料夾當作 cwd 來啟動指令。把實際的 hook 縮短來看,大概是這樣。

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 以與 hook 分離的程序啟動,並把輸出全部丟掉。hook 在呼叫 Popen 之後立刻輸出 {} 就結束,所以不會在 Orca 開分頁的那段時間裡拖住代理。在找不到要開啟位置的資料夾(不是 Orca 工作資料夾的地方),指令會默默失敗,而 hook 不看那個結果,所以代理這邊什麼事都不會發生。

對於沒有人看畫面的無人執行(claude -p),因為沒有人需要替他開啟,所以跳過。想暫時關掉時,只要一個環境變數 CC_EDIT_REVEAL=0 即可。註冊只要在設定檔的 PostToolUse 加一行。為了讓 hook 即使失敗也輸出空的 JSON,後面加上 || echo '{}',時間限制則抓得很短,只有 5 秒。

{
  "hooks": {
    "PostToolUse": [
      { "hooks": [{ "type": "command", "command": "python3 ~/.claude/hooks/edit_reveal.py 2>/dev/null || echo '{}'", "timeout": 5 }] }
    ]
  }
}
從修改檔案到分頁開啟為止代理修改檔案 → 執行 PostToolUse hook; 執行 PostToolUse hook → 是編輯工具、真實檔案、沒有關閉?; 是編輯工具、真實檔案、沒有關閉? → 從檔案所在資料夾分離執行 orca file open (是); 是編輯工具、真實檔案、沒有關閉? → 什麼都不做 (否); 從檔案所在資料夾分離執行 orca file open → 畫面不變,只新增分頁是否代理修改檔案執行 PostToolUsehook是編輯工具、真實檔案、沒有關閉?什麼都不做從檔案所在資料夾分離執行 orca file open畫面不變,只新增分頁
從修改檔案到分頁開啟為止 — hook 只負責啟動,不等待

現在的一天有什麼不同?

把工作交給代理,看看別的分頁再回來,修改過的檔案已經開成分頁了。不必再順著路徑展開資料夾,從左邊開始一個個翻看分頁,就剛好成了這次工作的審查順序。因為分頁不會搶走畫面,代理工作的期間,我正在看的畫面也不會突然改變。

這個 hook 在 2026-10-19 以 52 行首次加入,截至 2026-10-20,修改過這個檔案的提交有 3 個。剛做出來時決定的「用分頁取代檔案總管」與「不等待地啟動」這兩件事,之後都沒有改變。

查看修改過的檔案的方法自己找: 在終端機讀路徑, 在檔案總管逐一展開資料夾, 看過與沒看過的檔案混在一起 → hook 開成分頁: 一修改分頁就疊上來, 正在看的畫面維持不變, 分頁順序就是審查順序自己找在終端機讀路徑在檔案總管逐一展開資料夾看過與沒看過的檔案混在一起hook 開成分頁一修改分頁就疊上來正在看的畫面維持不變分頁順序就是審查順序
查看修改過的檔案的方法

常見問題

每次修改檔案,畫面都會跳到那個分頁嗎?

不會。orca file open 預設是「只開啟,畫面維持不變」,若要連畫面也移過去,必須另外加上 --focus。hook 裡沒有加。

hook 會讓代理的編輯變慢嗎?

hook 把指令以分離的程序啟動後,不等結果就立刻結束。開分頁所花的時間,與代理的下一個動作無關。

在 Orca 以外的終端機也能用嗎?

結構可以照用。hook 中取出檔案路徑的部分是 Claude Code 的功能,所以相同,只要在 orca file open 的位置放入你使用的編輯器的「開啟檔案」指令即可。不過,有沒有不搶畫面就能開啟的選項,必須依編輯器個別確認。

要不要一起打造您的網站?

免費諮詢