# tea-sdlc 以 [tea](https://gitea.com/gitea/tea) 與 Gitea REST API 驅動 **SDLC 全流程**的跨平台指令組。 把規劃、分析、實作、修正、整併與報表停用流程,固定成可重複、可被任何 coding agent 執行的流程。 - **流程正本只有一份**:平台中立 markdown 放在 `prompts/`,改規則不會出現各平台版本分歧。 - **副作用集中**:所有對 Gitea 與 git 的呼叫下沉到 `scripts/` 的零相依 Node 腳本,統一 JSON 輸入輸出。 - **產出有固定形狀**:議題、PR、報表一律套 `templates/` 的模板。 > 六個流程正本都到齊了,`tea-sdlc install` 會把它們一次佈署到偵測到的平台。 > 完整需求見[議題 #1](https://gitea.jsc.idv.tw/plugins/tea-sdlc/issues/1),進度見其底下的工作包。 --- ## 六個指令 | 指令 | 做什麼 | | --- | --- | | `/sdlc-plan` | 把一段口語需求變成結構化的需求議題 | | `/sdlc-analyze` | 逐題把可行性疑點問到共識,據以產出工作包 | | `/sdlc-feat` | 領取工作包、開分支、逐項實作並開 PR | | `/sdlc-fix` | 處理 PR 上的留言;收到議題編號則交棒給 `/sdlc-feat` | | `/sdlc-sync` | 把散落在留言裡的決策整併回議題描述 | | `/sdlc-report` | 週報/月報/年報目前不可用,回傳 `REPORT_UNAVAILABLE` | --- ## 目錄結構 ``` tea-sdlc/ ├── prompts/ # ★ 流程正本:六個指令的平台中立 markdown ├── scripts/ # 所有 Gitea / git 副作用的唯一出口(Node,零相依) ├── templates/ # 議題、PR、報表、總覽網頁的輸出模板 ├── references/ # 規則正本:實作規範、註解格式、可行性檢查清單 ├── bin/tea-sdlc.js # 單一指令入口:install / uninstall / prompt / status / verify / sdlc-version ├── skills/ # 各助理原生 plugin 機制讀取的 skills(目前為空) ├── .claude-plugin/ # Claude Code 的 plugin / marketplace manifest ├── .codex-plugin/ # Codex 的 plugin manifest ├── .agents/plugins/ # Codex 的 marketplace manifest ├── plugin.json # Antigravity 的 plugin manifest ├── package.json # npm 打包與測試入口,無任何相依套件 ├── AGENTS.md # 給 AI 助理的模組邊界與慣例 └── README.md ``` --- ## 前置需求 安裝與佈署(`tea-sdlc install`)只需要 Node;其餘是**跑流程指令**時才需要的。 本工具一律不替你安裝任何東西。 | 需求 | 用途 | 缺了會怎樣 | | --- | --- | --- | | Node.js ≥ 20 | 執行 `tea-sdlc` 與 `scripts/` | 連 `tea-sdlc` 都跑不起來 | | [`tea`](https://gitea.com/gitea/tea) 並已登入 | Gitea 議題、標籤、Milestone、留言 | 同上;登入用 `tea login add` | | 帳號對目標 repo 的 issues unit 有寫入權 | 建立與更新議題 | 流程指令中止;Gitea 的 unit 權限獨立於 push 權限 | --- ## 安裝 一行裝好,終端機就多出一個 `tea-sdlc` 指令: ```bash npm i -g git+https://gitea.jsc.idv.tw/plugins/tea-sdlc.git ``` 要裝特定版本就在網址後面接上 tag:`...tea-sdlc.git#v0.1.0`。不必設定任何 registry 或憑證。 > `git+` 前綴不能省。npm 只有看到 `git+https://` 才會當成 git repo;寫成 `https://….git` > 會被當成遠端壓縮檔下載,然後以 `TAR_BAD_ARCHIVE: Unrecognized archive format` 失敗。 接著把六個流程指令佈署到你裝了的每個 agent 平台: ```bash tea-sdlc install ``` 它會列出偵測到的平台讓你勾選(預設全勾),只寫進已經存在的平台目錄,不在沒裝的平台留下孤兒目錄。 沒有終端機可問時(CI、腳本)不會停下來等輸入,直接照預設全裝。 `--platform` 直接指定安裝對象,`--dry-run` 先看會動到哪些檔案: ```bash tea-sdlc install --platform claude,codex tea-sdlc install --dry-run ``` | 平台 | 偵測 | 轉接檔落點 | 形式 | | --- | --- | --- | --- | | `claude`(Claude Code) | `~/.claude/` | `~/.claude/commands/sdlc-*.md` | command | | `codex`(Codex) | `~/.codex/` | `~/.codex/prompts/sdlc-*.md` | command | | `opencode`(OpenCode) | `~/.config/opencode/` | `~/.config/opencode/command/sdlc-*.md` | command | | `oh-my-pi` | `~/.omp/` | `~/.omp/agent/commands/sdlc-*.md` | command | | `antigravity`(Antigravity) | `~/.gemini/` | `~/.gemini/skills/sdlc-*/SKILL.md` | skill | | `kiro`(Kiro) | `~/.kiro/` | `~/.kiro/skills/sdlc-*/SKILL.md` | skill | | `copilot`(GitHub Copilot) | 專案裡的 `.github/` | `.github/skills/sdlc-*/SKILL.md` | skill | 轉接檔裡**沒有路徑**,只有一句「執行 `tea-sdlc prompt --name sdlc-plan`」。正本在哪由 PATH 上的 `tea-sdlc` 自己回推——升級 Node、換版本管理器、改 npm prefix 都不會讓七個平台的轉接檔同時失效。 ### 安裝完成等於驗過能用 寫完轉接檔之後,`install` 會把三層叫用鏈驗一遍: **轉接檔 → PATH 上的 `tea-sdlc` → AI Agent CLI 的 runtime registry**。 它會確認 PATH 上的 `tea-sdlc` 能取回正本,並針對 Claude、Codex、oh-my-pi 與 OpenCode 檢查其本機 command registry 是否包含全部六個流程。沒有安全、非互動 registry probe 的平台 會明確回報 `not-supported`,不冒充驗證成功。結果放在輸出的 `verify.platforms[].runtime`: `status` 為 `pass`、`fail` 或 `not-supported`,並列出 `resolved`、`commands`、`missing`、 `probe` 與 `remediation`。任何 `fail` 都讓 `install` 回 `ok:false`。 最脆弱的是中間那一環:套件裝在某個 Node 版本底下,換個版本就找不到了,而轉接檔本身看起來完全正常—— 沒有這道驗證,使用者要到第一次打 `/sdlc-plan` 才發現。 **驗不過也不會回滾**,已經寫好的轉接檔一份都不刪。回滾在升級情境下是淨損失:原本有一組能用的舊 轉接檔,覆蓋後驗證失敗再刪掉,就從「有點舊但能用」變成什麼都沒有;何況最可能的病灶是「PATH 上 找不到 `tea-sdlc`」,那不是轉接檔的問題。輸出的 `error.message` 會指出病灶與修復方式,修好之後 重跑 `tea-sdlc install` 就好。 `--dry-run` 不寫入任何轉接檔,也就沒有東西可驗,`verify` 會標成 `skipped` 並說明原因。 安裝後可單獨重跑不寫檔的完整驗證: ```bash tea-sdlc verify tea-sdlc verify --platform oh-my-pi ``` `tea-sdlc sdlc-version` 是無副作用的健康檢查,回報目前 `tea-sdlc` 的版本、PATH 實際 解析到的 executable,以及可用流程;它不執行 AI Agent,也不連網。 --- ## 更新 / 移除 改流程正本、腳本、模板或規則,只要重裝套件,下一次叫用就讀到新的,**不必重新佈署**; 只有指令數量或轉接檔模板本身變了,才需要再跑一次 `tea-sdlc install`(轉接檔過時時, 叫用它會在輸出最前面提醒你)。 | 想做的事 | 指令 | | --- | --- | | 更新到最新版 | `npm i -g git+https://gitea.jsc.idv.tw/plugins/tea-sdlc.git` | | 指令數量變了之後重新佈署 | `tea-sdlc install` | | 重新驗證已部署的 AI Agent CLI | `tea-sdlc verify` | | 查版本、PATH executable 與流程 | `tea-sdlc sdlc-version` | | 查目前版本、正本位置與環境 | `tea-sdlc status` | | 只移除轉接檔(正本不動) | `tea-sdlc uninstall` | | 連套件一起移除 | `tea-sdlc uninstall` → `npm rm -g tea-sdlc` | > **不要用 `npm update -g`。** 這個套件是從 git URL 裝的,`npm update -g` 認不得它的來源, > 不會有任何更新發生,也不會報錯——重裝(上表第一行)才是更新的方式。 > > **移除的順序不能顛倒。** 先 `npm rm -g tea-sdlc` 會把 `tea-sdlc` 指令一起帶走, > 留在七個平台目錄裡的轉接檔就再也沒有東西能刪它們了,只能手動一個個找出來。 `tea-sdlc uninstall` 只刪自己產生的檔案:每份轉接檔裡都有產生標記,沒有標記的同名檔案一律留著, 並在輸出裡告訴你留了哪些。 --- ## 給 agent 的入口 轉接檔指向的就是這一支。它把流程正本原樣印到 stdout,不包 JSON——那些內容是要給模型讀的。 ```bash tea-sdlc prompt --name sdlc-plan ``` 其餘子指令與所有腳本一樣輸出單行 JSON `{ok, data, error:{code, message}}`,exit 0 或 1。 ```bash tea-sdlc status # 版本、正本位置、是否 link 模式、node/git/tea/登入、各平台轉接檔現況 ``` `status` 在環境不健康時**指令本身仍算成功**(`ok` 為 `true`、`data.healthy` 為 `false`): 「查詢失敗」與「成功查到你環境有問題」的下一步完全不同,不該由同一個旗標表示。 --- ## 附錄 ### 其他安裝方式(plugin / marketplace 機制) > 這些是各助理原生的 plugin / marketplace 機制。它們目前**裝不出任何指令**——`skills/` 還是空的, > 真正會生效的是上面 `tea-sdlc install` 產生的轉接檔。保留在這裡是因為這些機制本身有用 > (自動更新、plugin 清單),等 `skills/` 有內容時會回來。 #### Claude Code ```bash claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/tea-sdlc.git claude plugin install tea-sdlc@tea-sdlc # 更新 claude plugin marketplace update tea-sdlc claude plugin update tea-sdlc@tea-sdlc # 移除 claude plugin uninstall tea-sdlc@tea-sdlc claude plugin marketplace remove tea-sdlc ``` 工作階段內 slash 版(等價):把 `claude plugin` 換成 `/plugin`。 本機開發(免 push):`claude plugin marketplace add /root/plugins/tea-sdlc`(本地路徑)後再 install。 #### Codex ```bash codex plugin marketplace add https://gitea.jsc.idv.tw/plugins/tea-sdlc.git codex plugin add tea-sdlc@tea-sdlc # 更新(重新抓取 marketplace 的 git 快照) codex plugin marketplace upgrade tea-sdlc # 移除 codex plugin remove tea-sdlc@tea-sdlc codex plugin marketplace remove tea-sdlc ``` 安裝 token `tea-sdlc@tea-sdlc` = plugin 名(`.codex-plugin/plugin.json` 的 `name`)@ marketplace 名(`.agents/plugins/marketplace.json` 的 `name`)。安裝後重啟 Codex。 #### Antigravity(`agy`) > `agy plugin install ` 目前只支援 github.com;Gitea 等自架 git 請先 clone 再用本地路徑安裝。 ```bash git clone https://gitea.jsc.idv.tw/plugins/tea-sdlc.git ~/plugins/tea-sdlc agy plugin install ~/plugins/tea-sdlc # 更新(agy 無 update 子指令 → git pull 後重裝) git -C ~/plugins/tea-sdlc pull agy plugin uninstall tea-sdlc agy plugin install ~/plugins/tea-sdlc ``` #### GitHub Copilot CLI ```bash copilot plugin marketplace add https://gitea.jsc.idv.tw/plugins/tea-sdlc.git copilot plugin install tea-sdlc@tea-sdlc # 更新 copilot plugin marketplace update tea-sdlc copilot plugin update tea-sdlc@tea-sdlc # 移除 copilot plugin uninstall tea-sdlc@tea-sdlc copilot plugin marketplace remove tea-sdlc ``` #### OpenCode OpenCode 的「plugin」是 TypeScript/npm 套件,不適用於本 repo;改用目錄安裝。 OpenCode 會讀 `~/.config/opencode/skills/`(也會讀 `~/.claude/skills/`、`~/.agents/skills/`)。 ```bash git clone https://gitea.jsc.idv.tw/plugins/tea-sdlc.git ~/plugins/tea-sdlc mkdir -p ~/.config/opencode/skills cp -r ~/plugins/tea-sdlc/skills/* ~/.config/opencode/skills/ ``` > **Windows PowerShell**:`cp -r A B` → `Copy-Item A B -Recurse -Force`、`rm -rf X` → `Remove-Item X -Recurse -Force`、`~` → `$HOME`。 --- ## 開發 ```bash npm test # 等同 node --test,使用 Node 內建測試執行器,無任何外部套件 ``` 測試產生的暫存一律寫到 `.tmp/`(已被 git 忽略,也不會被測試探索掃到)。 模組邊界與其餘慣例見 [`AGENTS.md`](./AGENTS.md)。