refactor(spec-wiki-contents): 目錄頁改依系統分段六欄表格,新增系統名稱決定與 OTHER 附屬頁規則

plan-wiki/todo-wiki 新增系統名稱決定流程(需求指定或推論候選/挑工作目錄與程式碼中文名),
spec-wiki-contents 目錄頁維持單一 CONTENTS 頁但依系統分成 `## 英文 中文` 段落,段落內用
計畫/代辦六欄表格取代原本四欄單一表格,並支援不屬於計畫代辦的附屬內容另建 OTHER_ 頁、
用 footnote 從對應列連過去;do-wiki 開工前挑代辦改為掃描全部系統段落。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 12:54:37 +08:00
co-authored by Claude Sonnet 5
parent 3790ff733f
commit aaa14064f7
4 changed files with 122 additions and 79 deletions
+28 -19
View File
@@ -1,7 +1,7 @@
---
name: plan-wiki
description: 逐步詢問使用者計畫內容,並把每一輪已確認的計畫草稿直接同步到指定 Gitea wiki 的目錄頁與計畫頁,全程不建立本機計畫檔、草稿檔、暫存 JSON body 或 wiki clone。使用者要建立計畫、把計畫加入 wiki 目錄、指定 Gitea wiki repo/目錄頁/計畫頁、要求邊問邊同步 wiki、要求計畫檔案不落地、或提到 plan-wiki、計畫 wiki、wiki 目錄頁時觸發。適用於:需求尚未完整、需要逐題釐清並保存到 wiki 的計畫文件。不適用於:產生本機 plan.md/todo.md、拆 Gitea issue(用 /jsc-doc:issues-analyze)、或非 Gitea wiki。
argument-hint: "[--wiki-repo <owner/repo>] [--index CONTENTS] [--project <計畫名稱>] [--page PLAN_<yyyyMMdd>_<HASH>] [--host <gitea主機>] [--yes]"
argument-hint: "[--wiki-repo <owner/repo>] [--index <英文系統名稱>_<中文系統名稱>] [--project <英文系統名稱>_<中文系統名稱>] [--page PLAN_<yyyyMMdd>_<HASH>] [--host <gitea主機>] [--yes]"
---
# plan-wiki — 逐步建立計畫並同步到 Gitea wiki
@@ -25,10 +25,19 @@ argument-hint: "[--wiki-repo <owner/repo>] [--index CONTENTS] [--project <計畫
本 skill 特有補充:
- 本 skill 會寫入外部 Gitea wiki;目標 wiki repo 不明時必須詢問,不得臆測。
- 目錄頁 title 預設固定為 `CONTENTS`,不詢問使用者;只有使用者明確提供 `--index` 時才覆蓋預設值。
- 計畫頁 title 預設固定為 `PLAN_{yyyyMMdd}_{HASH}`,不詢問使用者;`yyyyMMdd` 使用 Asia/Taipei 當日日期,`HASH` 由已確認的計畫內容、計畫名稱或需求摘要產生穩定短雜湊並轉成全大寫。
- 加入目錄頁時,先從計畫內容尋找系統名稱;若無明確系統名稱,依計畫目標產生一個精簡系統名稱。目錄標題使用 `{系統名稱}-計畫`,並連結到計畫頁。
- 目錄頁禁止整頁覆蓋:不存在時才新建;存在時必須保留既有內容,只修改本計畫既有列或在既有表格附加新列。
- 目錄頁是單一共用頁面,title 預設固定為 `CONTENTS`,不詢問使用者;只有使用者明確提供 `--index` 時才覆蓋預設值。
- 計畫頁 title 預設固定為 `PLAN_{yyyyMMdd}_{HASH}`,不詢問使用者;`yyyyMMdd` 使用 Asia/Taipei 當日日期,`HASH` 由已確認的計畫內容、系統名稱或需求摘要產生穩定短雜湊並轉成全大寫。
- 加入目錄頁時,依下方〔系統名稱決定〕得到英文+中文系統名稱;目錄頁裡該系統對應的 `## {英文系統名稱} {中文系統名稱}` 段落使用這組名稱,計畫頁連結填進該段落表格的`計畫`欄(依 `spec-wiki-contents`〔新增列前先找可合併的既有列〕決定填入既有列、新增列,或新增整個段落)。
- 目錄頁禁止整頁覆蓋:不存在時才新建;存在時必須保留既有內容與其他系統的段落,只 upsert 本系統段落內對應的既有列、在該段落表格附加新列,或該系統尚無段落時新增一個段落。
### 系統名稱決定
- **需求中已明確指定系統名稱**(使用者於對話中講出、或 `--project` 已帶):直接採用;若只給了英文或只給了中文其中一種,另一種依需求內容推論後,依 `/jsc-shared:spec-ask-user` 請使用者確認(單選:採用推論值/自行輸入)。
- **未指定時**:依已收集到的需求內容,推論 **5 組**候選,每組為「大駝峰英文系統名稱+中文名稱」配對(例如 `KokoroneCore 心核`);依 `/jsc-shared:spec-ask-user`(候選數 5 > 4,改文字編號列出)請使用者從 5 組中選一組,選項另外固定包含「重新產生 5 組」與「自行輸入」:
- 使用者選「重新產生 5 組」:重新推論另外 5 組**不同於前次**的候選,再次詢問;可反覆重新產生,不設次數上限。
- 使用者選「自行輸入」:請使用者直接提供英文+中文系統名稱,兩者皆須提供。
- 使用者選其中一組候選:採用該組英文+中文名稱。
- 決定出的系統名稱在本次 plan-wiki 執行全程固定不變,供目錄頁對應段落標題、計畫頁 H1 等引用系統名稱處使用。
- **不落地絕對規則**:不得建立本機 `plan.md`、`todo.md`、`.md` 草稿、暫存 JSON body、wiki clone、或任何用來傳遞中間成果的檔案;中間成果只存在於對話內容與 Gitea wiki API request body。不得使用 `curl --data @file`。
- 使用者已用參數指定 `--wiki-repo`、`--index`、`--project`、`--page` 時跳過對應詢問。
- 每一輪使用者回答後都要同步 wiki;一輪一同步、一輪一確認,不可累積多輪回答後一次送出。同步失敗、讀回失敗或比對不一致時,停止下一輪詢問,先回報錯誤與待使用者處理的點。
@@ -37,24 +46,24 @@ argument-hint: "[--wiki-repo <owner/repo>] [--index CONTENTS] [--project <計畫
## 參數
`[--wiki-repo <owner/repo>] [--index CONTENTS] [--project <計畫名稱>] [--page PLAN_<yyyyMMdd>_<HASH>] [--host <gitea主機>] [--yes]`
`[--wiki-repo <owner/repo>] [--index <英文系統名稱>_<中文系統名稱>] [--project <英文系統名稱>_<中文系統名稱>] [--page PLAN_<yyyyMMdd>_<HASH>] [--host <gitea主機>] [--yes]`
| 參數 | 說明 |
| --- | --- |
| `--wiki-repo` | Gitea wiki 所屬 repo,例如 `knowledges/Plan`。未帶且無法從目前 repo 推得時詢問使用者。 |
| `--index` | 目錄頁 title;未帶時固定使用 `CONTENTS`,不詢問。 |
| `--project` | 計畫名稱;未帶時從計畫內容尋找或產生系統名稱,用於目錄列標題與摘要。 |
| `--project` | 系統名稱(英文+中文);未帶時依〔系統名稱決定〕流程推論候選並請使用者選定,用於目錄頁對應段落標題與摘要。 |
| `--page` | 計畫頁 title;未帶時固定使用 `PLAN_{yyyyMMdd}_{HASH}`,不詢問。 |
| `--host` | Gitea 主機,依 `spec-gitea` host 決定順序處理。 |
| `--yes` | 略過一般性確認;不得略過目標 wiki 不明、寫入衝突、同步失敗後的停止,或使用者尚未確認的計畫完成判斷。 |
| `--yes` | 略過一般性確認;不得略過目標 wiki 不明、系統名稱選定、寫入衝突、同步失敗後的停止,或使用者尚未確認的計畫完成判斷。 |
## 階段 A:前置設定
1. 依 `spec-gitea` 決定 host 與 token,只輸出 token「已設定/未設定」。
2. 確認 `--wiki-repo` 是否為 `owner/repo` 格式;不符合時詢問使用者修正。
3. 確認目錄頁 title:未帶 `--index` 時固定使用 `CONTENTS`。
4. 確認計畫頁 title:未帶 `--page` 時固定使用 `PLAN_{yyyyMMdd}_{HASH}`。雜湊輸入優先使用已確認的計畫內容;內容不足時使用計畫名稱、來源摘要與當輪時間組合,輸出全大寫短雜湊。
5. 確認系統名稱:先從 `--project`、計畫內容、需求來源或使用者回答尋找明確系統名稱;找不到時產生精簡系統名稱,不為此單獨詢問。
3. 確認系統名稱:`--project` 已帶時直接採用;未帶時依〔系統名稱決定〕流程推論 5 組候選請使用者選定(或使用者要求重新產生/自行輸入)。
4. 確認目錄頁 title:未帶 `--index` 時固定使用 `CONTENTS`。
5. 確認計畫頁 title:未帶 `--page` 時固定使用 `PLAN_{yyyyMMdd}_{HASH}`。雜湊輸入優先使用已確認的計畫內容;內容不足時使用系統名稱、來源摘要與當輪時間組合,輸出全大寫短雜湊。
6. 用 `GET /repos/<owner>/<repo>` 驗證 token 對 repo 有權限;失敗時遮蔽機密後回報並停止。
## 階段 B:讀取 wiki 現況
@@ -62,20 +71,20 @@ argument-hint: "[--wiki-repo <owner/repo>] [--index CONTENTS] [--project <計畫
1. 依 `spec-gitea` 分頁讀取 `GET /repos/<owner>/<repo>/wiki/pages`。
2. 以 title 查表取得目錄頁與計畫頁的 `sub_url`,不得自行猜測轉義規則。
3. 讀取頁面:`GET /repos/<owner>/<repo>/wiki/page/<sub_url>`,將 `content_base64` 解成 UTF-8 Markdown。
4. 目錄頁不存在時在記憶中組出符合「目錄頁格式」的新頁內容;目錄頁存在時不得用預設格式覆蓋整頁,只能保留原內容後修改或附加本計畫目錄列。計畫頁不存在時在記憶中組出目前計畫草稿。不得先寫成本機檔案。
4. 目錄頁不存在時在記憶中組出符合「目錄頁格式」的新頁內容;目錄頁存在時不得用預設格式覆蓋整頁,只能保留原內容後修改或附加本計畫對應的列。計畫頁不存在時在記憶中組出目前計畫草稿。不得先寫成本機檔案。
## 目錄頁格式
目錄頁的四欄表格格式、「已產生」欄初始值、列型別判定、以及連結來源(查表取得的 `sub_url`/`path`,不使用 percent-encode 的 title)一律依 `/jsc-shared:spec-wiki-contents`,本 skill 不重複定義。
目錄頁是單一共用頁面依系統分段、段落標題與六欄表格格式、列合併規則、以及連結來源(查表取得的 `sub_url`/`path`,不使用 percent-encode 的 title)一律依 `/jsc-shared:spec-wiki-contents`,本 skill 不重複定義。
目錄頁不存在時,依 `spec-wiki-contents`〔目錄頁格式〕建立新頁,並在計畫列「已產生」欄填 `[ ]`(表示尚未產生對應 TODO)、「已完成」欄留空;目錄頁已存在時禁止整頁覆蓋,只能 upsert 既有的 `<系統名稱>-計畫` 列或在既有表格附加新列,保留其餘標題、說明與內容。
目錄頁不存在時,依 `spec-wiki-contents`〔目錄頁格式〕建立新頁(title `CONTENTS`),並建立本系統對應的 `## {英文系統名稱} {中文系統名稱}` 段落,`計畫`欄填本計畫頁連結、`是否已產生代辦`欄填 `[ ]`、`代辦`與`是否已完成`欄留空;目錄頁已存在時禁止整頁覆蓋,只能依 `spec-wiki-contents`〔新增列前先找可合併的既有列〕upsert 本系統段落內對應的列、在該段落附加新列,或該系統尚無段落時新增段落,保留其他系統的段落與其餘內容。
## 計畫頁格式
計畫頁使用 Markdown,至少包含:
計畫頁使用 Markdown,H1 固定為 `{英文系統名稱} {中文系統名稱} 計畫`(使用〔系統名稱決定〕得到的系統名稱,與 wiki 頁 title `PLAN_{yyyyMMdd}_{HASH}` 是兩件事,不得把雜湊 title 直接當 H1);至少包含:
```markdown
# <page title>
# <英文系統名稱> <中文系統名稱> 計畫
## 目標
@@ -118,7 +127,7 @@ argument-hint: "[--wiki-repo <owner/repo>] [--index CONTENTS] [--project <計畫
每輪同步順序固定:
1. 更新計畫頁。
2. 更新目錄頁:不存在才建立;存在時禁止整頁覆蓋,只修改既有 `<系統名稱>-計畫` 列,或在既有表格/頁末附加新列,確保有本計畫頁連結與摘要。
2. 更新目錄頁:不存在才建立;存在時禁止整頁覆蓋,依 `spec-wiki-contents`〔新增列前先找可合併的既有列〕在本系統對應的 `## ` 段落修改既有列的`計畫`欄、附加新列,或該系統尚無段落時新增段落,確保有本計畫頁連結與摘要。
3. 再次讀回兩個頁面確認內容已更新。讀回時若回應含 `content_base64`,必須 base64 解碼後比對正文 Markdown 是否與預期一致;若回應格式不同,依 Gitea 官方 API 文件取出正文再比對,不可只確認狀態碼或頁面存在。
4. 每輪只允許一輪同步結果對應下一輪提問;若 wiki 寫入失敗、讀回失敗或內容比對不一致,必須停止下一輪詢問,先回報錯誤與待處理點。
@@ -152,6 +161,6 @@ API 寫入方式:
| 助理 | 呼叫 |
| --- | --- |
| Claude Code / Antigravity | `/jsc-shared:plan-wiki --wiki-repo knowledges/Plan --project Kokorone` |
| Codex | `$plan-wiki --wiki-repo knowledges/Plan --project Kokorone` |
| Claude Code / Antigravity | `/jsc-shared:plan-wiki --wiki-repo knowledges/Plan --project Kokorone_心音` |
| Codex | `$plan-wiki --wiki-repo knowledges/Plan --project Kokorone_心音` |
| OpenCode | 描述需求(如「逐步問我計畫內容,並同步到 Gitea wiki 目錄與頁面」)自動觸發 |