fix/skill-check-compliance-and-flow #32

Merged
admin merged 5 commits from fix/skill-check-compliance-and-flow into develop 2026-08-31 03:24:34 +00:00
Member

摘要

  • 需求描述:修掉三個「認證失敗偽裝成別的結果」的缺陷,補上三個新指令與一個新頁面類型,並依技能檢查結果補齊結束碼分流與流程併行。版本推進到 0.1.8。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
tools/gitea.sh 管線把 req 的失敗吃掉,wiki-list 與 pr-comments 在金鑰失效時看起來像「查詢成功、內容是空的」;wiki-get 把每一種失敗都回成「頁面不存在」。改成每條管線先接進變數再看結束碼,並把 404、401/403 與其他失敗分成 4、7、8 三個結束碼。同時新增 pr-of-branch,一次帶回編號、標題、base 與描述,並給「這條分支沒有 PR」自己的結束碼 3。
tools/issue.sh 同一類管線吞噬缺陷:金鑰失效時回應是一份錯誤 JSON,解析程式挑不到標籤就印出空清單並回 0,看起來像「這個議題沒有標籤」。改成先接變數再解析。新增 show,把一筆議題的標題、標籤與正文從三次 API 呼叫降成一次。看板網址改由共用函式印出,兩條 exit 3 路徑都拿得到那條連結。
tools/html-style.sh 新增 key 子指令。字首怎麼切、標籤照什麼順序試,本來寫在技能內文由模型重推,容易切錯或跳號;現在規則進腳本,輸出固定一行「種類+依據」。
tools/check-wiki-rules.sh 把新頁面類型 TOOLING 加進驗證清單,解析規則才有人驗。檔頭補上結束碼宣告。
tools/hash-id 檔頭補上結束碼宣告,呼叫端才知道機器缺少雜湊工具時該怎麼處理。
tools/pr-watch.sh 原本的「退出碼」段落只列四碼且說明過簡。改寫成完整結束碼表,逐碼寫明呼叫端下一步該做什麼,並補上訊號中止那一碼。
tools/repo-sync.sh 檔頭補上結束碼宣告,明確標示只有 0 與 1 兩種。
skills/wiki/SKILL.md 新增結束碼對照表,並把「只有 exit 4 代表頁面還不存在」升級成獨立規則,明寫涵蓋每一條「不存在就建立」的路徑,不限目錄頁。頁面類型清單補上 TOOLING。
skills/wiki-to-issue/SKILL.md 連結檢查與主機檢查改成同一批執行,讀頁、標籤清單、看板清單三軌併行。每一支腳本呼叫都補上結束碼分流。
skills/html-export/SKILL.md 新增主機檢查步驟;內容、範本、輸出位置三軌併行;議題改用 issue.sh show 一次取齊;種類推導改呼叫 html-style.sh key。渲染與解析的結束碼逐碼分流。
skills/html-style/SKILL.md 清單與寫入指令補上結束碼分流,並說明清單為空代表範本目錄不見了,該停下來報路徑。
skills/repo-sync/SKILL.md 存取庫改為併行同步,一個存取庫一個 sub agent,同一批送出。連線變數的檢查併進第一步,缺值在動工前就浮現。
README.md 補上 pr-of-branch、issue.sh show、html-style.sh key 的用法與全腳本共用結束碼;頁面類型清單補 TOOLING 與對應環境變數;更正兩處過期內容:重複複述的雜湊規則改指向唯一來源,技能組異動報告的雜湊來源敘述已不成立故刪除。
AGENTS.md domain 簡介補上議題轉換與 HTML 匯出,與實際提供的技能一致。
.claude-plugin/plugin.json 版本推進到 0.1.8,並宣告相依技能組的版本下限。
.codex-plugin/plugin.json 同上,Codex 版資訊清單同步。
plugin.json 同上,根資訊清單同步。

設計重點

  • 失敗成因一定要分開回報。 全部歸成「找不到」是最危險的一種簡化:認證失敗看起來就像頁面不存在,而 wiki 寫入是附加、不覆蓋,判斷依據正是先讀回舊內容。誤判會讓呼叫端把整頁蓋掉,寫入沒有合併也沒有備份。
  • req 的輸出一律先接進變數。 直接接管線時,結束狀態取自後段的解析程式,前段的失敗完全消失。這是這輪三個缺陷共同的成因。
  • HTTP 狀態碼寫進檔案而非變數。 req 幾乎都在 $(...) 裡執行,子行程設的變數回不到主行程,狀態碼會在回程上不見。
  • 「查無資料」與「呼叫失敗」永遠是兩個結束碼。 pr-of-branch 的「沒有 PR」用 3、API 失敗用 4;兩者混用會把金鑰失效讀成「還沒開過 PR」,接著開出重複的 PR。
  • 只靠空回應收尾的迴圈要有上限。 pr-of-branch 加上頁數上限,站台或代理若忽略分頁參數,會回報錯誤而不是無聲卡住。
  • 固定的輸入輸出交給腳本,不交給模型。 種類推導與議題三欄查詢都收進腳本,順便把一筆議題的 API 呼叫從三次降到一次,也避免取到三個不同時間點的版本。
  • 彼此不相依的步驟同一批送出。 HTML 匯出三軌併行、議題轉換三軌併行、存取庫批次同步改為各存取庫同時進行。

合併說明

本分支原本接在較舊的基底上,已改接到目前的 develop。四處衝突全部是「兩邊各加各的」,一律兩邊都保留:

  • tools/gitea.sh 的 pr-create:保留 develop 的寫入前確認,也保留本輪補的描述檔存在性檢查。檢查排在確認之前,先擋掉打錯的參數,才不會問完使用者又失敗。
  • skills/wiki/SKILL.md:採用本輪重寫的結束碼表與規則,並把 develop 的「寫入前會先確認」併進操作表與目錄頁規則。
  • README.md:本輪新增的 pr-of-branch 與 issue.sh show 用法保留,develop 標註的「會先要求確認」七處全數保留。
  • skills/wiki-to-issue/SKILL.md:採用本輪重寫的併行步驟,建立議題那一步補上 develop 的確認提示。

tools/write-confirm.sh 與六處 confirm_write 呼叫點合併後全數在位,已逐一核對。

測試結果

  • sh -n 對 tools/ 下全部 shell 腳本加 tools/hash-id:全數通過,無語法錯誤。合併後重跑一次,同樣全過。
  • python3 -m json.tool 對 .claude-plugin/plugin.json、.codex-plugin/plugin.json、plugin.json:三份皆為合法 JSON,版本欄皆為 0.1.8,皆帶 jsc.requires。
  • tools/check-wiki-rules.sh:印出 OK,結束碼 0。清單含新增的 TOOLING,三項規則(專用變數優先、退回共用變數、不得跨類型代用)全數通過。
  • tools/html-style.sh key wiki ANALYZE_D3F1A2B0 → WIKI:ANALYZE<TAB>prefix:ANALYZE;無底線頁名 PLAIN → WIKI:PLAIN<TAB>prefix:PLAIN。字首切法符合說明。
  • tools/html-style.sh key issue acme/demo 12 --labels bug,doc → ISSUE:DEFAULT<TAB>fallback:no-configured-label;--labels "" → ISSUE:DEFAULT<TAB>fallback:no-labels。帶 --labels 時確實沒有發出任何 API 呼叫。
  • tools/html-style.sh layouts 印出 6 種版型、styles 印出 5 種風格,與技能內文要求的完整清單一致。
  • 用法錯誤路徑:html-style.sh key、html-style.sh key issue 皆印出用法並回 2;issue.sh show badrepo 1 在任何 API 呼叫之前就以格式錯誤回 2;issue.sh 無參數回 2。
  • tools/hash-id:正常輸出 8 碼,首碼落在 0-9/A/B/C 時確實改成 H 前綴。
  • 未執行:任何會連上 Gitea 的呼叫。認證分流(4/7/8)、pr-of-branch、issue.sh show 的實際回應皆為靜態檢視,未做線上驗證。

前置 Push Request

無

## 摘要 - **需求描述**:修掉三個「認證失敗偽裝成別的結果」的缺陷,補上三個新指令與一個新頁面類型,並依技能檢查結果補齊結束碼分流與流程併行。版本推進到 0.1.8。 - **計畫名稱**:無 - **計畫頁**:無 - **分析頁**:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `tools/gitea.sh` | 管線把 `req` 的失敗吃掉,`wiki-list` 與 `pr-comments` 在金鑰失效時看起來像「查詢成功、內容是空的」;`wiki-get` 把每一種失敗都回成「頁面不存在」。改成每條管線先接進變數再看結束碼,並把 404、401/403 與其他失敗分成 4、7、8 三個結束碼。同時新增 `pr-of-branch`,一次帶回編號、標題、base 與描述,並給「這條分支沒有 PR」自己的結束碼 3。 | | `tools/issue.sh` | 同一類管線吞噬缺陷:金鑰失效時回應是一份錯誤 JSON,解析程式挑不到標籤就印出空清單並回 0,看起來像「這個議題沒有標籤」。改成先接變數再解析。新增 `show`,把一筆議題的標題、標籤與正文從三次 API 呼叫降成一次。看板網址改由共用函式印出,兩條 exit 3 路徑都拿得到那條連結。 | | `tools/html-style.sh` | 新增 `key` 子指令。字首怎麼切、標籤照什麼順序試,本來寫在技能內文由模型重推,容易切錯或跳號;現在規則進腳本,輸出固定一行「種類+依據」。 | | `tools/check-wiki-rules.sh` | 把新頁面類型 `TOOLING` 加進驗證清單,解析規則才有人驗。檔頭補上結束碼宣告。 | | `tools/hash-id` | 檔頭補上結束碼宣告,呼叫端才知道機器缺少雜湊工具時該怎麼處理。 | | `tools/pr-watch.sh` | 原本的「退出碼」段落只列四碼且說明過簡。改寫成完整結束碼表,逐碼寫明呼叫端下一步該做什麼,並補上訊號中止那一碼。 | | `tools/repo-sync.sh` | 檔頭補上結束碼宣告,明確標示只有 0 與 1 兩種。 | | `skills/wiki/SKILL.md` | 新增結束碼對照表,並把「只有 exit 4 代表頁面還不存在」升級成獨立規則,明寫涵蓋每一條「不存在就建立」的路徑,不限目錄頁。頁面類型清單補上 `TOOLING`。 | | `skills/wiki-to-issue/SKILL.md` | 連結檢查與主機檢查改成同一批執行,讀頁、標籤清單、看板清單三軌併行。每一支腳本呼叫都補上結束碼分流。 | | `skills/html-export/SKILL.md` | 新增主機檢查步驟;內容、範本、輸出位置三軌併行;議題改用 `issue.sh show` 一次取齊;種類推導改呼叫 `html-style.sh key`。渲染與解析的結束碼逐碼分流。 | | `skills/html-style/SKILL.md` | 清單與寫入指令補上結束碼分流,並說明清單為空代表範本目錄不見了,該停下來報路徑。 | | `skills/repo-sync/SKILL.md` | 存取庫改為併行同步,一個存取庫一個 sub agent,同一批送出。連線變數的檢查併進第一步,缺值在動工前就浮現。 | | `README.md` | 補上 `pr-of-branch`、`issue.sh show`、`html-style.sh key` 的用法與全腳本共用結束碼;頁面類型清單補 `TOOLING` 與對應環境變數;更正兩處過期內容:重複複述的雜湊規則改指向唯一來源,技能組異動報告的雜湊來源敘述已不成立故刪除。 | | `AGENTS.md` | domain 簡介補上議題轉換與 HTML 匯出,與實際提供的技能一致。 | | `.claude-plugin/plugin.json` | 版本推進到 0.1.8,並宣告相依技能組的版本下限。 | | `.codex-plugin/plugin.json` | 同上,Codex 版資訊清單同步。 | | `plugin.json` | 同上,根資訊清單同步。 | ## 設計重點 - **失敗成因一定要分開回報。** 全部歸成「找不到」是最危險的一種簡化:認證失敗看起來就像頁面不存在,而 wiki 寫入是附加、不覆蓋,判斷依據正是先讀回舊內容。誤判會讓呼叫端把整頁蓋掉,寫入沒有合併也沒有備份。 - **`req` 的輸出一律先接進變數。** 直接接管線時,結束狀態取自後段的解析程式,前段的失敗完全消失。這是這輪三個缺陷共同的成因。 - **HTTP 狀態碼寫進檔案而非變數。** `req` 幾乎都在 `$(...)` 裡執行,子行程設的變數回不到主行程,狀態碼會在回程上不見。 - **「查無資料」與「呼叫失敗」永遠是兩個結束碼。** `pr-of-branch` 的「沒有 PR」用 3、API 失敗用 4;兩者混用會把金鑰失效讀成「還沒開過 PR」,接著開出重複的 PR。 - **只靠空回應收尾的迴圈要有上限。** `pr-of-branch` 加上頁數上限,站台或代理若忽略分頁參數,會回報錯誤而不是無聲卡住。 - **固定的輸入輸出交給腳本,不交給模型。** 種類推導與議題三欄查詢都收進腳本,順便把一筆議題的 API 呼叫從三次降到一次,也避免取到三個不同時間點的版本。 - **彼此不相依的步驟同一批送出。** HTML 匯出三軌併行、議題轉換三軌併行、存取庫批次同步改為各存取庫同時進行。 ## 合併說明 本分支原本接在較舊的基底上,已改接到目前的 develop。四處衝突全部是「兩邊各加各的」,一律兩邊都保留: - `tools/gitea.sh` 的 `pr-create`:保留 develop 的寫入前確認,也保留本輪補的描述檔存在性檢查。檢查排在確認之前,先擋掉打錯的參數,才不會問完使用者又失敗。 - `skills/wiki/SKILL.md`:採用本輪重寫的結束碼表與規則,並把 develop 的「寫入前會先確認」併進操作表與目錄頁規則。 - `README.md`:本輪新增的 `pr-of-branch` 與 `issue.sh show` 用法保留,develop 標註的「會先要求確認」七處全數保留。 - `skills/wiki-to-issue/SKILL.md`:採用本輪重寫的併行步驟,建立議題那一步補上 develop 的確認提示。 `tools/write-confirm.sh` 與六處 `confirm_write` 呼叫點合併後全數在位,已逐一核對。 ## 測試結果 - `sh -n` 對 `tools/` 下全部 shell 腳本加 `tools/hash-id`:全數通過,無語法錯誤。合併後重跑一次,同樣全過。 - `python3 -m json.tool` 對 `.claude-plugin/plugin.json`、`.codex-plugin/plugin.json`、`plugin.json`:三份皆為合法 JSON,版本欄皆為 `0.1.8`,皆帶 `jsc.requires`。 - `tools/check-wiki-rules.sh`:印出 `OK`,結束碼 0。清單含新增的 `TOOLING`,三項規則(專用變數優先、退回共用變數、不得跨類型代用)全數通過。 - `tools/html-style.sh key wiki ANALYZE_D3F1A2B0` → `WIKI:ANALYZE<TAB>prefix:ANALYZE`;無底線頁名 `PLAIN` → `WIKI:PLAIN<TAB>prefix:PLAIN`。字首切法符合說明。 - `tools/html-style.sh key issue acme/demo 12 --labels bug,doc` → `ISSUE:DEFAULT<TAB>fallback:no-configured-label`;`--labels ""` → `ISSUE:DEFAULT<TAB>fallback:no-labels`。帶 `--labels` 時確實沒有發出任何 API 呼叫。 - `tools/html-style.sh layouts` 印出 6 種版型、`styles` 印出 5 種風格,與技能內文要求的完整清單一致。 - 用法錯誤路徑:`html-style.sh key`、`html-style.sh key issue` 皆印出用法並回 2;`issue.sh show badrepo 1` 在任何 API 呼叫之前就以格式錯誤回 2;`issue.sh` 無參數回 2。 - `tools/hash-id`:正常輸出 8 碼,首碼落在 0-9/A/B/C 時確實改成 `H` 前綴。 - 未執行:任何會連上 Gitea 的呼叫。認證分流(4/7/8)、`pr-of-branch`、`issue.sh show` 的實際回應皆為靜態檢視,未做線上驗證。 ## 前置 Push Request 無
jiantw83 added 4 commits 2026-08-31 03:16:12 +00:00
金鑰失效以前會偽裝成別的結果。指令把請求直接接進管線,管線的結束狀態
取自後段的解析程式,前段的失敗就被吃掉。wiki 頁清單因此看起來是空的,
PR 留言看起來像沒有任何審查意見。wiki 讀取更把每一種失敗都翻成
「頁面不存在」。

技能組寫 wiki 的語意是附加、不覆蓋,判斷依據是先把舊內容讀回來。呼叫端
一旦把認證失敗當成一張新頁,就會整份蓋上去,舊紀錄直接消失。

現在失敗成因分開回報:找不到、金鑰失效或權限不足、其他 API 失敗,各給
一個結束碼。每條管線先接進變數,先看結束碼,再解析內容。議題工具的同一
類缺陷一併修掉。wiki 技能也把「只有找不到才可以建新頁」寫成獨立規則,
涵蓋每一條「不存在就建立」的路徑。
範本種類以前由模型每次重推。底線怎麼切、標籤照什麼順序試,都是固定的
輸入輸出,卻放在技能內文裡由模型自己來,有人切錯底線,也有人跳過標籤
順序。現在把規則寫進腳本,輸出固定一行,還附上是哪個字首或哪個標籤產生
的依據。已經有標籤名單時可以直接帶進來,省掉一次 API 呼叫。

技能盤點頁是新的頁面類型。加進 wiki 存取庫的允許清單與規則驗證腳本,
這種頁才有地方可放,解析規則也才有人驗。
說明文件有兩處與現況不符。雜湊規則在這裡複述了一份,跟唯一來源各說各
話,讀的人會照著舊的做;技能組異動報告的雜湊來源早就改過,敘述卻留在
原地。現在改成指向唯一來源,並刪掉重複的那一份。

新增的指令、頁面類型與全腳本共用的結束碼也一併寫進說明。查不到就只能
翻程式,那正是說明文件該擋下來的成本。domain 簡介補上議題轉換與 HTML
匯出,與實際提供的技能一致。
技能以前只寫成功路徑。腳本回非 0 時,模型得自己猜下一步,猜錯就是靜靜
往下走。現在每一支腳本在檔頭宣告自己的結束碼,技能也逐碼寫明要停、要
問、還是要改參數再呼叫一次。兩支技能補上連線變數的解析步驟,讓缺值在
第一步就浮出來,而不是在中途撞出一行英文錯誤。

流程也拉平了。取內容、選範本、問輸出位置這幾件事彼此不相依,改成同一批
送出;存取庫批次同步從逐一處理改成各存取庫同時進行,一個 owner 底下有
上百個存取庫時差距最明顯。

相依的技能組下限寫進外掛設定,版本推進。
jiantw83 added 1 commit 2026-08-31 03:19:40 +00:00
檔頭只寫了用法與規則,沒有列結束碼,呼叫端無法逐碼分流,腳本檢查因此不通過。
依實作補上兩碼:0 表示已確認,可以送出寫入;2 表示不要寫入,並列出走這一碼的五種情形。
一併說明用法錯誤與人工拒絕為何共用 2。只加註解,指令行為與輸出都沒有變。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
admin merged commit 001da3988c into develop 2026-08-31 03:24:34 +00:00
admin deleted branch fix/skill-check-compliance-and-flow 2026-08-31 03:24:34 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: plugins/gitea#32