deploy 的腳本呼叫全改成字面絕對路徑,開頭解一次根目錄,無人看管的輪次不再停在第一支腳本 #59

Merged
admin merged 2 commits from fix/literal-absolute-paths-for-deploy into develop 2026-09-03 02:52:09 +00:00
Member

摘要

  • 需求描述:deploy 技能在無人看管的輪次裡跑不動,第一支腳本就被權限層擋下。這張 PR 立下路徑守則,並新增 Step 0 在執行期解出根目錄,讓這支技能發出的每一次腳本呼叫都是字面絕對路徑。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
skills/deploy/SKILL.md 新增路徑守則與 Step 0;四處跨外掛呼叫改成字面絕對路徑的寫法,其中三處原本是相對路徑,正是模型自己補成帶變數路徑的源頭;技能自己的四支腳本改用外掛基底目錄組成的字面路徑
references/behaviors.md deploy 的關鍵步驟、外部呼叫、完成條件、可驗證跡象四列同步改寫,跟技能文件對齊;觸發時機未動
plugin.json 版號從 0.3.1 升到 0.3.2
.claude-plugin/plugin.json 版號從 0.3.1 升到 0.3.2
.codex-plugin/plugin.json 版號從 0.3.1 升到 0.3.2

設計重點

  • 權限層拿未展開的字面字串做靜態比對,不展開變數也不展開波浪號。帶變數的路徑對不上任何允許規則,會落到核准詢問;無人看管的輪次沒有人按,整輪就停在那裡。
  • 放寬允許清單不是解法。規則本身同樣是靜態比對,規則寫成帶變數的路徑一樣不匹配;路徑中段的萬用字元也不匹配,帶版本號的快取路徑因此放不進清單。
  • 守門要查目錄存在,不能只看「非空且結束碼 0」。JSC_HOME 沒設時 readlink -f "$JSC_HOME/current" 印出 /current、結束碼 0,前兩項全部放行,而那個目錄並不存在,之後每一條字面路徑都是錯的。所以加上 [ -d ]。
  • 解到 current 這一層就停。current 本身是一般目錄,符號連結在下一層、每個外掛各一條;再往下解一層會落到帶版本號的快取路徑,那正是放不進允許清單的一種。
  • 根目錄整輪只解一次,不每次呼叫重解,也不為此多開一支腳本。那一次 readlink 是整輪唯一容許帶變數的指令。
  • 技能自己的四支腳本不在 current 底下,那裡只放另外三個外掛,所以另外用 CLI 載入技能時講明的外掛基底目錄,原樣照抄、不跑指令。這個例外只限這一支有人值守的技能,文件裡寫明不得照抄到排程跑的技能。
  • deploy 是人在現場跑的技能,開頭那一次核准詢問有人可以按,所以保留技能自己解路徑,不改成別的機制。
  • 守則明文擋回頭路:為了看起來整齊而把字面路徑改回帶變數的寫法,等於再一次弄壞每一個無人看管的輪次。可攜性由執行期那一次解析負責。
  • 給審閱者一句話:這張 PR 是必要條件,不是充分條件。技能端不再產生對不上規則的路徑,機器端還要把允許清單補齊到完整字面路徑,兩邊都到位,無人看管的輪次才跑得完。

測試結果

  • 2026-09-02 到 09-03 用非互動模式比照排程環境實測多種路徑寫法:帶變數與帶波浪號的呼叫一律被擋、完全沒執行;同一條路徑換成完整字面絕對路徑就跑得動;在設定檔補一條開頭帶變數的允許規則後,呼叫仍然被擋;規則版本號寫成萬用字元的快取路徑同樣被擋。
  • check-behaviors.sh、ste100-lint.sh、lint-frontmatter.sh、lint-scripts.sh 四支對這個存放庫都回結束碼 0。
  • 這一批只改技能文件、行為說明表與版號,沒有可執行的腳本變動,所以沒有自動化測試可跑。改後複查技能文件全文,跨外掛腳本呼叫已無帶變數或帶波浪號的寫法,僅開頭那一次 readlink 與說明用文字保留變數字樣。
  • 三份 manifest 由同步腳本產生,版號一致為 0.3.2。

前置 Push Request

  • 無
## 摘要 - 需求描述:deploy 技能在無人看管的輪次裡跑不動,第一支腳本就被權限層擋下。這張 PR 立下路徑守則,並新增 Step 0 在執行期解出根目錄,讓這支技能發出的每一次腳本呼叫都是字面絕對路徑。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `skills/deploy/SKILL.md` | 新增路徑守則與 Step 0;四處跨外掛呼叫改成字面絕對路徑的寫法,其中三處原本是相對路徑,正是模型自己補成帶變數路徑的源頭;技能自己的四支腳本改用外掛基底目錄組成的字面路徑 | | `references/behaviors.md` | deploy 的關鍵步驟、外部呼叫、完成條件、可驗證跡象四列同步改寫,跟技能文件對齊;觸發時機未動 | | `plugin.json` | 版號從 0.3.1 升到 0.3.2 | | `.claude-plugin/plugin.json` | 版號從 0.3.1 升到 0.3.2 | | `.codex-plugin/plugin.json` | 版號從 0.3.1 升到 0.3.2 | ## 設計重點 - 權限層拿未展開的字面字串做靜態比對,不展開變數也不展開波浪號。帶變數的路徑對不上任何允許規則,會落到核准詢問;無人看管的輪次沒有人按,整輪就停在那裡。 - 放寬允許清單不是解法。規則本身同樣是靜態比對,規則寫成帶變數的路徑一樣不匹配;路徑中段的萬用字元也不匹配,帶版本號的快取路徑因此放不進清單。 - 守門要查目錄存在,不能只看「非空且結束碼 0」。`JSC_HOME` 沒設時 `readlink -f "$JSC_HOME/current"` 印出 `/current`、結束碼 0,前兩項全部放行,而那個目錄並不存在,之後每一條字面路徑都是錯的。所以加上 `[ -d ]`。 - 解到 `current` 這一層就停。`current` 本身是一般目錄,符號連結在下一層、每個外掛各一條;再往下解一層會落到帶版本號的快取路徑,那正是放不進允許清單的一種。 - 根目錄整輪只解一次,不每次呼叫重解,也不為此多開一支腳本。那一次 `readlink` 是整輪唯一容許帶變數的指令。 - 技能自己的四支腳本不在 `current` 底下,那裡只放另外三個外掛,所以另外用 CLI 載入技能時講明的外掛基底目錄,原樣照抄、不跑指令。這個例外只限這一支有人值守的技能,文件裡寫明不得照抄到排程跑的技能。 - deploy 是人在現場跑的技能,開頭那一次核准詢問有人可以按,所以保留技能自己解路徑,不改成別的機制。 - 守則明文擋回頭路:為了看起來整齊而把字面路徑改回帶變數的寫法,等於再一次弄壞每一個無人看管的輪次。可攜性由執行期那一次解析負責。 - 給審閱者一句話:這張 PR 是必要條件,不是充分條件。技能端不再產生對不上規則的路徑,機器端還要把允許清單補齊到完整字面路徑,兩邊都到位,無人看管的輪次才跑得完。 ## 測試結果 - 2026-09-02 到 09-03 用非互動模式比照排程環境實測多種路徑寫法:帶變數與帶波浪號的呼叫一律被擋、完全沒執行;同一條路徑換成完整字面絕對路徑就跑得動;在設定檔補一條開頭帶變數的允許規則後,呼叫仍然被擋;規則版本號寫成萬用字元的快取路徑同樣被擋。 - `check-behaviors.sh`、`ste100-lint.sh`、`lint-frontmatter.sh`、`lint-scripts.sh` 四支對這個存放庫都回結束碼 0。 - 這一批只改技能文件、行為說明表與版號,沒有可執行的腳本變動,所以沒有自動化測試可跑。改後複查技能文件全文,跨外掛腳本呼叫已無帶變數或帶波浪號的寫法,僅開頭那一次 `readlink` 與說明用文字保留變數字樣。 - 三份 manifest 由同步腳本產生,版號一致為 0.3.2。 ## 前置 Push Request - 無
jiantw83 added 2 commits 2026-09-03 02:38:23 +00:00
技能文件新增路徑守則一節,寫明這支技能的每一次腳本呼叫都要是字面絕對路徑,不留未展開的變數,也不留波浪號。

新增 Step 0:開頭跑一次 readlink -f "$JSC_HOME/current" 解出根目錄,整輪只解這一次,之後每一處都把代稱換成那個目錄。解出來的路徑要用 [ -d ] 查過存在才算數——JSC_HOME 沒設時那道指令會印出 /current、結束碼 0,非空又是絕對路徑,只看前三項會直接放行,而那個目錄並不存在。文件同時明講解到 current 這一層就停,不要再往下解一層,因為再解就落到帶版本號的快取路徑,而那種路徑放不進允許清單。

四處跨外掛呼叫改成字面路徑寫法。其中三處原本寫成相對路徑,那才是模型自己補成帶變數路徑的源頭。技能自己的四支腳本另外處理:jsc-cli 不在 current 底下,那裡只有另外三個外掛,所以改用 CLI 載入技能時講明的外掛基底目錄,原樣照抄、不跑指令。

無人看管的輪次在第一支腳本就被權限層擋下,整輪一個外掛都沒部署。2026-09-02 到 09-03 用非互動模式比照排程環境實測多種寫法:權限層拿未展開的字面字串做靜態比對,帶變數或波浪號的路徑對不上任何允許規則,只有允許清單上的完整字面指令跑得動,連 readlink、ls 這種讀取指令都要各自有規則。放寬允許清單解不掉,因為規則本身也是靜態比對,而且路徑中段的萬用字元不匹配。

deploy 是人在現場跑的技能,開頭那一次核准詢問有人可以按,所以保留自己解路徑的做法。守則另外寫下一句擋回頭路:為了看起來整齊而把字面路徑改回帶變數的寫法,等於再一次弄壞每一個無人看管的輪次。

行為說明表的 deploy 四列同步改寫,觸發時機沒動。

影響排程觸發的無人看管輪次,它們現在才跑得完第一支腳本。現場執行部署的操作者只多出開頭那一次核准詢問。
三份外掛 manifest 的版本欄從 0.3.1 升到 0.3.2,內容由同步腳本產生,其餘欄位未動。

deploy 技能的路徑守則與 Step 0 已經改完,版號要跟著動,版本守衛才判定得出這台機器落後,更新輪次才會把新的技能內容拉下來。

交給 manifest 同步腳本一次寫三份,避免三份手改而版號不一致。

影響每一台裝了這組技能的機器:版本比對與部署更新都讀這個欄位。
admin merged commit 253443e94e into develop 2026-09-03 02:52:09 +00:00
admin deleted branch fix/literal-absolute-paths-for-deploy 2026-09-03 02:52:09 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: plugins/cli#59