Files
cli/templates/check-contents.md
T
jiantw83 5b0eb784b4 fix(doctor,setup): 兩支技能補上路徑守則,呼叫一律字面絕對路徑
這兩支技能的腳本呼叫原本全是裸相對路徑,整份文件沒有任何路徑守則。相對路徑會對著操作者當下的工作目錄解,而那裡從來不是外掛根目錄,所以每一個呼叫點都是模型就地猜前綴的地方。部署技能原本三處相對路徑被補成帶變數路徑,就是同一個機制。

實際掃到的處數比預估多:體檢 18 處、修復 20 處。多出來的是兩類原本沒想到的——裸檔名的 Gitea 呼叫,以及被當成參數傳的資料檔。後者同樣會解錯地方,而且解錯了不會報錯。

兩支各補路徑守則與前置步驟,解出兩條根目錄:跨外掛走 current 那一層(解到那一層就停,再往下解會落到帶版本號的快取路徑,那種路徑進不了允許清單),技能自己的腳本與範本走 CLI 載入技能時講明的外掛基底目錄。

兩支都不靠 current 底下那條 jsc-cli 連結,但理由各自不同,不是照抄部署那一支的。體檢不能靠,因為它正是機器可疑時才跑的技能——觸發時機本身就是連結可能出錯的那幾個時刻,而連結指著舊版時拿到的是舊的掃描腳本與舊的規格表,掃出來的每一列都像真的發現,不會有任何錯誤訊息。修復更不能靠,因為它寫檔,而且它要修的其中一列正是那個決定連結位置的變數:那種機器上根目錄根本解不出來,而修它要用的腳本掛在外掛基底目錄底下、不依賴那個變數,所以解不出來既不停這一輪也不擋那一項修復。何況拿舊的寫入腳本改設定檔,再用同一份舊腳本重驗,兩邊當然對得上,整輪會報成已修。

失敗分支也與部署不同。部署解不出根目錄就停手;這兩支都不停——體檢把它記成一項發現然後跑完不需要跨外掛的檢查,因為唯讀體檢中途停掉操作者什麼都拿不到;修復把它當成待修的那一項,修好再重解一次。

兩份範本與說明文件一併改。範本是這兩支技能在同一輪一起讀的,而且指示寫入,留著裸路徑等於留一個繞過新規則的入口。範本裡另外補掉兩個路徑洞:指向範本自己的佔位符原本沒有路徑,以及一個連目錄都沒有的裸檔名。

行為契約四列跟著改,並補上可稽核的跡象:回報裡的腳本路徑全是字面絕對路徑,跨外掛的路徑中間是 current 那一層而不是帶版本號的快取路徑。
2026-09-03 13:07:07 +08:00

3.9 KiB
Raw Blame History

體檢目錄

由 jsc-cli:doctor 維護。每台執行環境一個區塊;HASH 取 {短主機名}/{登入帳號},算法與其他頁面共用。主機名取不含網域的短名,FQDN 要先切掉第一個點之後的部分,否則同一台機器會多出第二頁。

本頁落在 JSC_WIKI_REPO_CONTENTS 解出的專用存取庫,與體檢頁 CHECK_{HASH} 不同庫。目錄頁全部住這裡,不退回 JSC_WIKI_REPO_CHECK。

路徑寫法:底下每一支腳本都以字面絕對路徑呼叫,不留 $JSC_HOME、不留波浪號,也不留裸的相對路徑——權限層靜態比對路徑,帶變數的比不中任何規則,相對路徑則會對著操作者當下的工作目錄解,而那裡從來不是外掛根目錄。{JSC_ROOT} 是 readlink -f "$JSC_HOME/current" 解出的那個目錄,解到那一層就停,不再往下解成帶版本號的快取路徑;{CLI_ROOT} 是 CLI 載入技能時講明的 jsc-cli 外掛基底目錄。兩者都在技能開跑時各解一次,之後逐字代入。

寫入語意:一個區塊代表一台執行環境,也就是一組主機加帳號。一律用 {JSC_ROOT}/jsc-gitea/tools/wiki-contents.sh upsert CHECK 1 CHECK_{HASH} {區塊檔} {CLI_ROOT}/templates/check-contents.md 寫,它先讀回整頁,該執行環境已經有區塊就整塊換掉,沒有才在頁尾附加一個區塊。禁止整頁覆蓋,也不得改動別人的區塊。體檢頁 CHECK_{HASH} 只留最新一次結果、可以整頁改寫,這份目錄頁不行。

參數說明:第二個參數 1 是 <key-col>,只在這一頁還留著舊的 markdown 表格時用得到,指舊表格裡持有身分那一欄的序號,也就是持有 [CHECK_{HASH}](網址) 的第 1 欄,自動轉檔時取那一格的文字當 H2 標題;頁面已經是條列格式就完全忽略它。第三個參數 <key> 是 H2 標題文字,也就是體檢頁頁名 CHECK_{HASH}。第四個參數是區塊檔,不是列檔:內容為 ## CHECK_{HASH} 那一行、一個空行,再接各條欄位。

鍵是 H2 標題 CHECK_{HASH}:{JSC_ROOT}/jsc-gitea/tools/hash-id 印出什麼就接在 CHECK_ 後面,完整 40 碼大寫十六進位,不截短、不加別的前後綴、不包成連結、不加日期。腳本比對的是去掉頭尾空白後的整段標題文字,鍵一定要跟標題一字不差。

鍵用頁名才穩。頁名只由 {短主機名}/{登入帳號} 決定;GITEA_HOST 換掉、JSC_WIKI_REPO_CHECK 換過存取庫、Gitea 對頁名的網址編碼有差,網址就跟著變,頁名一個字都不動。拿含網址的值當鍵,比對就永遠比不中,同一台機器每體檢一次就多附一個區塊,畫面上還看不出來。

連結寫法:「體檢頁」那一條的連結只給人點,不當鍵用;H2 標題本身不放連結、不放網址。連結一律寫成 [{文字}]({連結}),也就是 [CHECK_{HASH}]({wiki-url 印出的絕對網址}),網址取 {JSC_ROOT}/jsc-gitea/tools/gitea.sh wiki-url 印出的那一串,不自己組路徑。同 wiki 的雙括號寫法一概不用:兩頁分屬不同存取庫,連不過去,畫面上還看不出壞掉。

連結驗證:這個區塊要寫進去的每一個連結,先交給 {JSC_ROOT}/jsc-gitea/tools/link-check.sh,結束碼 0 才寫。有任何一筆 DEAD 就整個區塊都不寫,把連不到的清單回報給呼叫端。結束碼 3 代表 GITEA_HOST 沒設定,先設好再寫,不得跳過驗證;結束碼 7 代表金鑰失效,停下來回報金鑰問題,不要當成死連結。驗證一律走 API,不看網頁狀態碼:私有存取庫的網頁網址對未登入請求一律回 404,拿狀態碼判會把好連結判成壞的,整批砍掉還在的頁。

CHECK_{HASH}

  • 體檢頁:[CHECK_{HASH}]({wiki-url 印出的絕對網址})
  • 主機:{短主機名}
  • 帳號:{使用者帳號}
  • HASH:{HASH}
  • 必要項缺漏:{n}
  • 設定錯誤:{n}
  • 最後體檢:{yyyy-MM-dd HH:mm}