feat/install-verify/main
master
install 寫完轉接檔之後,把那條叫用鏈真的走一遍:轉接檔 → PATH 上的 tea-sdlc → 流程正本。 任一環不通就回 ok:false,但已經寫好的轉接檔一份都不刪。
install
tea-sdlc
ok:false
#56 — 補上六個指令走通後浮現的四個缺口
#59 — 以安裝驗證確認轉接檔真的叫得動
scripts/install-verify.js
scripts/install.js
Failure
invocation()
scripts/lib.js
data
test/install-verify.test.js
test/helpers/fake-plugin.js
test/readme-install.test.js
README.md
AGENTS.md
execFileSync
ok:true
ScriptError
{ok:false, error}
error.code
轉接檔寫好了不等於叫得動。最脆弱的是中間那一環:套件裝在某個 Node 版本底下,換個版本管理器 或改 npm prefix 就找不到了,而轉接檔本身看起來完全正常。沒有這道驗證,使用者要到第一次打 /sdlc-plan 才發現,那時他已經離開安裝的心智狀態很久了。
/sdlc-plan
驗不過不回滾。 回滾在升級情境下是淨損失:原本有一組能用的舊轉接檔,覆蓋後驗證失敗再刪掉, 使用者就從「有點舊但能用」變成什麼都沒有。
審查過程另外抓到兩個真的 bug,一併修掉:
error.stderr
Command failed: …
PLUGIN_LAYOUT_BROKEN <訊息>
tea-sdlc install
verify
tea-sdlc install --dry-run
skipped
main()
onPath()
:
npm test:
npm test
ℹ tests 807 ℹ suites 0 ℹ pass 807 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 11203.317627
test/install-verify.test.js 新增 14 項,全部在臨時家目錄上真的寫檔、真的把 tea-sdlc 放上 PATH、真的執行它:
pass
checked
chain.resolved
PLUGIN_LAYOUT_BROKEN
Command failed
--dry-run
verify.skipped
true
test/
兩個 bug 的修復都先把程式改回壞的樣子、確認對應的測試真的會紅,才算數:
# 還原 stdio 修復後 ℹ pass 12 ℹ fail 1 AssertionError [ERR_ASSERTION]: 子行程的 stderr 漏出來了 # 還原「病灶取自 stdout」修復後 ℹ pass 13 ℹ fail 1
另外在真實家目錄(臨時 HOME)上手動跑過 node bin/tea-sdlc.js install 的兩條路徑: PATH 上沒有 tea-sdlc 時退出碼 1、轉接檔仍在;放上殼之後退出碼 0、verify.ok 為 true。
node bin/tea-sdlc.js install
verify.ok
install 寫完轉接檔後,把叫用鏈真的走一遍:轉接檔 → PATH 上的 tea-sdlc → 流程正本。 最脆弱的是中間那一環。套件裝在某個 Node 版本底下,換個版本就找不到了,而轉接檔本身 看起來完全正常——沒有這道驗證,使用者要到第一次打 /sdlc-plan 才發現,那時他已經離開 安裝的心智狀態很久了。所以不是查檔案在不在,而是真的到 PATH 上把 tea-sdlc 找出來執行 一次,再把取回的正本跟套件裡的那一份逐字比對:找不到、叫不動、或叫到的是另一份安裝, 三種都驗得出來。轉接檔則逐一回磁碟讀,比對存在且內容含正確的叫用行。 驗證不碰網路,也與 Gitea 登入、時間追蹤無關,所以無條件執行。 驗不過回 ok:false,但已經寫好的轉接檔一份都不刪。回滾在升級情境下是淨損失:原本有一組 能用的舊轉接檔,覆蓋後驗證失敗再刪掉,使用者就從「有點舊但能用」變成什麼都沒有;何況 最可能的病灶是「PATH 上找不到 tea-sdlc」,那不是轉接檔的問題。 為此 lib 多一個 Failure:有一種失敗是事情做完了、檔案也寫出去了,只是驗不過,那時最該 交出去的正是「已經寫了哪些、哪一段不通」。envelope 形狀不變,只是 {ok:false, error} 旁邊多一個 data,只讀 error.code 的呼叫端照常運作。 --dry-run 不寫入,也就沒有東西可驗,verify 標成 skipped。 Closes #59 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
No dependencies set.
The note is not visible to the blocked user.
摘要
install寫完轉接檔之後,把那條叫用鏈真的走一遍:轉接檔 → PATH 上的tea-sdlc→ 流程正本。任一環不通就回
ok:false,但已經寫好的轉接檔一份都不刪。需求議題
#56 — 補上六個指令走通後浮現的四個缺口
工作包議題
#59 — 以安裝驗證確認轉接檔真的叫得動
變更內容
scripts/install-verify.jsscripts/install.jsFailure;轉接檔的叫用行改用invocation()這個共同來源scripts/lib.jsFailure:失敗但把data一起交出去test/install-verify.test.jstest/helpers/fake-plugin.jstea-sdlc殼test/readme-install.test.jsREADME.md、AGENTS.md設計重點
tea-sdlc找出來execFileSync一次,再把取回的正本跟套件裡的那一份逐字比對。所以「找不到」、「叫不動」、「叫到的是另一份安裝」
三種都分得出來——只看 exit code 的話,第三種會靜靜地通過。
invocation(),分成兩份寫的話,改了格式只會讓驗證從此永遠 fail,或者更糟:永遠 pass。
原稿遞給驗證——遞過去它就有機會拿記憶體裡的字串來比,等於自己驗自己。
tea-sdlc不在 PATH 上時,每個平台仍回報ok:true:轉接檔真的沒問題,刪掉它一點幫助也沒有。
Failure是為了「做完了但驗不過」。 丟ScriptError只剩 code 與 message,而這種失敗最該交出去的正是「已經寫了哪些、哪一段不通」。envelope 形狀不變,
只是
{ok:false, error}旁邊多一個data,只讀error.code的呼叫端照常運作。解決的問題
轉接檔寫好了不等於叫得動。最脆弱的是中間那一環:套件裝在某個 Node 版本底下,換個版本管理器
或改 npm prefix 就找不到了,而轉接檔本身看起來完全正常。沒有這道驗證,使用者要到第一次打
/sdlc-plan才發現,那時他已經離開安裝的心智狀態很久了。驗不過不回滾。 回滾在升級情境下是淨損失:原本有一組能用的舊轉接檔,覆蓋後驗證失敗再刪掉,
使用者就從「有點舊但能用」變成什麼都沒有。
審查過程另外抓到兩個真的 bug,一併修掉:
execFileSync預設會把子行程的 stderr 接到我們的 stderr,違反 lib 寫明的「stderr 永遠保持乾淨」輸出契約。
tea-sdlc的失敗一律是 stdout 上的一行 JSON(stderr 按設計保持乾淨),所以原本讀的
error.stderr永遠是空字串,訊息退化成光禿禿的Command failed: …。現在會報出子行程自己說的PLUGIN_LAYOUT_BROKEN <訊息>。影響的功能
tea-sdlc install:多一段驗證,輸出多一個verify欄位;驗不過時回ok:false、退出碼 1。已知的行為改變:PATH 上排在前面的是另一個版本的
tea-sdlc時,install 會失敗。這會咬到「從 checkout 跑、同時裝了舊的全域版」的情況——那也正是它要講的事。
tea-sdlc install --dry-run:不寫入,也就沒有東西可驗,verify標成skipped,仍回ok:true。scripts/lib.js的main():多認得Failure一種回傳值。其餘腳本行為不變。onPath()只用:切 PATH),已與需求方確認為範圍外。測試結果
npm test:test/install-verify.test.js新增 14 項,全部在臨時家目錄上真的寫檔、真的把tea-sdlc放上 PATH、真的執行它:
pass,checked數目對得上chain.resolved確實指向 PATH 上那個tea-sdlcok:false,病灶指向 PATH,且各平台仍ok:truetea-sdlc跑不完 → 病灶取自它自己報的錯,且我們的 stderr 仍為空tea-sdlc自己裝壞 → 病灶是PLUGIN_LAYOUT_BROKEN,不是Command failedok:false,data照樣交出去--dry-run一個字都不寫,verify.skipped為true,仍回ok:truetest/不在套件白名單裡兩個 bug 的修復都先把程式改回壞的樣子、確認對應的測試真的會紅,才算數:
另外在真實家目錄(臨時 HOME)上手動跑過
node bin/tea-sdlc.js install的兩條路徑:PATH 上沒有
tea-sdlc時退出碼 1、轉接檔仍在;放上殼之後退出碼 0、verify.ok為true。install 寫完轉接檔後,把叫用鏈真的走一遍:轉接檔 → PATH 上的 tea-sdlc → 流程正本。 最脆弱的是中間那一環。套件裝在某個 Node 版本底下,換個版本就找不到了,而轉接檔本身 看起來完全正常——沒有這道驗證,使用者要到第一次打 /sdlc-plan 才發現,那時他已經離開 安裝的心智狀態很久了。所以不是查檔案在不在,而是真的到 PATH 上把 tea-sdlc 找出來執行 一次,再把取回的正本跟套件裡的那一份逐字比對:找不到、叫不動、或叫到的是另一份安裝, 三種都驗得出來。轉接檔則逐一回磁碟讀,比對存在且內容含正確的叫用行。 驗證不碰網路,也與 Gitea 登入、時間追蹤無關,所以無條件執行。 驗不過回 ok:false,但已經寫好的轉接檔一份都不刪。回滾在升級情境下是淨損失:原本有一組 能用的舊轉接檔,覆蓋後驗證失敗再刪掉,使用者就從「有點舊但能用」變成什麼都沒有;何況 最可能的病灶是「PATH 上找不到 tea-sdlc」,那不是轉接檔的問題。 為此 lib 多一個 Failure:有一種失敗是事情做完了、檔案也寫出去了,只是驗不過,那時最該 交出去的正是「已經寫了哪些、哪一段不通」。envelope 形狀不變,只是 {ok:false, error} 旁邊多一個 data,只讀 error.code 的呼叫端照常運作。 --dry-run 不寫入,也就沒有東西可驗,verify 標成 skipped。 Closes #59 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>