LT CLI リファレンス
注意点(Gotchas)
lt fullstack initを--noConfirmなしで実行すると、Claude Codeが永久にブロックされる — インタラクティブなプロンプト(プロジェクト名、git init、テンプレート選択)が標準入力の入力を待ちます。Claude Codeはそれらに応答できず、セッションは「Unfurling...」のままトークンを消費しません。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モードの切り替えにより、フレームワークコードをsrc/core/(API)またはapp/core/(App)に移動します。この操作は元に戻せますが、実行中は冪等ではありません。開始する前に必ずコミットし、変換に失敗した場合はgit resetでロールバックできるようにしてください。--nextは実験的であり、lt server module/object/addProp/test/permissionsとは互換性がない —lt server create --nextまたはlt fullstack init --nextを使用すると、nest-server-starterの代わりにnest-base(Bun + Prisma 7 + Postgres + Better-Auth)からAPIがクローンされます。下流のジェネレーターはクラシックな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ドメインソケットパスを構築し、OSの104文字制限を超えるため、SSRが500エラーでクラッシュします。回避策:短いtmpディレクトリで開始するには、TMPDIR=/tmp lt dev upを使用します。(Linuxの$TMPDIR=/tmpは短いため、この問題はmacOSでのみ発生します。) - macOS: HMR WebSocketポート24678が並列
lt devプロジェクト間で競合する — 2つのlt devプロジェクトが同時に実行されると、両方ともViteのHMR WSポート24678にバインドしようとします。vite.server.hmr.portはNuxt 4.4.7では無視されるため、設定で再割り当てできません。これは致命的ではありません — SSRの再コンパイルは引き続き機能します。2番目のプロジェクトでのライブ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
- ブランチがローカルに存在する → 切り替える
- ブランチがリモートに存在する → チェックアウトして追跡する
- どちらも存在しない → 現在のブランチから新しいブランチを作成する
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 | いいえ | 実験的 — API用に nest-base(Bun + Prisma 7 + Postgres + Better-Auth)をクローンします。apiMode = Rest、frameworkMode = npm を強制し、ワークスペースインストールをスキップします(アプリは 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 # 冪等: ENVパッチ + 登録; マシンがまだセットアップされていない場合は、自動的に `lt dev install` を最初に実行します
lt dev up # Caddy経由で https://<slug>.localhost の背後でAPI + Appを起動
# --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)
すべてのltプロジェクトを、Caddyを介して安定したHTTPS URL(<slug>.localhost、api.<slug>.localhost)で提供します。これにより、複数のプロジェクトが3000/3001で衝突したり、認証がクロスワイヤリングされたりすることなく、サイドバイサイドで実行できます。すべてのlt-monorepoまたはスタンドアロンAPI/Appプロジェクトでこれを使用してください。
lt dev install # マシンごとに1回: 専用のLaunchAgent/systemdユニット + Caddyfileスタブ + CAリマインダーをブートストラップします
lt dev uninstall [--purge] # lt-devサービスを削除(--purge はCaddyfile + ログも削除)
lt dev init # プロジェクトごとに1回(冪等): ENVパッチ + 登録
lt dev up # Caddyの背後でAPI + Appを起動
lt dev down # プロセスを停止 + Caddyブロックを削除(アイソレートされたテストスタックも破棄)
lt dev test # アイソレートされたPlaywright E2E: 並列スタック + 専用 `<slug>-test` DB、自動後片付け
lt dev test --shard # 2つのアイソレートされたスタック全体でシャーディング(デフォルト — 安定したスイートスポット)
lt dev test --shard 3 # N個のアイソレートされたスタック全体でシャーディング(それぞれ独自のポート/Caddy/DB `<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— マシンごとに1回。caddyがPATHにあることを確認し(ない場合はbrew install caddyを提案)、~/.lenneTech/Caddyfileスタブを作成し、専用のLaunchAgent(macOS、~/Library/LaunchAgents/tech.lenne.lt-dev-caddy.plist)またはsystemd-userユニット(Linux)を書き込み、ブートストラップします。Caddy管理エンドポイント(:2019)が応答するまで最大8秒待機し、ファイルを検証し、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) — 冪等。プロジェクトIDを構築し(スラグ =package.jsonの「name」、モノレポレイアウトからのサブドメイン)、レガシーなハードコードされたport: 3000/port: 3001/ Vite-proxyターゲット / Playwright URLを環境認識可能なバリアントにパッチし(デフォルトは維持)、~/.lenneTech/projects.jsonに永続化し、「Local Development (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のみ、スタック独自のデータベースに対して、最初の起動時に所有者ロールとして作成されます。そのため、所有者は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ウォッチャーなど)もそれを受信するようにします。プロジェクトのCaddyブロックを削除し、リロードします。また、このプロジェクトのアイソレートされたテストスタック(lt dev test)もすべて破棄します。test— アイソレートされたE2E。2番目の並列スタック(<slug>-test.localhost/api.<slug>-test.localhost、独自のポート + Caddyブロック +.lt-dev/.env.testブリッジ)を専用のDB<slug>-test(開発用の<slug>-localやAPIテスト用の<slug>-e2eとは別)上に起動し、Playwrightスイートを実行し(グローバルセットアップは最初のテストの前にそのDBを1回リセット)、その後残骸なしで自動後片付けを行います。開発セッションと並行して実行され、開発セッションには決して触れません。--keepはそのままにします。lt dev test downで停止します。--apiは代わりに(すでにアイソレートされた)APIテストを実行します。--debug= PWDEBUG+headed。-- <args>はPlaywrightに転送されます。--shard Nはスイートを並列でN個の完全にアイソレートされたスタック(それぞれ独自のポート + Caddyブロック + DB<slug>-test-<i>)+ N個の--shard=i/NPlaywrightプロセスに分割して実行します — ローカルCIパリティマトリックス。単に--shardはデフォルトで2になります(安定したスイートスポット: N≥3は一般的な開発マシンでパフォーマンスコアを過剰サブスクライブし、不安定になります)。--shard autoはCPU+RAMからNをサイジングします(控えめ)。ローカルシャードは1台のマシンを共有します(CIのシャードごとのコンテナとは異なります)。そのため、CLIはLT_DEV_TEST_SHARDSをエクスポートし、プロジェクトのplaywright.configがその負荷の下でのみタイムアウトを緩和できるようにします(CIは高速のまま)。lt dev test downはすべてのシャードを回収します。このアイソレートされたセッションを出荷するlt CLIバージョンが必要です。status/status --all— 現在のプロジェクト: サブドメイン → アップストリームポート、DB 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-header <slug>.localhost --no-tls-verify。公開*.trycloudflare.comURL(5-10秒)を出力し、Ctrl-Cまで実行されます。デフォルトではAppを公開します。--apiはターゲットを切り替えます。localhostドメインの認証CookieはトンネルURLでは有効ではありません。ログインフローを成功させるには、トンネルURLをBetter-AuthのtrustedOriginsに追加してください。完全な外部使用のために、並行して2番目のlt dev tunnel --apiを開始します。
起動バイナリのオーバーライドは LT_PNPM_BIN を介して行います(例: ラッパースクリプトを介したbunベースのプロジェクト用)。
lt ticket — 並列チケット開発環境
1つのプロジェクトの複数のチケット/機能に同時に取り組みます。それぞれが独自のgit worktree + 独自のアイソレートされた lt dev スタック(独自のURL、ポート、Caddyブロック、空のDB)を持つため、複数のチケットをブラウザテストおよびE2Eテストで並行して、相互影響なしにテストできます。
lt ticket start DEV-2200 # worktree(ブランチ feat/DEV-2200、origin/dev から)+ pnpm install + lt dev up
...(翻訳のため省略)