例行稽核新增腳本路徑檢核,判文件裡寫的路徑解不解得出來 #74
1 Participants
Notifications
Due Date
No due date set.
Depends on
#73 委派清單加一欄記唯讀盤點的實際指令,19 項逐項回存放庫核對
plugins/meta
#75 唯讀盤點那一欄改掉一個不存在的子命令,補送上一輪沒趕上的修正
plugins/meta
Reference: plugins/meta#74
Reference in New Issue
Block a user
摘要
lint-scripts.sh掃的是tools/與hooks/目錄裡的檔案,它證明得了「這個存取庫裡有這支腳本、語法沒問題」,卻證明不了「文件裡寫的那條路徑解得出那支腳本」。這張 PR 補上後者,並接進例行稽核的第一組。變更內容
tools/check-skill-paths.shskills/*/SKILL.md與references/*.md,解析每一條tools/…與hooks/…路徑,三種判定skills/skill-check/SKILL.mddescription的檢核清單補一支references/behaviors.mdskill-check那一節的關鍵步驟、外部呼叫、可驗證跡象三欄同步這道縫是怎麼被發現的
2026-09-04 開 PR 時實際踩到:一份技能本文把自家腳本寫成不帶前綴的相對路徑,而那支技能的基底目錄是
skills/{名稱}/,照字面解出來的位置沒有那個檔案,結束碼 127。真正的問題不是那個 127,是它為什麼一直沒被抓到。 例行稽核本來就有一項要人確認「本文點名的每一支腳本,呼叫端有沒有分流它宣告的每一個結束碼」,而那一項的前提寫著「
lint-scripts.sh已經證明腳本存在」。人照著讀,就會去看目錄底下有沒有那個檔名——有,於是過了。覆核的問題本身問錯了,所以錯幾次都不會被發現。新那一項刻意擺在舊那一項前面,並把這段理由寫進本文,免得下一輪有人把兩項看成重複的而刪掉一項。
三種判定,以及為什麼只有一種算缺失
missingunrootedunknownunrooted為什麼不算缺失:不帶 domain 名的相對路徑會相對於當下的工作目錄解。在自己那個存取庫裡跑剛好解得對,換一個工作目錄就解到別人的tools/底下,或者解不出來。兩種都沒有明確的錯誤訊息,前者更糟——它會跑起來,跑的是另一支腳本。無人值守那一輪還多一層:相對路徑進不了權限允許清單,會被靜靜擋掉。話說回來,這是整套技能組共通的寫法,實測共 378 處。判成缺失會讓每一個存取庫同時亮紅,而一份全紅的報告跟沒有報告一樣。所以先量出來、指得出是哪幾行,改不改由人決定。技能本文也明寫這兩種提示不得升級成決策樹項目——比照委派清單檢核的待複核與版本落後那兩種提示。
unknown為什麼不算缺失:這台機器沒裝那個 domain,跟路徑寫錯,是兩件事。判定範圍與其極限
只認
tools/與hooks/兩個目錄底下的.sh。templates/與references/底下的檔案不在範圍內——那些是資料不是入口,指錯了不會變成一支跑起來的別的程式。README.md不掃:那裡的路徑是給人看的目錄,不是叫誰去跑的入口。有一類已知的誤判講白:文件在解釋「不要用不帶前綴的寫法」時,會把那個錯誤寫法原樣寫出來當例子,這一支會把那一行也算進提示。實際遇到一次,處置是改寫那句話、描述後果而不照抄寫法——那樣讀起來也更準。
測試結果
missing)、自家不帶前綴檔案在(unrooted)、自家不帶前綴檔案不在(missing)、跨 domain 存取庫在且檔案在(過)、跨 domain 存取庫在但檔案不在(missing)、跨 domain 存取庫不在(unknown)。七種全部符合預期,有缺失時退出 1。missing都沒有,378 條unrooted,0 條unknown。references/behaviors.md的關鍵步驟與外部呼叫兩欄還留著八處舊寫法,而那兩欄正是別人拿來確認一支技能會呼叫誰的地方。已經在那一邊補上。lint-scripts.sh、lint-frontmatter.sh、check-behaviors.sh、ste100-lint.sh、check-link-format.sh對這個存取庫都回結束碼 0。前置 Push Request
plugins/meta的委派清單修正那一張。兩張都動到三份 manifest 的版號,而那一張要緊——它拿掉一個會讓內建項每輪失敗的值,該先走。這一張讓到 0.3.7,等它先合併才不會撞版號。程式碼本身互不相依。lint-scripts.sh 掃的是 tools/ 與 hooks/ 目錄裡的檔案,它證明得了「這個存取庫 裡有這支腳本」,卻證明不了「文件裡寫的那條路徑解得出那支腳本」。兩件事差 很遠,而中間那道縫剛好放得下一整類缺失。 2026-09-04 實際踩到:一份技能本文把自家腳本寫成不帶前綴的相對路徑,而那支 技能的基底目錄是 skills/{名稱}/,照字面解出來的位置沒有那個檔案,結束碼 127。 人工覆核看的是「tools/ 底下有沒有這支」,有,於是每一輪都過。覆核的問題本身 問錯了,所以錯幾次都不會被發現。 三種判定:指到不存在的檔案算缺失;不帶 domain 名但檔案在這個存取庫底下只算 提示;跨 domain 而那個存取庫不在這台機器上也只算提示。中間那一種為什麼不算 缺失——全套技能組有三百多處那樣寫,判成缺失會讓每個存取庫同時亮紅,而一份 全紅的報告跟沒有報告一樣。先量出來、指得出是哪幾行,改不改由人決定。 跨 domain 的路徑靠 plugins-root.sh 找別的存取庫,推不出來的那幾筆印成提示, 不當缺失:這台機器沒裝,跟路徑寫錯,是兩件事。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>