fix/literal-absolute-paths-for-deploy
develop
skills/deploy/SKILL.md
references/behaviors.md
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
JSC_HOME
readlink -f "$JSC_HOME/current"
/current
[ -d ]
current
readlink
check-behaviors.sh
ste100-lint.sh
lint-frontmatter.sh
lint-scripts.sh
技能文件新增路徑守則一節,寫明這支技能的每一次腳本呼叫都要是字面絕對路徑,不留未展開的變數,也不留波浪號。 新增 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 同步腳本一次寫三份,避免三份手改而版號不一致。 影響每一台裝了這組技能的機器:版本比對與部署更新都讀這個欄位。
No dependencies set.
The note is not visible to the blocked user.
摘要
變更內容
skills/deploy/SKILL.mdreferences/behaviors.mdplugin.json.claude-plugin/plugin.json.codex-plugin/plugin.json設計重點
JSC_HOME沒設時readlink -f "$JSC_HOME/current"印出/current、結束碼 0,前兩項全部放行,而那個目錄並不存在,之後每一條字面路徑都是錯的。所以加上[ -d ]。current這一層就停。current本身是一般目錄,符號連結在下一層、每個外掛各一條;再往下解一層會落到帶版本號的快取路徑,那正是放不進允許清單的一種。readlink是整輪唯一容許帶變數的指令。current底下,那裡只放另外三個外掛,所以另外用 CLI 載入技能時講明的外掛基底目錄,原樣照抄、不跑指令。這個例外只限這一支有人值守的技能,文件裡寫明不得照抄到排程跑的技能。測試結果
check-behaviors.sh、ste100-lint.sh、lint-frontmatter.sh、lint-scripts.sh四支對這個存放庫都回結束碼 0。readlink與說明用文字保留變數字樣。前置 Push Request