沿用既有接縫:子行程執行、stub server 錄下每一筆請求。涵蓋標籤名稱解析、
未知標籤中止、不碰 labels 的寫入端點、同標題不重建、前後空白視為同一顆,
以及寫入型腳本一樣跑滿前置檢查。
試跑的部分特別驗「預覽要忠實」:預覽的 body 必須看得出標籤會被貼上、標籤
錯字在試跑就該擋下、同名議題已存在時預覽不得預告要建立議題,且全程不發出
任何寫入請求。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
三條測試都先確認過會在舊版實作上失敗。第一版寫出來時有兩條其實是陪跑的——
情境裡沒有後續段落,正確與錯誤的結果剛好都落在 body 結尾,分不出來。加上一個
真正的後續段落之後才有鑑別力。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
摘要
把 tea-sdlc 變成裝得起來、叫得動的東西:
npm i -g <git url>裝出tea-sdlc指令,tea-sdlc install把流程指令佈署到機器上偵測得到的每個 agent 平台。轉接檔裡沒有路徑,只有一句tea-sdlc prompt --name <指令名>,正本在哪由 PATH 上的tea-sdlc自己回推。需求議題
#1 — tea-sdlc:以 tea 驅動 SDLC 全流程的跨平台指令組
工作包議題
#17 的轉接檔內容是「執行 tea-sdlc prompt …」,那條驗收標準要驗得過,prompt 必須先存在,所以前四張票一起交付。
變更內容
bin/tea-sdlc.js:單一入口,認install/uninstall/prompt/status四個子指令。scripts/install.js:七個平台的偵測、轉接檔產生與移除,全專案唯一知道各平台目錄結構的地方。scripts/prompt.js:把流程正本原樣印到 stdout。scripts/status.js:版本、正本位置、是否 link 模式、環境四項與各平台轉接檔現況。scripts/lib.js:新增RawText原樣輸出模式、promptsDir/packageVersion、missingBinaries/checkPluginLayout/onPath。package.json:移除private、新增bin與files白名單,未新增prepare,dependencies仍然不存在。scripts/install.js。設計重點
轉接檔不持有路徑。 fnm 把 Node 版號寫進全域安裝路徑,寫死路徑的話升一次 Node,七個平台的轉接檔會同時指向不存在的檔案,而且使用者不會收到任何錯誤——只會發現
/sdlc-plan不動了。prompt 是全專案唯一輸出非 JSON 的路徑。 它的輸出要餵給模型讀;把幾百行 markdown 包進單行 JSON 再逼模型反跳脫只會增加讀錯的機率。失敗仍走 envelope——成功是內容,失敗才需要結構。
ok與healthy分離。ok的意思一直是「這支指令跑成功了」,不兼差表達環境好壞;混用會讓呼叫端分不出「status 掛了」與「status 成功查到你環境有問題」。裝哪些指令以
prompts/裡實際存在的正本為準,不是寫死的六個名字——裝出指向不存在正本的轉接檔,使用者只會看到PROMPT_NOT_FOUND。description 前綴在抄進轉接檔之前就檢查。 有三個平台關不掉自動觸發,全靠那句話把 description 窄到不會被誤判。
解決的問題
裝完什麼都沒有:
skills/是空的,七套 marketplace 流程照著做不會出現任何指令;換一台機器要為七個平台各學一套安裝流程;沒有一套流程回答「放進去的檔案要指向哪個正本」。影響的功能
新增的都是新檔案。既有十五支腳本的輸入輸出契約未變,
lib.main()只在回傳RawText時改走原樣輸出,其餘路徑行為不變。runScript()的單行 JSON 斷言未被放寬。測試結果
npm test332 pass / 0 fail。新增 6 個測試檔(入口、prompt、status、install、README、假 plugin 根 helper)。install 與 uninstall 全部在臨時家目錄上真的寫檔刪檔再斷言剩下什麼。與議題文字的三處偏離
status回報platforms(#29 寫「不回報 platforms」)——#29 與 #17 一起交付,以 #17 為準。git/tea時只警告不中止(#17 寫「印出安裝指引並中止」)——#25 明文推翻:「缺 tea 完全不影響轉接檔產生,硬擋等於逼使用者為了裝 plugin 先去裝 tea」。這一條若要改回中止,動的地方很小。另:
uninstall是子指令而不是 #17 的--uninstall旗標,因為 #26 定義了四個子指令名。🤖 Generated with Claude Code
scripts/lib.js 立起所有腳本共用的地基:具名 flag 解析、單行 JSON 輸出 {ok, data, error:{code, message}}、Gitea API 與 git 各自唯一的出口、 四層前置檢查、依標題的冪等查重。 前置檢查依序為執行環境(git/tea 在 PATH 上、plugin 目錄完整)、Gitea 登入 有效、帳號對 issues unit 的寫入權、repo 已開啟時間追蹤;任一層不通過即帶著 可區分的錯誤碼中止,訊息一律指出該去哪裡改設定,前一層沒過就不再往下打。 issues unit 的寫入權採實測而非讀 permissions.push——Gitea 的 team unit 權限 可獨立於 repo 的 push 權限。探針打在不存在的議題 index 0:有寫入權會通過權限 中介層後回 404,沒有則直接 403,兩種結果都不改動任何東西。 認證預設沿用使用者既有的 tea login(讀 tea 的 config.yml),環境變數 TEA_SDLC_API_BASE / TEA_SDLC_TOKEN 只作為測試與 CI 的覆寫出口。 labels-list 為第一支腳本,刻意只讀不寫,呼應「不自動建立 Gitea 標籤」。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>code review 逐項驗出來的,全部可重現: - `~~~` 圍欄完全沒被認出來,裡面的井字號會被當成段落標題。 - 段落內的圍欄不影響清單解析,於是程式碼範例裡的減號變成假的驗收標準。 這是最嚴重的一個——輸出多出一條沒有人寫過的標準。 - 表格欄位裡逸脫的直線 `\|` 會把欄位切斷,內容整段消失。 - 同一段落裡若出現第二條分隔列,它會變成一筆 {term:'---'} 的假名詞。 - 圍欄開了沒關時,其後內容的歸屬沒有明確定義。 改法是把「圍欄裡的東西不是內容」這件事收斂到 eachLine 處理一次,段落切分、 清單、表格三者都靠它,而不是各自寫一份半套的判斷。圍欄需同種標記才算關閉; 沒關就到結尾時,其後內容一律算在圍欄內,這與 markdown 的實際渲染一致。 巢狀清單改為明確攤平並寫進註解:需求議題的模板沒有巢狀,真的出現時寧可多帶 一項,也不要無聲吃掉內容。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>此 PR 的來源分支與 master 沒有共同祖先(本地 repo 是從 archive 重建的,根 commit 為合成基線),Gitea 因此算不出 merge base,diff 永遠是空白。同樣的內容已改由 #36 在 master 之上重建並合併,故關閉本 PR 並刪除來源分支。
Pull request closed