建置指令

統一管理 Agent Skill 的 repo

整份複製,貼給你的 AI(Claude Code/Codex/Cursor 皆可)當任務指令。它會先問你環境現況,你確認後才動手。

複製後直接貼進 AI 對話框就可以開工。

我的規模:skill 十幾支,全部自己寫的,沒有從別人的 repo 抄進來的;我用的 AI 工具兩三個。 請照這個規模做,不要往企業級做。下面沒寫的一律不要主動加(不要版本追蹤帳、不要公私分層、不要授權管理、不要檢查報表)。

任務

建一個 git repo 統一放 agent skill,能推上 GitHub,並用一支腳本把 skill 鋪到我在用的每個 AI 工具的 skill 目錄。

要解決的只有兩件事:

  1. skill 有唯一存放處,改完不會忘記 commit/push
  2. 一份來源自動同步到各工具,不用手動複製好幾遍。

第一步:先勘查,列表給我確認後再動手

  1. 我裝了哪些會讀 skill 的 AI 工具,各自實際的 skill 目錄在哪。以你 ls 到的為準,不要照抄任何清單;若某個目錄是 symlink 或由某個 app 自己管理,標出來,那種不納入同步。
  2. 這些目錄現在有沒有東西,逐支列給我看是誰放的。我自己寫的先全部收進 repo 的來源目錄再開始同步,否則第一次同步會把它們清掉;如果有不是我寫的(某個 app 或 plugin 自己裝的),標出來問我,不要收進來也不要讓同步刪掉它

這是整件事唯一的不可逆風險,所以要我確認過才能往下做。

架構:一個來源,其餘全是產物

skills/ 是唯一真相,一個 skill 一個資料夾。各工具目錄全部是同步產物。三條鐵律寫進 README:

  1. 要改就改 skills/,不要改產物,下次同步會整個蓋掉。
  2. 一個 skill 一個真資料夾,不用 symlink 指向別處(換一台機器 clone 會斷鏈)。
  3. 改完要 commit+push,別台機器才拿得到。

sync.sh

skills/ 鋪到每個工具目錄。四個要求:

  1. rsync -a --delete-a 一次解決二進位檔(skill 裡常有圖、字型、docx,用文字模式同步會靜默弄壞)與 .sh 的執行位元,不要自己寫複製迴圈--delete 讓來源刪掉的 skill 不會在各工具目錄變殭屍被 AI 誤觸發。但如果勘查時發現某個工具目錄裡有不是我寫的 skill(app 或 plugin 自己裝的),那幾支要用 --exclude 排掉讓 --delete 碰不到,並在腳本頂端列出來註明是誰的。它們沒進版控,刪掉就沒了。勘查如果沒發現這種 skill,就不用寫 --exclude,也不要預先建什麼白名單機制。
  2. --delete 真的會刪東西,執行前先印出即將被刪的清單。
  3. 跑完印出「鋪了幾支、到哪幾個目錄」,不要只印「完成」。
  4. 結尾檢查 git 狀態git status --porcelain -- skills/ 有東西就大聲提醒「你改了 skill 但還沒 commit」。一定要限定 skills/ 路徑,不要掃整個 repo,不然我改個 README 它就每次亂喊,喊久了我就不看了,真的那次也會被一起忽略。接著比對 git log origin/<主分支>..HEAD,有東西就提醒「有 N 個 commit 還沒 push」;如果 origin/<主分支> 根本不存在(還沒推上 GitHub),要明講這件事,不要讓錯誤被吞掉變成一切正常

skill-save.sh

一個指令做完存檔全流程:git add skills/ → commit(訊息可帶參數,沒給就用日期)→ git push → 跑 sync.sh

這支是重點。 我改完 skill 只要記一個指令,「忘記上傳」就不必靠我的紀律,而是結構上不會發生。

每一步失敗都要停下來,而且用失敗的語氣結束。 特別是 git push 失敗(沒網路、要先 pull --rebase、認證過期都很常見):這時絕對不可以照樣往下跑 sync.sh 然後印「完成」,那會讓我以為存好了,實際上東西還在這台機器上,比沒有這支腳本更糟。沒東西可 commit 時不算錯誤,跳過 commit 繼續走就好。

.gitignore 與 README

.gitignore 排掉 .env*.key 與各語言的快取目錄。skill 裡不要硬寫 API key 或 token,需要私密值走環境變數。

README 寫三件事就好:來源在哪、怎麼同步、改完要 push。不用畫架構圖。

驗收:逐條實測給我看,附指令與輸出

  1. 在來源改一支 skill,加一行當下才生成、獨一無二的字串(例如 SYNCTEST-20260902-a91f),跑同步,用 grep 證明它出現在每一個工具目錄裡。不要挑一個本來就可能存在的字,那樣驗不出東西。
  2. 臨時建一支假 skill(不要拿我真的 skill 當白老鼠),同步、確認各工具目錄都有了,再從來源刪掉、重跑同步,用 ls 證明各工具目錄都不再有它。
  3. 改一支 skill 但不 commit,跑 sync.sh,確認它提醒我還沒 commit。
  4. 接著 commit 但不要 push,再跑一次 sync.sh,確認它提醒我有 N 個 commit 還沒 push。 這跟上一條是兩件事,都要驗。
  5. 跑一次 skill-save.sh,貼出跑完後的 git log --oneline -1git log origin/<主分支>..HEAD(後者應該是空的),證明 commit 與 push 都真的發生了。再示範一次 push 失敗會怎樣:先 git remote -v 記下原本的位址,把 remote 暫時指到一個不存在的位址,跑 skill-save.sh,確認它明確報失敗、而且沒有繼續往下印「完成」;測完立刻改回原位址,把改回來後的 git remote -v 也貼給我看。這個測試不還原,我以後每次存檔都會失敗。

不要做的事

附註:等真的遇到再說

以後如果從別人的 repo 抄 skill 進來,在那支 SKILL.md 檔頭記一行「抄自哪個 repo、哪個 commit、哪一天」。當下記三十秒,事後回推要一小時。現在沒有第三方 skill,不用為這件事建任何機制。