diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 5b506ee..fdad75e 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-shared", - "version": "0.1.5", + "version": "0.1.6", "description": "JSC 跨 AI 助理共用規範 skills plugin(Claude Code / Codex / Antigravity / OpenCode / GitHub Copilot CLI),`skills/` 為唯一真實來源,並提供整組 plugin 的安裝/更新/移除管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona/jsc-shared,plugins-uninstall 一次移除四個 JSC plugin)。安裝與更新一律以 Gitea 遠端 repo 的 README 與檔案為準,不依賴既有本機存取庫;所有 skills 以 SKILL.md 為共通標準;於 Claude Code 以 /jsc-shared: 前綴呼叫。", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 644f737..50d1e24 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-shared", - "version": "0.1.5", + "version": "0.1.6", "description": "JSC 跨 AI 助理共用規範 skills plugin,`skills/` 為唯一真實來源,並提供整組 plugin 的安裝/更新/移除管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona/jsc-shared,plugins-uninstall 一次移除四個 JSC plugin)。安裝與更新一律以 Gitea 遠端 repo 的 README 與檔案為準,不依賴既有本機存取庫;所有 skills 以 SKILL.md 為共通標準。", "skills": "./skills" } diff --git a/plugin.json b/plugin.json index aa1156f..a9b1066 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-shared", - "version": "0.1.5", + "version": "0.1.6", "description": "JSC 跨 AI 助理共用規範 skills plugin,`skills/` 為唯一真實來源,並提供整組 plugin 的安裝/更新/移除管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona/jsc-shared,plugins-uninstall 一次移除四個 JSC plugin)。安裝與更新一律以 Gitea 遠端 repo 的 README 與檔案為準,不依賴既有本機存取庫;所有 skills 以 SKILL.md 為共通標準;於 Antigravity 以 /jsc-shared: 前綴呼叫。", "skills": "./skills" } diff --git a/plugin.meta.json b/plugin.meta.json index 563c5cd..e478071 100644 --- a/plugin.meta.json +++ b/plugin.meta.json @@ -1,7 +1,7 @@ { "name": "jsc-shared", "shortName": "shared", - "version": "0.1.5", + "version": "0.1.6", "descriptionCore": "JSC 跨 AI 助理共用規範 skills plugin,`skills/` 為唯一真實來源,並提供整組 plugin 的安裝/更新/移除管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona/jsc-shared,plugins-uninstall 一次移除四個 JSC plugin)。安裝與更新一律以 Gitea 遠端 repo 的 README 與檔案為準,不依賴既有本機存取庫;所有 skills 以 SKILL.md 為共通標準。", "assistants": ["Claude Code", "Codex", "Antigravity", "OpenCode", "GitHub Copilot CLI"], "cliPrefix": "/jsc-shared:", diff --git a/skills/plan-wiki/SKILL.md b/skills/plan-wiki/SKILL.md index 93fa7af..15cdc24 100644 --- a/skills/plan-wiki/SKILL.md +++ b/skills/plan-wiki/SKILL.md @@ -31,7 +31,8 @@ argument-hint: "[--wiki-repo ] [--index CONTENTS] [--project <計畫 - 目錄頁禁止整頁覆蓋:不存在時才新建;存在時必須保留既有內容,只修改本計畫既有列或在既有表格附加新列。 - **不落地絕對規則**:不得建立本機 `plan.md`、`todo.md`、`.md` 草稿、暫存 JSON body、wiki clone、或任何用來傳遞中間成果的檔案;中間成果只存在於對話內容與 Gitea wiki API request body。不得使用 `curl --data @file`。 - 使用者已用參數指定 `--wiki-repo`、`--index`、`--project`、`--page` 時跳過對應詢問。 -- 每一輪使用者回答後都要同步 wiki。同步失敗時停止下一輪詢問,先回報錯誤與待使用者處理的點。 +- 每一輪使用者回答後都要同步 wiki;一輪一同步、一輪一確認,不可累積多輪回答後一次送出。同步失敗、讀回失敗或比對不一致時,停止下一輪詢問,先回報錯誤與待使用者處理的點。 +- 只有階段 D 的 wiki 同步完成且讀回確認成功後,才能進入下一輪提問。 - 不要求使用者把 token 貼進對話;token 依 `spec-gitea` 從環境變數或既有設定取得。 ## 參數 @@ -45,7 +46,7 @@ argument-hint: "[--wiki-repo ] [--index CONTENTS] [--project <計畫 | `--project` | 計畫名稱;未帶時從計畫內容尋找或產生系統名稱,用於目錄列標題與摘要。 | | `--page` | 計畫頁 title;未帶時固定使用 `PLAN-{yyyyMMdd}-{HASH}`,不詢問。 | | `--host` | Gitea 主機,依 `spec-gitea` host 決定順序處理。 | -| `--yes` | 略過一般性確認;不得略過目標 wiki 不明、寫入衝突或使用者尚未確認的計畫完成判斷。 | +| `--yes` | 略過一般性確認;不得略過目標 wiki 不明、寫入衝突、同步失敗後的停止,或使用者尚未確認的計畫完成判斷。 | ## 階段 A:前置設定 @@ -120,6 +121,7 @@ argument-hint: "[--wiki-repo ] [--index CONTENTS] [--project <計畫 - 把仍不明確的點列入 `## 待確認`。 - 產出或更新 `## TODO` checklist,格式依 `spec-todo-list`。 - 詢問使用者下一輪問題前,先完成階段 D 的 wiki 同步。 +- 如果某輪資料不足,先把不確定內容放進 `## 待確認`,不得自行補完再繼續問下一輪。 使用者明確表示「完成」「先到這裡」「計畫完成」時,進入階段 E;不要再追問非必要細節。 @@ -130,6 +132,7 @@ argument-hint: "[--wiki-repo ] [--index CONTENTS] [--project <計畫 1. 更新計畫頁。 2. 更新目錄頁:不存在才建立;存在時禁止整頁覆蓋,只修改既有 `<系統名稱>-計畫` 列,或在既有表格/頁末附加新列,確保有本計畫頁連結與摘要。 3. 再次讀回兩個頁面確認內容已更新。讀回時若回應含 `content_base64`,必須 base64 解碼後比對正文 Markdown 是否與預期一致;若回應格式不同,依 Gitea 官方 API 文件取出正文再比對,不可只確認狀態碼或頁面存在。 +4. 每輪只允許一輪同步結果對應下一輪提問;若 wiki 寫入失敗、讀回失敗或內容比對不一致,必須停止下一輪詢問,先回報錯誤與待處理點。 API 寫入方式: diff --git a/skills/todo-wiki/SKILL.md b/skills/todo-wiki/SKILL.md index b1d726a..682ac69 100644 --- a/skills/todo-wiki/SKILL.md +++ b/skills/todo-wiki/SKILL.md @@ -30,6 +30,8 @@ argument-hint: "[--source <需求描述|檔案路徑|議題編號>] [--impl-mode - `--source` 指向本機檔案時可以唯讀讀取來源檔;這不是輸出落地。`--source` 指向 Gitea 議題附件時,僅可依 `spec-issue-read` 的附件唯讀暫存例外讀取,讀完立即刪除。 - 本 skill 產生的 wiki todo 頁就是 `spec-model` 第六節所述「帶 `model:` frontmatter 的清單檔」的源頭;本 skill 只負責產生與同步清單,不執行清單內容。 - 階段 1 的模型檢查針對「執行本 skill 分析工作的 agent 自己」;階段 3 選出的實作模型是寫進 wiki 頁給未來另一個 session 用。 +- **模型鎖定要在開工前完成**:在讀取任何來源、做任何分析、或接觸 wiki 前,先確認目前執行本 skill 的模型 id;無法確定時先請使用者執行 `/status`,不得用猜的。 +- **一項一回寫、一項一確認**:每完成一項 checklist,就立刻把該項 `- [ ]` 改成 `- [x]`,立即回寫 wiki,讀回解碼比對成功後才能繼續下一項;不可累積多項後一次回寫。 - 目標 wiki repo 不明時必須詢問;不得因為目前工作目錄是某 repo 就臆測 wiki 目標。 - 目錄頁 title 預設固定為 `CONTENTS`,不詢問使用者;只有使用者明確提供 `--wiki-index` 時才覆蓋預設值。 - TODO 頁 title 預設固定為 `TODO-{yyyyMMdd}-{HASH}`,不詢問使用者;`yyyyMMdd` 使用 Asia/Taipei 當日日期,`HASH` 由需求彙整、關聯計畫或系統名稱產生穩定短雜湊並轉成全大寫。 @@ -47,17 +49,17 @@ argument-hint: "[--source <需求描述|檔案路徑|議題編號>] [--impl-mode | `--impl-model` | 直接指定實作模型(id 或 alias),跳過階段 3 的推薦流程;仍會在 `model_reason` 註明「使用者指定」。 | | `--wiki-repo` | 指定要同步的 Gitea wiki repo,例如 `knowledges/Plan`。 | | `--wiki-index` | wiki 目錄頁 title;未帶時固定使用 `CONTENTS`,不詢問。 | -| `--wiki-project` | 關聯計畫或系統名稱;需要更新目錄頁時,用於產生 `{關聯計畫的系統名稱}-代辦`。 | +| `--wiki-project` | 關聯計畫或系統名稱;預設仍會更新目錄頁,只有使用者明確表示不要更新目錄頁時才可略過。 | | `--wiki-page` | todo 頁 title;未帶時固定使用 `TODO-{yyyyMMdd}-{HASH}`,不詢問。 | | `--append` / `--overwrite` | 針對既有 wiki todo 頁 frontmatter `model` 不同的情境提前作答。二擇一,同時提供視為衝突,仍需詢問使用者。 | | `--yes` | 略過一般性確認;不得略過模型不同是否覆蓋、目標 wiki 不明、是否關聯到計畫/系統名稱、是否更新 wiki 目錄頁,或對外寫入目標不明等必要決策。 | ## 階段 1:選分析模型 -1. 依 `/jsc-shared:spec-model` 第三節取得可用模型清單與標籤。 +1. 在讀取任何來源、做任何分析、或接觸 wiki 前,先依 `/jsc-shared:spec-model` 第三節取得可用模型清單與標籤,並確認目前執行本 skill 的模型 id。 2. 依「需求分析/拆 TODO/架構決策」任務列比對必要標籤 `#深度推理` `#分析` `#本機可用`,選出推薦模型。 -3. 確認當前執行本 skill 的模型 id;無法確定時請使用者以 `/status` 確認,不要用猜的。 -4. 當前模型不符時,依 `spec-model` 第五節格式停止並要求使用者切換;不得先做階段 2 分析。 +3. 若當前執行本 skill 的模型 id 無法確定,先請使用者執行 `/status`,不得用猜的。 +4. 當前模型不符時,依 `spec-model` 第五節格式停止並要求使用者切換;開始任何實作前就要檢查,不得先做階段 2 分析、不得讀取來源、不得接觸 wiki。 5. 相符時記錄此模型 id 供階段 4 的 `analyzed_by` 使用。 ## 階段 2:分析需求 @@ -103,11 +105,11 @@ scope: <階段 2 產出的 scope> | 規則 | 內容 | | --- | --- | | **模型鎖定** | 本頁 frontmatter 的 `model` 是**強制**的,不是建議。開工前先自我確認當前模型 id。 | -| **不符就停** | 當前模型 ≠ `` 時,**立刻停止、不做任何檔案修改或 wiki 修改**,輸出下方錯誤訊息並要求使用者切換。 | +| **不符就停** | 當前模型 ≠ `` 時,**立刻停止、不做任何檔案修改或 wiki 修改**,輸出下方錯誤訊息並要求使用者切換。開始任何實作前就要檢查,不可先讀來源或接觸 wiki。 | | **不得自行升降級** | 不可以「先用手上的模型做一點」、不可以自行判定「我這顆更強所以沒關係」。降級與升級同樣禁止。 | | **附加不覆蓋** | 若之後要往本頁追加新需求:`model` 相同 → 附加到頁面末尾;`model` 不同 → 先問使用者是否覆蓋,未得同意不得寫入。 | | **完成即勾選** | 每完成一項就地把該行的 `- [ ]` 改成 `- [x]`,並在行末附上「(完成:yyyy/MM/dd HH:mm:ss)」(Asia/Taipei)。不得留待多項一起補勾。 | -| **更新後才能繼續** | 每完成一項後,必須立即把勾選狀態寫回本 wiki 頁並讀回確認成功;若 wiki 更新或讀回確認失敗,**立刻停止,不得繼續執行下一項**。 | +| **更新後才能繼續** | 每完成一項後,必須立即把勾選狀態寫回本 wiki 頁並讀回解碼比對成功;若 wiki 更新失敗、讀回失敗或內容不一致,**立刻停止,不得繼續執行下一項**。 | [][模型檢查][ERR]: 本清單指定 (),當前模型為 。 請執行 /model 切換後重新載入本 wiki 頁,本次不進行任何修改。 @@ -145,6 +147,7 @@ scope: <階段 2 產出的 scope> 1. 寫入 todo 頁。 2. 若使用者明確表示不要更新目錄頁,跳過目錄頁更新;否則 upsert 目錄頁表格列。目錄頁不存在才建立;存在時禁止整頁覆蓋,只修改既有 `<關聯計畫的系統名稱>-代辦` 列,或在既有表格/頁末附加新列。 3. 讀回 todo 頁確認內容已更新;有更新目錄頁時也讀回目錄頁確認。讀回時若回應含 `content_base64`,必須 base64 解碼後再比對 Markdown 內容是否與預期一致;若回應格式不同,依 Gitea 官方 API 文件取出正文再比對,不可只確認狀態碼或頁面存在。 +4. 一項一回寫、一項一確認;若任一步失敗,立刻停止,不得把多個 checklist 累積後一起處理。 目錄頁表格列格式: @@ -171,11 +174,12 @@ API 寫入方式: | --- | --- | | 分析模型 | `analyzed_by` | | 實作模型 | `model` / `model_alias`,並註明推薦或使用者指定 | -| 項目數 | 本次新增的 checklist 項目數 | +| 已完成項目數 | 本次實際完成且已回寫確認的 checklist 項目數 | | Wiki repo | `` | | 目錄頁 | URL;若使用者明確不要更新目錄頁,填「未更新(使用者選擇不更新目錄頁)」 | | Todo 頁 | URL | | 本次動作 | 建立/附加/覆蓋 | +| 已回寫確認 | `是`/`否`,僅在所有本次 checklist 都完成且讀回比對成功時填 `是` | 最後提醒: