Files
tea-sdlc/bin/tea-sdlc.js
T
jiantw83andClaude Opus 5 17178f0c4d feat(佈署): 以 npm 裝出 tea-sdlc 指令並產生各平台轉接檔
單一入口 bin/tea-sdlc.js 認四個子指令。第一個位置參數是子指令,其餘 argv 原樣
交出去——既有的 flag 解析拒絕位置參數,所以子指令必須在那之前就被取走。

轉接檔裡沒有路徑,只有一句 tea-sdlc prompt --name <指令名>。正本在哪由 PATH 上
的 tea-sdlc 自己回推:fnm 把 Node 版號寫進全域安裝路徑,寫死路徑的話升一次
Node,七個平台的轉接檔會同時指向不存在的檔案,而且不會有任何錯誤訊息。

prompt 是全專案唯一輸出非 JSON 的路徑,理由只有一個:它的輸出要餵給模型讀。
失敗仍走 envelope——成功是內容,失敗才需要結構。

status 的 ok 不兼差表達環境好壞,健康與否放在 data.healthy:呼叫端要分得出
「status 掛了」與「status 成功查到你環境有問題」。

install 只寫進偵測得到的平台;缺 git/tea 只警告不中止,因為那兩個完全不影響
轉接檔產生,硬擋等於逼使用者為了裝 plugin 先去裝 tea。uninstall 只刪帶產生標記
的檔案,使用者自己寫的同名檔案一律留著並在輸出裡交代。裝哪些指令以 prompts/ 裡
實際存在的正本為準,不是寫死的六個名字——裝出指向不存在正本的轉接檔,使用者只會
看到 PROMPT_NOT_FOUND。

流程正本的 description 前綴在抄進轉接檔之前就檢查:有三個平台關不掉自動觸發,
全靠那句話把 description 窄到不會被誤判,不能等使用者發現誤觸才知道漏了。

議題 #26 #27 #28 #29 #17

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 06:59:37 +00:00

44 lines
1.7 KiB
JavaScript

#!/usr/bin/env node
/**
* tea-sdlc 的單一入口。使用者與 agent 都從這裡進來:
*
* tea-sdlc install [--platform a,b] [--dry-run]
* tea-sdlc uninstall [--platform a,b] [--dry-run]
* tea-sdlc prompt --name sdlc-plan [--adapter-version 0.0.1]
* tea-sdlc status
*
* 這一層只做兩件事:把第一個位置參數當成子指令取走,其餘 argv 原樣交出去。
* 它不知道任何平台的目錄結構,也不自己動手做事——那些在 scripts/ 底下。
*
* 輸入輸出契約與 scripts/ 底下每一支腳本一致:只接受具名 flag、單行 JSON、exit 0 或 1。
* 唯一的例外是 prompt 的成功路徑,它印出原樣 markdown(理由見 lib 的 RawText)。
*/
import { ScriptError, main } from '../scripts/lib.js';
import { runInstall, runUninstall } from '../scripts/install.js';
import { runPrompt } from '../scripts/prompt.js';
import { runStatus } from '../scripts/status.js';
/** 子指令名 → 實作。名字就是使用者打的字,也是轉接檔裡寫的字。 */
const SUBCOMMANDS = {
install: runInstall,
uninstall: runUninstall,
prompt: runPrompt,
status: runStatus,
};
main(async () => {
const [name, ...argv] = process.argv.slice(2);
const names = Object.keys(SUBCOMMANDS).join('、');
if (name === undefined) {
throw new ScriptError('MISSING_SUBCOMMAND', `請指定子指令:${names}`);
}
// 位置參數只有這一個,而且必須在這裡就被取走:其後的 flag 解析一律拒絕位置參數
const run = SUBCOMMANDS[name];
if (run === undefined) {
throw new ScriptError('UNKNOWN_SUBCOMMAND', `不認得的子指令 ${name};可用的是:${names}`);
}
return run(argv);
});