# 技能組異動目錄 > 由 `jsc-meta` 的 `skill-new`、`skill-update`、`skill-delete`、`skillset-update`、`skill-check` 共同維護。這是目錄頁 `SKILLSET_CONTENTS`。 > 一列代表一個 domain 存取庫。技能組有幾個 domain 被改過,就有幾列。 > 本頁落在 `JSC_WIKI_REPO_CONTENTS` 解出來的存取庫,不是內容頁那一個。解析鏈是 `JSC_WIKI_REPO_CONTENTS` → `JSC_WIKI_REPO` → exit 3,中間不退回 `JSC_WIKI_REPO_SKILLSET`。 > 寫入一律用 `jsc-gitea/tools/wiki-contents.sh upsert SKILLSET 2 "{owner}/{repo}" {列檔} templates/skillset-contents.md`:`` 填 `SKILLSET`,鍵欄填數字 `2`,也就是「存取庫」那一欄。 > 它讀回整頁、換掉鍵欄相符的那一列、找不到才附加,最後整頁寫回。不得手工改目錄頁。 > `SKILLSET_{HASH}` 的 `{HASH}` 交給 `jsc-gitea/tools/hash-id` 產生,雜湊來源見 `jsc-meta/references/guidelines.md` 的「Wiki 頁命名總表」。 | 異動頁 | 存取庫 | 最近異動 | 異動次數 | 最後更新 | | --- | --- | --- | ---: | --- | | [SKILLSET_{HASH}]({GITEA_HOST}/{owner}/{repo}/wiki/SKILLSET_{HASH}) | {owner}/{repo} | {一句話寫這一次改了什麼} | {n} | {yyyy-MM-dd HH:mm} | ## 欄位說明 | 欄位 | 內容 | | --- | --- | | 異動頁 | 指向 `SKILLSET_{HASH}` 的**絕對網址**,格式 `{GITEA_HOST}/{owner}/{repo}/wiki/SKILLSET_{HASH}`。`{owner}/{repo}` 是內容頁那一個存取庫 | | 存取庫 | 被改動的 domain 存取庫 `{owner}/{repo}`,也就是這一頁的雜湊來源 | | 最近異動 | 最後一次異動的一句話摘要,與內容頁最新一節的「異動需求」同一句 | | 異動次數 | 該內容頁累積的節數。內容頁只附加不覆蓋,所以這個數字只會往上加 | | 最後更新 | 最後一次寫入內容頁的時間,與那一節的日期一致 | ## 為什麼連結要用絕對網址 目錄頁與內容頁分屬不同存取庫。`[[SKILLSET_{HASH}]]` 這種同 wiki 連結解到的是目錄頁自己那個存取庫,那裡沒有這一頁,點下去是 404。 更麻煩的是它看起來像「頁沒寫成功」,實際上頁好好的,只是連結指錯地方,查的人會回去重寫一次已經寫好的頁。 ## 寫入規則 - 一律走 `jsc-gitea/tools/wiki-contents.sh upsert`,鍵欄是第 2 欄「存取庫」,鍵值是 `{owner}/{repo}`。 - 那支腳本先整頁讀回來,再比對「存取庫」欄。 - 該欄相同就更新那一列,其餘欄位覆寫成本次結果。 - 找不到相同的一列,才新增一列。 - 只動自己那一列,別人的列原樣保留。 - 禁止整頁覆蓋。這一頁是全部 domain 共用的索引,覆蓋等於刪掉別的 domain 的紀錄。 - 讀不到舊內容就中止,不新增列,也不寫入。 - 先寫內容頁,成功了才回來更新這一列。目錄列指向一個寫失敗的頁,比缺一列更難查。