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 是什么?

该技能(SKILL)是 lenne.tech CLI(`lt`)的权威参考指南,专为 Claude Code 或其他 AI 代理设计,用于高效管理全栈工作区。它涵盖了从初始化和修改全栈项目(`lt fullstack init`)到高级开发工作流(如并行项目编排、`lt dev` 通过 Caddy 提供 HTTPS 支持、`lt ticket` 用于隔离的特性开发环境)的所有内容。主要的“陷阱”部分详细列出了集成 AI 时必须避免的关键问题,例如在没有 `--noConfirm` 的情况下使用 `lt fullstack init` 会导致会话挂起,以及不同 `lt` 子命令的约束条件。该技能明确定义了职责边界:`lt server module`、`object` 和 `addProp` 等生成器应路由到 `generating-nest-servers` 技能,而前端工作(Vue/Nuxt)应使用 `developing-lt-frontend`。它还记录了各种命令的具体行为、参数和副作用,例如 `lt git reset` 的破坏性、`--api-link` 创建的是符号链接而非副本,以及 `--next` 标志的实验性质。对于 AI 代理,这是一个操作手册,提供了安全、正确地使用 lenne.tech 工具链所需的所有细节。

兼容平台✓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 init、模板选择)会等待标准输入的输入。Claude Code 无法响应它们,会话会卡在“正在展开…”状态且不消耗 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 具有破坏性且不可逆 — 它与安全的 lt git get 并排在 CLI 菜单中。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 模式之间切换会将框架代码移入或移出 src/core/(API)或 app/core/(App)。此操作是可逆的,但在运行过程中不幂等——始终在开始之前提交,以便可以通过 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 域套接字路径,该路径超过操作系统 104 字符的限制 → SSR 崩溃并返回 500。解决办法:使用短 tmp 目录启动,TMPDIR=/tmp lt dev up。(Linux 的 $TMPDIR=/tmp 很短,因此此问题仅影响 macOS。)
  • macOS:HMR WebSocket 端口 24678 在并行的 lt dev 项目之间冲突 — 同时运行的两个 lt dev 项目都尝试绑定 Vite 的 HMR WS 端口 24678。vite.server.hmr.port 被 Nuxt 4.4.7 忽略,因此您无法在配置中重新分配它。这非致命——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 <branch-name>    # 别名:lt git g
  1. 分支本地存在 → 切换到它
  2. 分支在远程存在 → 检出并跟踪
  3. 两者都不存在 → 从当前分支创建新分支

lt git reset — 重置到远程

lt git reset

从远程获取最新内容,将当前分支重置为 origin/<branch>。具有破坏性 — 所有本地更改都会丢失。

lt fullstack init — 创建全栈工作区

# 非交互式
lt fullstack init --name <Name> --frontend <angular|nuxt> --git <true|false> --noConfirm \
  [--git-link <URL>] [--api-link <path>] [--frontend-link <path>] [--next]
参数必需描述
--name是工作区名称(帕斯卡命名法)
--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 快速隧道:公共 *.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,将“本地开发 (lt dev)”URL 块注入所有 CLAUDE.md 文件,将 .lt-dev/ 添加到 .gitignore。自动链接: 当机器尚未准备好时,会先运行 install(使用 --skip-install 选择退出)。
  • up — 分配内部上游端口(4000+,绝不是 3000/3001),创建或更新使用 reverse_proxy 127.0.0.1:<port> 的 Caddy 块 + 重新加载,导出 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,位于其自己的堆栈数据库中,首次启动时会以拥有者角色创建该数据库,因此拥有者需要具有 CREATEDB(对于 PostgreSQL)或 CREATE + GRANT OPTION(对于 MySQL / MariaDB);无凭据记录在 ~/.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 观察者等)也能接收到。移除项目的 Caddy 块 + 重新加载。还会为此项目拆除任何隔离的测试堆栈(lt dev test)。
  • test — 隔离的 E2E。启动第二个并行堆栈(<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 会为项目的 playwright.config 导出 LT_DEV_TEST_SHARDS,以便仅在该负载下放宽超时(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 快速隧道:cloudflared tunnel --url https://<slug>.localhost --http-host-header <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 覆盖生成二进制文件(例如,用于基于 bun 的项目的包装脚本)。

lt ticket — 并行票证开发环境

同时处理一个项目的多个票证/功能——每个都在其自己的 git worktree + 其自己隔离的 lt dev 堆栈(自己的 URL、端口、Caddy 块、空数据库)中——因此多个票证可以在没有交叉影响的情况下并行进行浏览器测试和 E2E 测试。

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.

相关技能