Communitygithub.com

lenneTech/使用-lt-cli

lenne.tech CLI (`lt`) 的參考指南:涵蓋 `lt fullstack init/update/convert-mode`、`lt git`、`lt server`、`lt deployment` 及 `lt dev`(透過 Caddy 平行管理專案)。當偵測到任何 `lt` 子指令、"lenne.tech CLI"、"--noConfirm"、"convert-mode"、"npm mode" / "vendor mode" 或 "Caddy tunnel" 關鍵詞時會自動觸發。**不適用**於手動撰寫 NestJS 模組或屬性(請改用 generating-nest-servers),也不適用於 Vue/Nuxt 前端程式碼(請改用 developing-lt-frontend)。

使用-lt-cli 是什麼?

這是 `lenne.tech CLI`(簡稱 `lt`)的完整參考指南,專為在 AI 代理環境(如 Claude Code)中使用而設計。指南首先列出關鍵的「注意事項」,其中說明了常見陷阱,例如 `lt fullstack init` 若缺少 `--noConfirm` 旗標會導致懸掛、`--api-link` 建立的符號連結可能造成非預期行為、`lt git reset` 的破壞性、以及 macOS 上因 `$TMPDIR` 過長導致 Nuxt SSR 崩潰等問題。指南也涵蓋了多個指令類別:`lt git` 負責分支管理;`lt fullstack init` 負責建立全端工作區(支援 Angular 及 Nuxt 前端);`lt dev` 負責平行專案協調(使用 Caddy 為每個專案提供隔離的 HTTPS URL 及資料庫);`lt ticket` 用於管理平行票證開發環境;`lt server` 用於產生 NestJS 後端元件(如模組、物件等)。說明內容強調,對於後端與前端開發,必須分別參考 `generating-nest-servers` 及 `developing-lt-frontend` 技能,以確保工作流程的正確性。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/lenneTech/claude-code/tree/HEAD/plugins/lt-dev/skills/using-lt-cli

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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
  1. 若分支已存在於本機 → 切換至該分支
  2. 若分支存在於遠端 → 檢出並追蹤
  3. 若兩者皆不存在 → 從目前分支建立新分支

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.com URL(約需 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

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相關技能