LT CLI 參考指南
注意事項
lt fullstack init若缺少--noConfirm會導致 Claude Code 永久懸掛 — 互動式提示(專案名稱、git 初始化、範本選擇)會等待標準輸入。Claude Code 無法回應這些提示,導致工作階段卡在「Unfurling...」狀態,且不會消耗 Token。從 Claude Code 呼叫 lt CLI 時,請務必傳遞--noConfirm及所有必要旗標(如--name X --frontend nuxt --git false)。--api-link與--frontend-link建立的是符號連結,而非複本 — 對範本檢出目錄(nest-server-starter、nuxt-base-starter)所做的變更,無論其在機器上的位置為何,都會立即影響已連結的專案。這對於框架開發來說是一項功能,但可能會讓預期得到複本的開發者感到意外。使用--api-link時,請務必在專案的 README 文件中說明此行為。lt git reset具有破壞性且不可逆 — 在 CLI 選單中,它與安全的lt git get相鄰。reset會執行git reset --hard,緊接著強制拉取,這會銷毀所有本機變更,且不會有任何提示。絕對不要在含有未推送工作的分支上執行此指令。 建議優先使用git stash搭配lt git get。lt server object X --controller產生的是 REST,而非 GraphQL — 預設為 REST。若為 GraphQL 專案,請改用--resolver。CLI 不會從現有的專案模式自動偵測 — 您必須明確指定。lt fullstack convert-mode會改寫原始碼樹 — 在npm與vendor模式之間切換時,框架程式碼會被移入或移出 API 的src/core/目錄或應用程式的app/core/目錄。此操作是可逆的,但在執行過程中並非冪等 — 開始前請務必先提交變更,以便在轉換失敗時能透過git reset復原。--next為實驗性功能,且與lt server module/object/addProp/test/permissions不相容 — 當使用lt server create --next或lt fullstack init --next時,API 會從nest-base(Bun + Prisma 7 + Postgres + Better-Auth)複製,而非nest-server-starter。下游的產生器是針對傳統的 nest-server 佈局(Mongoose 模型、src/server/modules/ 等)所設計,無法在 nest-base 專案上正常運作。此功能僅適用於全新原型開發;生產環境請優先使用預設範本。- macOS:過長的
$TMPDIR會導致lt dev up下的 Nuxt SSR 崩潰 — 在 macOS 上,$TMPDIR是一條很長的每用戶路徑(/var/folders/…,通常長度超過約 49 個字元)。Nuxt 4.4.7 的 vite-node 會在此路徑下建立一個 Unix 域 socket,進而超過作業系統 104 字元的限制 → 導致 SSR 崩潰並回傳 500 錯誤。解決方法:使用較短的暫存目錄啟動,例如TMPDIR=/tmp lt dev up。(Linux 的$TMPDIR=/tmp較短,因此此問題僅發生在 macOS 上。) - macOS:HMR WebSocket 連接埠 24678 在並行的
lt dev專案之間會發生衝突 — 同時執行兩個lt dev專案時,兩者都會嘗試綁定 Vite 的 HMR WS 連接埠 24678。Nuxt 4.4.7 會忽略vite.server.hmr.port設定,因此您無法在配置中重新指定連接埠。此問題不致命 — SSR 重新編譯仍可正常運作;僅第二個專案的即時 HMR 推送會受到影響。重新載入頁面即可接收變更。
技能邊界
| 用戶意圖 | 應使用的正確技能 |
|---|---|
| "lt fullstack init" | 此技能 |
| "lt git get feature-branch" | 此技能 |
| "lt server create my-project" | 此技能 |
| "lt server module / object / addProp" | generating-nest-servers |
| "lt server permissions" | generating-nest-servers |
| "建立一個 NestJS 模組" | generating-nest-servers |
| "建立一個 Vue 元件" | developing-lt-frontend |
| "lt deployment create" | 此技能(請參閱 lt deployment create 指令) |
| "部署到 TurboOps / 上線 / turbo 部署 / 部署階段" | deploying-to-turboops |
執行 lt fullstack init 之後:
- 後端工作(projects/api/)→
generating-nest-servers - 前端工作(projects/app/)→
developing-lt-frontend
指令
lt git get — 檢出/建立分支
lt git get <分支名稱> # 別名:lt git g
- 若分支已存在於本機 → 切換至該分支
- 若分支存在於遠端 → 檢出並追蹤
- 若兩者皆不存在 → 從目前分支建立新分支
lt git reset — 重設為遠端狀態
lt git reset
從遠端獲取最新資料,並將目前分支重設為 origin/<branch>。具破壞性 — 所有本機變更都將遺失。
lt fullstack init — 建立全端工作區
# 非互動模式
lt fullstack init --name <專案名稱> --frontend <angular|nuxt> --git <true|false> --noConfirm \
[--git-link <URL>] [--api-link <路徑>] [--frontend-link <路徑>] [--next]
| 參數 | 必要 | 說明 |
|---|---|---|
--name | 是 | 工作區名稱 (PascalCase) |
--frontend | 是 | angular 或 nuxt |
--git | 是 | 初始化 git:true / false |
--noConfirm | 否 | 跳過確認提示 |
--git-link | 否 | Git 儲存庫 URL |
--api-branch | 否 | nest-server-starter 的分支 |
--frontend-branch | 否 | 前端起始範本的分支 |
--api-copy / --api-link | 否 | 本機 API 範本(複本 / 符號連結) |
--frontend-copy / --frontend-link | 否 | 本機前端範本(複本 / 符號連結) |
--next | 否 | 實驗性 — 從 nest-base 複製(Bun + Prisma 7 + Postgres + Better-Auth)作為 API。會強制將 apiMode 設為 Rest、frameworkMode 設為 npm,並跳過工作區安裝(需手動為 app 執行 pnpm install、為 api 執行 bun install)。後續的 lt server module/object/addProp/test 與產生的佈局不相容。 |
優先級: --*-link > --*-copy > --*-branch > 預設 (GitHub 複製)
建立的結構:
<workspace>/
├── projects/
│ ├── api/ ← nest-server-starter(或使用 --next 時的 nest-base)
│ └── app/ ← nuxt-base-starter(或 ng-base-starter)
├── package.json
└── .gitignore
建立後:
cd <workspace> && pnpm install
lt dev init # 冪等:環境變數修補 + 註冊;若機器尚未設定,會先自動執行 `lt dev install`
lt dev up # 在 Caddy 後啟動 API + App,位於 https://<slug>.localhost
# 使用 --next:依子專案安裝,無工作區安裝
cd <workspace>/projects/app && pnpm install
cd <workspace>/projects/api && bun install
(如果未使用 lt dev,則會回退到在預設連接埠 3000/3001 上以 pnpm -r --parallel run start 執行。)
lt dev — 平行專案協調 (Caddy + HTTPS)
透過 Caddy 將每個 lt 專案提供在穩定的 HTTPS URL(<slug>.localhost、api.<slug>.localhost)下,以便多個專案可以並行運作,不會因爭用 3000/3001 連接埠而衝突,也不會發生驗證交叉連接問題。請在每個 lt-monorepo 或獨立的 API/App 專案中使用此指令。
lt dev install # 每台機器一次性設定:引導專用的 LaunchAgent/systemd 服務 + Caddyfile 存根 + CA 提醒
lt dev uninstall [--purge] # 移除 lt-dev 服務(--purge 同時刪除 Caddyfile 和日誌)
lt dev init # 每個專案一次(冪等):環境變數修補 + 註冊
lt dev up # 在 Caddy 後啟動 API + App
lt dev down # 停止程序 + 移除 Caddy 區塊(同時拆除任何隔離的測試堆疊)
lt dev test # 隔離的 Playwright E2E 測試:平行堆疊 + 專屬 `<slug>-test` 資料庫,自動拆除
lt dev test --shard # 在 2 個隔離堆疊之間分片(預設 — 穩定的最佳選擇)
lt dev test --shard 3 # 在 N 個完全隔離的堆疊之間分片(各自擁有自己的連接埠/Caddy/資料庫 `<slug>-test-<i>`)
lt dev test --shard auto # 根據此機器的 CPU + RAM 決定 N 的值(保守估計)
lt dev test down # 拆除隔離的測試堆疊(無殘留)
lt dev status # 顯示此專案的 URL + PID + 即時上游狀態(包含任何測試堆疊)
lt dev status --all # 列出每個已註冊的專案及其執行狀態
lt dev doctor # 診斷 Caddy / CA / DNS / 連接埠問題
lt dev tunnel [--api] # 前台的 Cloudflare Quick Tunnel:公開的 *.trycloudflare.com URL
各個子指令的功能說明:
install— 每台機器一次性設定。確認caddy已加入 PATH(若缺少則建議執行brew install caddy),建立~/.lenneTech/Caddyfile存根,寫入並引導一個專用的 LaunchAgent(macOS,~/Library/LaunchAgents/tech.lenne.lt-dev-caddy.plist)或 systemd-user 服務(Linux)。等待最多 8 秒讓 Caddy 管理端點(:2019)回應,驗證檔案,並提醒您執行sudo -E HOME="$HOME" caddy trust(-E HOME="$HOME"是必要的 — 否則 sudo 會將 HOME 切換為/var/root,導致 CA 安裝靜默失敗)。不會使用brew services start caddy— 其 plist 檔案會將--config /opt/homebrew/etc/Caddyfile寫死,並在與我們 Caddyfile 路徑不一致時崩潰。自動串聯: 若在一個尚未初始化的 lt-dev 專案中執行,則會在其後執行init(可使用--skip-init選擇退出)。uninstall— 與install相對應的指令。移除 LaunchAgent / systemd 服務及其單元檔案。使用--purge還會刪除~/.lenneTech/Caddyfile和 caddy 日誌。不會移除 caddy 二進位檔本身(如有需要,請使用brew uninstall caddy)。init(別名migrate)— 冪等。建立專案識別(slug =package.json中的 "name",子網域來自 monorepo 佈局),修補舊版寫死的port: 3000/port: 3001/ Vite-proxy 目標 / Playwright URL 為環境感知變體(保留預設值),將配置持久化到~/.lenneTech/projects.json,在所有CLAUDE.md檔案中注入 "Local Development (lt dev)" URL 區塊,並將.lt-dev/加入.gitignore。自動串聯: 若機器尚未準備好,會先執行install(可使用--skip-install選擇退出)。up— 分配內部上游連接埠(4000 以上,絕不使用 3000/3001),插入或更新 Caddy 區塊(使用reverse_proxy 127.0.0.1:<port>)並重新載入,導出PORT、HOST=127.0.0.1/NITRO_HOST=127.0.0.1(將開發伺服器鎖定在 IPv4 以避免上游歧義)、BASE_URL、APP_URL、NUXT_API_URL、NUXT_PUBLIC_API_URL、NUXT_PUBLIC_SITE_URL、NUXT_PUBLIC_STORAGE_PREFIX、NUXT_PUBLIC_API_PROXY=false、API 的資料庫(MongoDB:NSC__MONGOOSE__URI;PostgreSQL / MySQL / MariaDB,自 lt CLI 1.54.0 起:NSC__DATABASE__URL和NSC__DATABASE__OWNER_URL,僅供 API 使用,使用堆疊自己的資料庫,首次啟動時會以擁有者角色身分建立該資料庫,因此擁有者需要 PostgreSQL 的CREATEDB權限或 MySQL / MariaDB 的CREATE+GRANT OPTION權限;不記錄憑證,僅在~/.lenneTech/projects.json的dbUrls下記錄)、NODE_EXTRA_CA_CERTS(Caddy 根 CA,使 Nuxt SSR 能夠信任 HTTPS 請求),以及為早於NUXT_*命名慣例的專案提供的舊版別名API_URL/SITE_URL。然後以分離模式啟動pnpm start(api)和pnpm dev(app)。前置檢查會在以下情況拒絕啟動:Caddy 缺失、Caddy 守護行程未執行、現有工作階段仍存活、或內部連接埠已被綁定。日誌檔案位於<root>/.lt-dev/{api,app}.log。down— 向已儲存的行程群組(負的 PID)發送 SIGTERM 訊號,使其子行程(Vite、Nest watcher 等)也能收到訊號。移除專案的 Caddy 區塊並重新載入。同時也會拆除此專案的所有隔離測試堆疊(lt dev test)。test— 隔離的端到端測試。啟動第二個平行堆疊(<slug>-test.localhost/api.<slug>-test.localhost,擁有自己的連接埠、Caddy 區塊及.lt-dev/.env.test橋接檔案),使用專用的資料庫<slug>-test(與開發用的<slug>-local及 API 測試用的<slug>-e2e分離),執行 Playwright 測試套件(全域設定會在執行第一個測試之前重設該資料庫一次),然後自動且無殘留地拆除。它會與開發工作階段並行執行,且絕不會影響開發工作階段。--keep可讓其保持運作;lt dev test down可將其停止;--api改用(已隔離的)API 測試;--debug= PWDEBUG+headed;-- <args>會將參數轉發給 Playwright。--shard N會將測試套件分割,並在 N 個完全隔離的堆疊上平行執行(各自擁有自己的連接埠、Caddy 區塊及資料庫<slug>-test-<i>),並啟動 N 個--shard=i/N的 Playwright 程序 — 這是本機的 CI 等價矩陣。單純的--shard預設為 2(穩定的最佳選擇:在一般開發機器上,N≥3 會過度訂閱效能核心 → 不穩定);--shard auto則根據 CPU+RAM 決定 N 值(保守估計)。本機分片共享一台機器(與 CI 的每個分片獨立容器不同),因此 CLI 會導出LT_DEV_TEST_SHARDS,供專案的 playwright.config 僅在該負載下放寬逾時設定(CI 則保持快速)。lt dev test down會回收所有分片。需要支援此隔離工作階段的 lt CLI 版本。status/status --all— 目前專案:子網域 → 上游連接埠、資料庫 URI、工作階段 PID(存活/死亡)、即時lsof上游狀態。--all:每個已註冊的專案,帶有●/○指示燈。doctor— 檢查 Caddy 是否在 PATH 中、lt-dev LaunchAgent / systemd 服務是否已載入、守護行程是否在執行、Caddyfile 是否有效、連接埠 80/443 是否空閒或被 Caddy 佔用、*.localhost是否解析(IPv4 或 IPv6 回送)、註冊表狀態。tunnel— 前台的 Cloudflare Quick Tunnel:cloudflared tunnel --url https://<slug>.localhost --http-host-host <slug>.localhost --no-tls-verify。列印一個公開的*.trycloudflare.comURL(約需 5-10 秒),並持續執行直到按下 Ctrl-C。預設暴露 App;--api則切換目標。在 localhost 網域上的驗證 Cookie 在隧道 URL 上無效 — 請將隧道 URL 加入 Better-Auth 的trustedOrigins設定,才能使登入流程成功。可以平行啟動第二個lt dev tunnel --api以實現完整的外部存取。
透過 LT_PNPM_BIN 覆寫 spawn 二進位檔(例如用於基於 bun 的專案,可透過包裝腳本實作)。
lt ticket — 並行票證開發環境
同時處理一個專案的多個票證/功能——每個票證都有自己的 git worktree + 自己隔離的 lt dev 堆疊(自己專屬的 URL、連接埠、Caddy 區塊、空的資料庫)——這樣多個票證就可以同時進行瀏覽器測試和端到端測試,而不會互相干擾。
lt ticket start DEV-2200 # worktree(分支 feat/DEV-2200,從 origin/dev 建立)+ pnpm install + lt dev up