feat(overview-artifact): 產生可預覽總覽與截圖 fallback

This commit is contained in:
2026-09-18 15:59:34 +08:00
parent c545f11ec1
commit 867a23497f
16 changed files with 605 additions and 324 deletions
+46 -31
View File
@@ -216,32 +216,28 @@ node scripts/project-add.js --repo <owner/name> --index <編號> --project "<看
### 12. 產生分析版的圖解總覽 〔可委派〕
用同一份 `templates/overview-artifact.html` 再產一份,但這一份要多出**工作包全景**:
把工作包之間的相依與截止日畫成一張圖,讓開發者看得出自己這一項在整體中的位置。
全景圖用 `graph TD`,填進 `{{工作包全景}}`,連同段落標題一起:
排程完成後重新抽取需求與全部工作包,組成 `schemaVersion: 1` 的需求級 JSON。
工作包依賴與截止日必須來自重新抽取的實際資料,不使用模型記憶中的暫定值。
執行:
```
<section><h2>工作包全景</h2>
<figure><div class="mermaid">graph TD
A[建立共用函式庫<br/>09-25] --> B[建立抽取契約<br/>09-27]
</div></figure></section>
node scripts/overview-render.js --input <json> --output <html> --manifest <manifest>
```
節點寫工作包標題與截止日,箭頭方向是「先決 → 後續」。節點一樣以 12 個為上限,
超過就只畫相依鏈最長路徑上的那幾顆,其餘在頁尾列成文字。
委派的是**產出那份 HTML**;拿到網址之後寫回議題那一步**不委派**(判準第四條)。
網址一樣寫回需求議題:
HTML 內重新產生 SVG 與 HTML/CSS 視圖;不能直接搬用議題 Mermaid。預覽優先使用平台
能力,否則啟動短命 Node server 供瀏覽器截圖。產生 full-page 與局部圖 PNG 後執行:
```
node scripts/issue-update.js --repo <owner/name> --index <需求議題編號> --overview-url <網址>
node scripts/issue-assets.js --repo <owner/name> --index <需求議題編號> --manifest <manifest>
```
**重跑會就地更新同一行**,不會在議題上留下兩個連結。規劃階段產生的那一份會被這一份取代,
這是預期行為——同一顆需求議題只掛一個總覽網址。
截圖全部上傳成附件,需求議題正文只保留附件索引。只有真正可用的 preview URL 才使用
既有 `--overview-url`;不可把 `.tmp/` 或 `0.0.0.0` 寫回 Gitea。
產出 HTML 可委派;預覽截圖、附件上傳與任何 `issue-assets`/`issue-update` 寫回都不委派,
由主流程執行並處理錯誤。
若平台 preview 不可用,執行 `node scripts/overview-capture.js --backend auto`;
它依序嘗試 Firefox,再嘗試 `rsvg-convert`/`resvg`。所有 backend 都不可用時必須
停止並保留 `.tmp/` 的 HTML/SVG,不得宣稱截圖完成。
### 13. 停錶並回報
回報之前先停錶,這一段計時到此為止:
@@ -267,19 +263,9 @@ Gitea 1.27 的 API 沒有任何請求定義接受 `time_estimate`,該欄位只
## 架構圖的限制
依工作包的性質選圖:
- **`sequenceDiagram`** — 重點在「誰呼叫誰、順序為何」時用。
- **`flowchart`** — 重點在「條件分支與資料流向」時用。
- **`stateDiagram-v2`** — 重點在「狀態怎麼轉移」時用。
節點數上限 **12**,每個節點的文字上限 **8 字**。超過就拆成多張圖,或者乾脆不畫。
模板的 `{{架構圖}}` 要填入**完整的內容**,兩種形式擇一:
- 要畫:一個或多個完整的 ```mermaid 圍欄區塊。
- 不畫:**只在超過上限拆不開、或畫了不會比文字更清楚時**才選這個,填一行說明為什麼不畫,**不要加圍欄**。
圖表以抽象 `kind`、`direction`、`nodes`、`edges` 保存。renderer 產生議題 Mermaid
與 HTML SVG;不能讓模型直接維護兩套圖表語法。節點超過 12、文字超過 8 字或無法
安全轉換時,拆圖或記錄 `omitted` 原因。
## 邊界
- **共識摘要之前不對 Gitea 寫入任何內容**:不建議題、不改描述、不貼標籤、不留留言。
@@ -292,3 +278,32 @@ Gitea 1.27 的 API 沒有任何請求定義接受 `time_estimate`,該欄位只
- 計時只動這顆需求議題:在它上面起錶、在它上面停錶。**不停別顆議題上的錶**,
被別顆的錶擋下時交還給使用者決定,不繞過去。
- 不關閉或刪除任何既有議題。
# Artifact 交接與視圖
完成第三段排程後,依 `references/artifact-contract.md` 重新抽取需求與全部工作包,
組成一份 `schemaVersion: 1` 的 JSON 暫存檔。這份 JSON 是 HTML renderer 的輸入,
不是 Gitea 的第二份正本。
先執行:
```
node scripts/overview-render.js --input <json> --output <html> --manifest <manifest>
```
renderer 驗證失敗時,不截圖、不上傳、不更新議題,保留 `.tmp/` 的輸入與錯誤供修正。
HTML 必須自包含,不依賴 CDN;圖表由抽象節點/邊資料重新產生 SVG,不能直接搬用議題
Mermaid。公式是可選欄位,單一公式無法渲染時保留原文並標示未渲染。
預覽優先使用執行環境提供的預覽能力。沒有預覽能力時,使用 `0.0.0.0` 綁定的
ephemeral Node 靜態伺服器,只為瀏覽器截圖,完成後一定停止。產生 full-page 與所有
局部圖 PNG,為每張圖填入 manifest 的角色、固定檔名與 SHA-256。
截圖全部是需求議題附件,不嵌入圖片;執行:
```
node scripts/issue-assets.js --repo <owner/name> --index <需求議題編號> --manifest <manifest>
```
這支腳本負責 hash 重用、附件上傳與「圖解版總覽附件」索引的冪等更新。上傳或索引
更新失敗就是流程失敗。只有預覽平台提供真正可用的 URL 時,才另外使用既有的
`--overview-url`;不可把 `.tmp/` 或 `0.0.0.0` 寫回 Gitea。