feat(todo-wiki,do-wiki): checklist 依群組分組、do-wiki 改以工作證逐群組領取

todo-wiki 產生的 checklist 改依專案或相依性分組(組內編號自 1 起算),
frontmatter 新增 max_parallel 標明最多可平行處理的群組數;do-wiki 開工前
先產生唯一工作證,改以群組為單位領取(全被領取時列出各群組最後更新時間
詢問是否取代),群組完成與 session 停止時釋放工作證。同步更新 README
skill 表格說明與三份 plugin manifest 版號(0.2.2 → 0.2.3)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-19 10:08:08 +08:00
co-authored by Claude Sonnet 5
parent d813e7351e
commit 0699f0fb5a
6 changed files with 64 additions and 13 deletions
+43 -5
View File
@@ -1,6 +1,6 @@
---
name: do-wiki
description: 讀取 `todo-wiki` 產生、帶鎖定模型 frontmatter 的 Gitea wiki TODO 頁並逐項執行:開工前先讀目錄頁挑一份「已完成」為未勾選的代辦(沒有就直接結束);檢查頁面 `## 0.` 的六條強制規則並比對當前模型,不符就停止;讀取需求彙整與既有 checklist(已勾選視為完成不重做);逐項執行——完成一項就地把 `- [ ]` 改 `- [x]` 並補上完成時間,立即回寫該 wiki 頁並讀回確認成功才能繼續下一項,任一步失敗立刻停止;全部項目完成後回目錄頁把該代辦列「已完成」改為 `●`。當使用者說要執行 wiki TODO、跑 do-wiki、依 wiki 清單實作、接手某份 Gitea wiki 代辦、或提到 do-wiki skill 時觸發。不適用於:把需求分析並產生 TODO 清單同步到 wiki(用 `/jsc-shared:todo-wiki`)、逐步建立計畫並同步 wiki(用 `/jsc-shared:plan-wiki`)。
description: 讀取 `todo-wiki` 產生、帶鎖定模型 frontmatter 的 Gitea wiki TODO 頁並逐項執行:開工前先產生唯一工作證並讀目錄頁挑一份「已完成」為未勾選的代辦(沒有就直接結束);檢查頁面 `## 0.` 的六條強制規則並比對當前模型,不符就停止;讀取需求彙整與既有 checklist(已勾選視為完成不重做);接著領取一個未被工作證標註且未完成的群組(全被標註時列出各群組最後更新時間詢問是否取代),標註成功才在該群組內逐項執行——完成一項就地把 `- [ ]` 改 `- [x]` 並補上完成時間,立即回寫該 wiki 頁並讀回確認成功才能繼續下一項,任一步失敗立刻停止;群組完成與 session 停止時釋放工作證;全部項目完成後回目錄頁把該代辦列「已完成」改為 `●`。當使用者說要執行 wiki TODO、跑 do-wiki、依 wiki 清單實作、接手某份 Gitea wiki 代辦、或提到 do-wiki skill 時觸發。不適用於:把需求分析並產生 TODO 清單同步到 wiki(用 `/jsc-shared:todo-wiki`)、逐步建立計畫並同步 wiki(用 `/jsc-shared:plan-wiki`)。
argument-hint: "[--wiki-repo <owner/repo>] [--wiki-index CONTENTS] [--wiki-page <既有 TODO 頁 title>] [--yes]"
---
@@ -10,11 +10,13 @@ argument-hint: "[--wiki-repo <owner/repo>] [--wiki-index CONTENTS] [--wiki-page
| 階段 | 做什麼 | 產出 |
| --- | --- | --- |
| -1. 產生工作證 | 產生本次唯一工作證 | `WP_{yyyyMMdd}_{HHmmss}_{6 碼}` |
| 0. 挑代辦 | 讀目錄頁列出所有未完成的 TODO 列,單選一份 | 本次執行目標的 TODO 頁 `path` |
| 1. 讀取目標 TODO 頁 | 查表取得 `path` 並讀取內容 | TODO 頁完整 Markdown |
| 2. 檢查強制規則 | 解析 `## 0.` 區塊六條規則,比對當前模型 | 相符才繼續,不符則停止 |
| 3. 了解需求彙整 | 讀 frontmatter `scope` 與需求段落,盤點既有 checklist | 待執行項目清單 |
| 4. 逐項執行並即時回寫 | 單項循環:執行 → 勾選 → 回寫 → 讀回確認 | 全部項目完成的 TODO 頁 |
| 3.5 領取群組 | 找未被標註且未完成的群組,標上工作證並回寫 | 已領取的群組 |
| 4. 逐項執行並即時回寫 | **在已領取群組內**逐項執行並即時回寫 | 全部項目完成的 TODO 頁 |
| 收尾 | 回目錄頁把該代辦列「已完成」改 `●` | 讀回確認成功的目錄頁 |
## 共用規範(必要前置)
@@ -32,7 +34,17 @@ argument-hint: "[--wiki-repo <owner/repo>] [--wiki-index CONTENTS] [--wiki-page
| `--wiki-repo` | 指定要讀取的 Gitea wiki repo,例如 `knowledges/Plan`。未帶時依 `spec-ask-user` 詢問,不臆測。 |
| `--wiki-index` | 目錄頁 title;未帶時固定使用 `CONTENTS`,不詢問。 |
| `--wiki-page` | 直接指定既有 TODO 頁 title;有帶時跳過階段 0 的挑選詢問,直接查表取得對應 `path` 進入階段 1。 |
| `--yes` | 略過一般性確認;不得略過模型不符、目標 wiki 不明、或 wiki 回寫/讀回失敗後的停止。 |
| `--yes` | 略過一般性確認;不得略過模型不符、目標 wiki 不明、工作證取代確認、或 wiki 回寫/讀回失敗後的停止。 |
## 階段 -1:產生工作證
在**接觸任何 wiki 內容之前**,先產生本次唯一工作證,格式固定 `WP_{yyyyMMdd}_{HHmmss}_{6 碼大寫英數隨機}`(時間為 Asia/Taipei,依 `/jsc-shared:spec-time-log`),並依同 spec 輸出一行:
```
[yyyy/MM/dd HH:mm:ss][工作證][INF]: 本次工作證 WP_20260819_100000_A1B2C3
```
工作證在本次 session 全程固定不變。
## 階段 0:從目錄頁挑一份未完成代辦
@@ -65,18 +77,44 @@ argument-hint: "[--wiki-repo <owner/repo>] [--wiki-index CONTENTS] [--wiki-page
- **do-wiki 執行期的中間成果不得落地**:進度摘要、待辦排序、分析過程只留在對話內容,不得寫成本機草稿檔、暫存 JSON、或任何用來傳遞中間成果的檔案;不得 clone wiki repo;request body 一律由工具呼叫或記憶內容直接送出,不得用 `@file` 形式。
- **清單項目本身要求新增或修改的專案原始碼屬正常產出**:若某個 checklist 項目的實作方式就是「新增/修改某個檔案」,直接依該項目要求編輯專案內的原始碼、文件或設定檔,這不算落地限制的例外,是該項目的正常交付物。
## 階段 3.5:領取群組
1. 掃描 TODO 頁所有 `## 群組 …` 標題,解析群組代號、工作證欄、相依標註。
2. 取出「工作證為 `無`、組內仍有 `- [ ]`、且相依群組皆已全數完成」的可領取群組。
3. 候選多於一組時依 `/jsc-shared:spec-ask-user` 以單選呈現(候選 ≤4 用 `AskUserQuestion` 並含「其他」,>4 改文字編號列出)。
4. 把該群組標題行改寫為 `(工作證:{本次工作證}|領取:{yyyy/MM/dd HH:mm:ss})`,**立即回寫 wiki 並讀回解碼比對成功**才可進入階段 4;失敗立刻停止。
### 全數被標註時的取代流程
當「沒有任何可領取群組、但仍有未完成群組」時,**不設固定逾時門檻**,改為列出所有已被標註群組的表格(欄位:群組代號、工作證、領取時間、該群組最後更新時間、未完成項數),依 `/jsc-shared:spec-ask-user` 詢問使用者是否要取代其中一組的工作證改由本次工作證接手;使用者選擇不取代時,輸出:
```
[yyyy/MM/dd HH:mm:ss][工作證][INF]: 所有群組皆已被領取且使用者未指定取代,本次不進行任何修改。
```
後結束。取代屬破壞性決策,**`--yes` 不得略過**本次詢問。
## 階段 4:逐項執行並即時回寫
依序處理階段 3 篩選出的每一個未勾選項目,單項循環固定四步,**任一步失敗立刻停止,不得執行下一項;不得多項一起補勾**:
依序處理**階段 3.5 已領取群組內**的每一個未勾選項目,單項循環固定四步,**任一步失敗立刻停止,不得執行下一項;不得多項一起補勾**:
1. **執行**:依該項目的實作方式與驗收條件完成工作(可能是編輯專案檔案、可能是純分析)。
2. **就地勾選**:把該行 `- [ ]` 改成 `- [x]`,並在行末附上「(完成:`yyyy/MM/dd HH:mm:ss`)」(Asia/Taipei)。
3. **回寫 wiki**:以 `tea wiki edit`(或 `PATCH /repos/<owner>/<repo>/wiki/page/<path>`)寫回整份頁面內容。**`tea wiki edit` 陷阱**:其用法為 `tea wiki edit [options] <page>`,`<page>` 需帶 `path`;若省略 `--title`,tea 會把 `<page>` 當成新 title 送出並導致頁面被改名。**每次呼叫都必須同時帶 `--title`(原 title)與 `--content`(完整內容)**,否則勾選一次就改名一次。
4. **讀回確認**:重新讀取該頁,確認內容已更新且與預期一致(`content_base64` 需先 base64 解碼再比對);若回寫或讀回確認失敗,立刻停止,不得繼續下一項。
該群組項目全數 `- [x]` 後,先執行群組釋放(見下節),再回到階段 3.5 領取下一組。
## 釋放工作證
兩個釋放時機:
- **群組完成即釋放**:該群組全數 `- [x]` 時,把標題行改回 `(工作證:無)`,回寫並讀回確認。
- **session 停止即釋放**:本次流程正常結束、使用者中止、或因錯誤停止而準備收工前,把仍掛著本次工作證的所有群組一律改回 `(工作證:無)` 並回寫讀回確認,避免留下無人接手的殘留標註。
## 收尾:全部完成後回寫目錄頁「已完成」
1. 只有本次 TODO 頁**所有**項目皆為 `- [x]` 時才可進行;只要還有未勾項目就不得勾選目錄頁。
1. 只有**所有群組**的所有項目皆為 `- [x]`,**且本次工作證已全部釋放**時才可進行;只要還有未勾項目或未釋放的工作證就不得勾選目錄頁。
2. 依 `spec-wiki-contents`〔回寫規則〕,回目錄頁把該 TODO 列的「已完成」由 `○` 改為 `●`。
3. 讀回目錄頁確認寫入成功;失敗則停止並回報,不得視為已完成。