開源・單檔 Python・不裝套件・不用 API 金鑰・只走訂閱

一個資料夾、兩個 AI

讓 Claude Code 和 Codex 共用同一個工作區,又不互相踩到。你不用看懂程式,也不用打指令:貼一句話給你的 AI,它自己裝,大約十分鐘。

貼一句話就裝好 看程式碼與設計筆記

來龍去脈:為什麼會有這個東西

現在很多人同時在用 Claude Code 和 Codex。同業問我:「我本來用 Claude Code,今天開始用 Codex,指定同一個資料夾會不會衝突?還是分開兩個資料夾好?」

我的答案是同一個資料夾。分開兩個資料夾,你累積的習慣、流程、資料就分家了:這邊改過的東西那邊看不到,換一個模型接手就錯亂,你還得多一個動作幫它們互相同步,那是多此一舉。

再來是額度。一邊的額度快用完,要換另一邊接著做,兩邊就得看到同一份東西,而且接手的那個要知道做到哪了。另一位同業問的正是這個:「額度用完換另一個模型接手,它怎麼知道進度?每次都要寫交接手冊嗎?」

最後是互踩。兩個 AI 同時做事,會改到同一份檔案,也會互相看不見對方做過什麼。我自己就撞過:8 月 8 日晚上 Codex 跑完一輪稽核,一個多小時後 Claude 又派了一個工兵做同一件事,兩邊都沒做錯,就是互相看不見,那一次重工是真的花掉的額度。所以要有規矩:先登記再做、同一份檔案同一時間只有一個人寫、做完的結果回到原本那個對話。這頁要裝的東西,就是把這三條規矩做成一個小程式。

你在對話裡講人話「把某件事排進佇列」「跑佇列」「現在跑到哪」
本機佇列一個 SQLite 檔,Claude Code 與 Codex 讀同一份;登記、搶單、租約都記在這
引擎去做事Claude Code 或 Codex 在背景做,只准改宣告過的檔案
結果回到對話你下一句話一說,結果就自己出現

它做什麼,不做什麼

做的事

  • 登記:每件工作先進佇列,不管誰要做、你在不在旁邊看
  • 搶單:同一件事只有一個人搶得到;四個行程同時搶,永遠只有一個贏家
  • 租約:搶到的人拿一張有期限的租約,行程當掉、租約過期,別人才能接手
  • 一檔一 writer:每件任務先宣告要改哪些檔;同一份檔案同一時間只有一個人寫,範圍重疊又沒先後順序就直接拒收
  • 續作:做到一半被中斷,下一次接著做,不從頭來
  • 結果回對話:做完的結果自動出現在你下一句對話裡,不用開儀表板、不用記任務編號
  • 只走訂閱:啟動引擎前先拔掉 API 金鑰類的環境變數,兩邊都用你登入的訂閱,不會悄悄變成按用量計費

沒有不做的事

  • 沒有暫存區寫入:引擎直接在你的資料夾裡改檔,不是先改副本再搬回來
  • 沒有整波盤點:不會在每一波結束後把整個資料夾掃一遍抓越界;只靠宣告和事後的 git 檢查
  • 沒有另一引擎審查:做完不會自動請另一個 AI 再驗一次
  • 沒有儀表板、不支援多台電腦
  • 沒有常駐服務:你說「跑佇列」它才跑,不會自己在背景一直轉
  • 它擋的是兩個聽話的 AI 不小心互踩,不是安全邊界;故意搗蛋的程式它擋不住

這些「沒有」是完整版才有的東西。完整版綁死在作者自己的環境裡搬不出去,這裡放的是照同一套方法重寫的最小版。

你需要什麼

安裝:貼一句話給你的 AI,它自己裝

會用這個的人,電腦上一定已經有 Claude Code 或 Codex。所以最簡單的裝法不是你打指令,是叫它裝。做完一步就打勾,勾勾會記在你的瀏覽器裡。

例如在「文件」底下新建一個叫 我的AI工作區 的資料夾。已經有在用的專案資料夾就直接用那個,不用另外開。

做完會看到:一個空的(或你原本那個)資料夾。之後裝好的東西、佇列、紀錄全部都在這個資料夾裡,不會跑到別的地方。

桌面 App 用「開啟資料夾」選第 0 步那個資料夾。用終端機的人先 cd 進那個資料夾,再打 claudecodex

做完會看到:AI 的對話框,而且它顯示的工作目錄就是那個資料夾。位置不對就先關掉重開,因為佇列會裝在它當下站的那個資料夾。

請先檢查這台電腦有沒有 Python 3.10 以上,沒有就用白話告訴我怎麼裝,裝好再繼續。然後把 https://github.com/Nouischen/one-folder-two-agents 複製到一個暫存位置,讀它的 BUILD_SPEC.md,把 aiq.py 複製進我現在這個專案資料夾,照 BUILD_SPEC.md 第 7 節跑驗收 T1 到 T7,全部通過後用白話告訴我怎麼用。改我的 hook 設定之前先問我。不要碰這個資料夾以外的檔案。

整句照貼就好,一個字都不用改。

接下來會發生的事:它先檢查 Python,然後下載程式、讀施工圖、把 aiq.py 放進你的資料夾、跑七項驗收。中間如果它問你「可不可以執行這個指令」,按允許。整個過程大約十分鐘。

如果它說沒有 Python 或版本太舊:它會用白話教你怎麼裝。照做完,跟它說「裝好了,繼續」。想自己先確認:Windows 打開「命令提示字元」輸入 python --version,跳出微軟商店的視窗就代表還沒裝,到 python.org 下載安裝就好。

三個徵象同時出現就是裝好了:

  1. 它回報 T1 到 T7 全部通過
  2. 資料夾裡多了 aiq.py 和一個 .aiq 資料夾(Mac 的 Finder 預設看不到點開頭的資料夾,按 Cmd+Shift+. 就會顯示)
  3. 它問你要不要接 hook

它的回報大概長這樣:

建了什麼:aiq.py 放在你的專案資料夾,資料都在 .aiq 裡。以後在這個資料夾的對話裡說「把某件事排進佇列,只准改哪些檔」「跑佇列」「現在跑到哪」就好。

驗收結果:T1 通過、T2 通過、T3 通過、T4 通過、T5 通過、T6 通過、T7 通過。

做不到的:暫存區寫入、整波盤點、另一引擎審查、儀表板、多台電腦。
hook 還沒接。要不要我幫你把「結果自動出現在下一句對話」接上?改之前我會先備份。

想看它真的動一次?回它「跑 T8」。那會真的派一件小任務給引擎做(在資料夾裡建一個 hello.txt),會用掉一點點額度。

它問「要不要接 hook」的時候,回它這句:

好,先備份再改

它會先把要加的內容印給你看,備份原本的設定檔,然後改 Claude Code 的 settings.json 或 Codex 的 hooks.json

做完會看到:之後你在同一個資料夾開的任何 Claude Code 或 Codex 對話,每說一句話,還沒讀過的佇列結果就會自己出現在 AI 的脈絡裡,它會主動轉述給你。

想自己看它會加什麼?展開
  • Claude Code:在 ~/.claude/settings.jsonhooks.UserPromptSubmit 加一個 command hook,指令是 python <aiq.py 的絕對路徑> hook,timeout 10 秒。已經有其他 hook 就附加在後面,不會覆蓋。改之前先把原檔複製一份 settings.json.bak-<日期>
  • Codex:在 ~/.codex/hooks.jsonUserPromptSubmit 加同樣的指令。
  • 這個 hook 指令永遠正常結束、任何錯誤都吞掉:資料庫壞了、檔案不在、權限不對,都安靜退出,絕對不會弄壞你的對話。
  • Windows 上 python 這個名字有時是一層殼,不是真正跑程式的那個;hook 裡寫 Python 的完整路徑比較穩,AI 會處理。

平常怎麼用:三句人話

裝好之後,在同一個資料夾的對話裡就講人話,不用記指令。三句:

把〈某件事〉排進佇列,只准改〈哪些檔〉

例如:「把 README 的安裝段改寫成小白步驟排進佇列,只准改 README.md」。AI 會幫你登記,順便把「只准改哪些檔」寫進宣告。

跑佇列

它會搶一件交給引擎做。想一口氣做到佇列空為止,就說「跑佇列,做到空為止」。

現在跑到哪

它會列出每一件的狀態:排隊中、進行中、完成、失敗、等決定。

結果會自己出現在下一句對話裡(第 4 步接了 hook 才會)。沒接 hook 也能用,只是要自己問「現在跑到哪」。

兩個進階

任務要跑指令或測試時:預設只放行「改專案內的檔案」,引擎連跑一個測試都會被擋。這種任務叫 AI 用 --allow-all 跑,那會跳過引擎的所有權限確認,只在你信得過這件任務時用。

這件任務需要跑指令或測試,跑佇列時加 --allow-all

想指定模型時:不指定就用各 CLI 自己的預設模型。要指定就叫 AI 用 --model

跑佇列時用 --model 指定〈模型名稱〉

兩個 AI 怎麼共用

開同一個資料夾,就是同一個佇列。Claude Code 登記的任務 Codex 看得到,反過來也一樣,因為兩邊讀的是資料夾裡同一個 .aiq。登記時沒指定要誰做,跑的時候就看這台電腦裝了哪個引擎,兩個都有就交替使用。

一邊額度快用完:換另一邊開同一個資料夾,說「跑佇列」,它就接著做剩下的。做到一半被中斷的任務,下一次會從上次記錄的進度接下去,不會從頭來。

跑佇列

兩件任務要改同一份檔案:登記第二件時會被擋下來,AI 會告訴你跟哪一件衝突。你只要說「這件等那件做完再做」,它就會加上先後順序,兩件都能進佇列。

卡住怎麼辦

五種最常見的卡法。每一種都附一句可以直接貼給 AI 的話。

卡住它說找不到 Python,或版本太舊

電腦上沒有 Python 3.10 以上。不是你的錯,叫它教你裝。

請檢查這台電腦有沒有 Python 3.10 以上,沒有就用白話一步一步教我裝;裝好之後再把 aiq.py 的驗收 T1 到 T7 跑一次給我看。

卡住它說「這台電腦沒有 claude 也沒有 codex」

引擎沒裝,或裝了但系統的 PATH 找不到它。

請確認這台電腦上 claude 和 codex 這兩個指令找不找得到(PATH 裡有沒有)。找不到的話,用白話告訴我是沒裝還是路徑沒設,以及要怎麼修。

等決定任務變成 needs_decision

三種常見原因:引擎結束但沒寫結果檔;改到宣告範圍外的檔案;Codex 說設定檔裡的模型需要新版 CLI 而秒退。真正的原因寫在 .aiq/tasks/<任務id>/engine.log,叫 AI 去讀。

有任務變成 needs_decision。請讀 .aiq/tasks/那件任務的id/engine.log,用白話告訴我原因。如果是 Codex 說模型需要新版 CLI,就用 --model 指定一個目前能跑的模型,把那件任務 requeue 之後再跑一次。

沒保護它說這個資料夾不是 git repo,沒有越界檢查

「引擎有沒有改到不該改的檔」這層檢查靠 git。不是 git repo 就只剩 prompt 裡的範圍宣告,還是能用,只是少一層保護。

請確認這個專案資料夾是不是 git repo。不是的話先 git init,並把 .aiq/ 加進 .gitignore,這樣越界改動的檢查才會生效。

順序跑佇列做的不是我剛排的那件

佇列先進先出,會先做最早登記、還沒做完的那件。前面測試留下來的先收掉,再跑你要的。

先列出佇列裡所有還沒做完的任務。前面測試留下來、我不需要的,幫我標成完成或失敗收掉,剩下我真的要做的再跑。

之後想移除

一樣在那個資料夾的對話裡跟 AI 說一句:

請幫我移除佇列:先備份,然後刪掉這個資料夾裡的 aiq.py 和 .aiq 資料夾,再把 Claude Code 的 settings.json(或 Codex 的 hooks.json)裡呼叫 aiq.py hook 的那一段拿掉。改設定檔之前先備份一份。

沒接過 hook 的人,它只會刪那兩樣東西。你專案裡其他檔案不會被動到。

這不是完整版

這頁裝的是最小版:一個檔案,兩成的效果,夠一個人在同一台電腦上讓兩個 AI 不互踩。它是怎麼設計的、完整版多了什麼、踩過哪些雷,都寫在 GitHub 的設計筆記裡。