Commit Graph
6 Commits
Author SHA1 Message Date
jiantw83 b41ceb00d9 fix(deploy): 腳本呼叫改成字面絕對路徑,開頭先解一次根目錄
技能文件新增路徑守則一節,寫明這支技能的每一次腳本呼叫都要是字面絕對路徑,不留未展開的變數,也不留波浪號。

新增 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 四列同步改寫,觸發時機沒動。

影響排程觸發的無人看管輪次,它們現在才跑得完第一支腳本。現場執行部署的操作者只多出開頭那一次核准詢問。
2026-09-03 10:33:30 +08:00
jiantw83 d5bc40be13 feat(wiki): 體檢目錄頁改條列式版面,鍵改用體檢頁頁名
What:`templates/check-contents.md` 從 markdown 表格改成一台執行環境一個 H2 區塊,H2 標題就是那一台的體檢頁頁名 `CHECK_{HASH}`,原本的七個欄位改成標題底下一層 `- {欄位名}:{值}` 的條列,頁上不留任何表格。`skills/doctor/SKILL.md` 與 `skills/setup/SKILL.md` 對目錄頁的呼叫從 `wiki-contents.sh upsert CHECK 4 "{HASH}"` 改成 `upsert CHECK 1 "CHECK_{HASH}"`,`references/behaviors.md` 的關鍵步驟、完成條件與可驗證跡象,以及 `README.md` 的兩段技能敘述都跟著對齊。

Why:一列七格的表格,欄位一多就要橫向捲動,讀的人得先數欄位再對照表頭才知道哪一格是什麼;一筆一個 H2 區塊、每一條自己帶欄位名,掃過去就讀得懂。版面換成區塊之後鍵也得跟著換:表格時代的鍵是第 4 欄的裸 `HASH`,區塊沒有欄位可指,唯一能當鍵的是 H2 標題。key-col 與 key 沿用舊值會讓腳本比對不中,同一台機器每體檢一次就在頁尾多附一個區塊,舊區塊從此再也更新不到,而頁面看起來完全正常,錯得無聲無息。頁名只由 `{短主機名}/{登入帳號}` 決定,`GITEA_HOST` 換掉、`JSC_WIKI_REPO_CHECK` 搬到別的存取庫、Gitea 對頁名的編碼有差都動不到它,拿它當鍵比拿任何含網址的值都穩。

How:範本頁首的寫入語意從「一列」改寫成「一個區塊」,並補上四個參數的說明。第三個參數 `<key>` 收 H2 標題文字,也就是 `CHECK_{HASH}`;第四個參數收的是區塊檔而不是列檔,內容為 `## CHECK_{HASH}` 那一行、一個空行,再照範本的欄位順序每欄一條條列,`HASH` 那一欄照樣要寫,標題是鍵不代表欄位可以省,否則下一個讀的人讀不到。第二個參數 `1` 定位成 `<key-col>`,只在頁面還留著舊表格、需要自動轉檔時才用得到,指舊表格裡持有 `[CHECK_{HASH}](網址)` 的第 1 欄,轉檔時取那一格的文字當 H2 標題,頁面已經是條列格式就忽略它。「體檢頁」那一條維持 `[{文字}]({絕對網址})` 的人用連結寫法,H2 標題本身不放連結也不放網址。兩支技能的結束碼分流一併校正:`wiki-contents.sh` 的結束碼 1 從「寫入失敗」改寫成「組不出頁面內容或寫入失敗」,頁上找不到本機那一個區塊不算這一碼,腳本會改成附加。實際的轉檔與 upsert 邏輯都在 `jsc-gitea/tools/wiki-contents.sh`,這個存取庫只改敘述與範本。

Who:屬於「wiki 目錄頁改條列式呈現」這個需求落在 jsc-cli 的部分,也就是 `CHECK_CONTENTS` 這一型目錄頁的去表格化。內容頁維持圖表優先,不在這一輪範圍。
2026-09-02 17:25:37 +08:00
jiantw83 03e59c69bd feat(狀態回報): 收尾寫一筆 skill-end 事件
現行紀錄只記「被叫用」,沒有成敗也沒有結束碼。跑完整輪的技能與開場就
中止的技能,在紀錄裡長得一模一樣。

start 由技能用量 hook 順手發,不必改技能文件。end 只能由技能自己在收尾
步驟寫——hook 接在技能工具呼叫上,而實際工作發生在之後的模型輪次,它在
原理上看不到成敗。有 start 沒有配對的 end,就是那一輪中止了。

status 五選一,每支技能各自寫明什麼情況選哪一個。找不到回報腳本就安靜
跳過,回報失敗一律不改變技能自己的結論。
2026-09-02 16:01:14 +08:00
jiantw83 c76daa61ca feat(link): 連結一律寫成 [文字](絕對網址),寫入前先驗證連得到
取消 [[頁名]] 與 [[顯示文字|頁名]] 兩種同 wiki 寫法,不再分「同存取庫」與
「跨存取庫」兩條規則。那種寫法只在自己那個 wiki 內解析,寫錯不報錯,畫面上
看起來像普通文字或死連結,巡不到也修不了。

連結寫進頁面前先過 jsc-gitea 的 link-check.sh,結束碼 0 才寫。驗證一律走 API,
不看網頁狀態碼:私有存取庫的網頁網址對未登入請求一律回 404,拿狀態碼判會把
好連結判成壞的。認證失敗回 7,與死連結的 1 分開,免得金鑰一過期就把還在的頁
整批判死。
2026-09-02 14:27:18 +08:00
jiantw83 fb80559159 feat(wiki): 體檢目錄頁改走專用存取庫,並補齊設定規格表
What:CHECK_CONTENTS 改由 wiki-repo CONTENTS 解析並透過 wiki-contents.sh upsert
寫入,CHECK_{HASH} 仍走 wiki-repo CHECK。目錄頁新增一欄裸 HASH 當比對鍵。主機名
改由程式取短名,不再交給模型自由填。

Why:比對鍵原本是含網址的儲存格,換主機或換存取庫就比對不到,每跑一次體檢就替同一台
機器多附一列,畫面上還看不出來。主機名短名與 FQDN 不一致時,同一台機器會分裂成兩張頁,
而助理巡檢那邊是用程式取值的,兩邊對不起來。

How:設定規格表同一輪補齊三處既有缺漏——補上漏掉的 JSC_WIKI_REPO_MONITOR,體檢本來
看不到它而孤兒掃描還會誤報;刪掉指向不存在頁面的 MAINTAIN 內容頁字樣;MAINTAIN 那一列
改成不需要使用者處理,免得體檢叫人去設一支管不到任何頁的變數。整列保留,刪掉會讓孤兒
掃描開始誤報那個變數。

Who:jsc-cli
2026-09-02 11:03:07 +08:00
jiantw83 76b3f2dcb6 docs(references): 新增五支技能的行為清單作為驗證基準
What:新增 references/behaviors.md。這一頁列出 delegate、deploy、doctor、models、setup 五支技能的行為。每支技能記錄觸發時機、關鍵步驟、外部呼叫、完成條件、可驗證跡象五個項目。

Why:技能驗證以前沒有共同基準。驗證的人只能自己讀 SKILL.md 反推該有哪些行為,兩個人推出來的結果不會一樣。有了這一頁,驗證就比對同一份基準。

How:一支技能一個章節,章節內用一張兩欄表格寫滿五個項目。外部呼叫欄位寫出腳本路徑與子命令,可驗證跡象欄位寫出實際會被改動的檔案或目錄。頁首寫明規則:技能異動時,要在同一個 PR 內一起更新這一頁。

Who:技能驗證基準。
2026-08-31 13:35:40 +08:00