@lenne.tech/cli
Version:
lenne.Tech CLI: lt
974 lines (796 loc) • 50.9 kB
Markdown
# lenne.tech Fullstack Ecosystem: CLI & lt-dev Plugin
Comprehensive reference for the `lt` CLI and the `lt-dev` Claude Code plugin, with focus on **vendor-mode workflows** for `@lenne.tech/nest-server` and `@lenne.tech/nuxt-extensions`.
## Table of Contents
- [Overview](#overview)
- [Architecture Diagram](#architecture-diagram)
- [lt CLI — Features](#lt-cli--features)
- [Project Scaffolding](#project-scaffolding)
- [Server Development](#server-development)
- [Frontend Development](#frontend-development)
- [Fullstack Workflows](#fullstack-workflows)
- [Vendor-Mode Conversion](#vendor-mode-conversion)
- [Status & Diagnostics](#status--diagnostics)
- [Additional Tools](#additional-tools)
- [lt-dev Plugin — Features](#lt-dev-plugin--features)
- [Commands](#commands)
- [Autonomous Agents](#autonomous-agents)
- [Skills (Knowledge Base)](#skills-knowledge-base)
- [Vendor-Mode Processes](#vendor-mode-processes)
- [1. Create a new project in vendor mode](#1-create-a-new-project-in-vendor-mode)
- [2. Backend: convert npm → vendor](#2-backend-convert-npm--vendor)
- [3. Frontend: convert npm → vendor](#3-frontend-convert-npm--vendor)
- [4. Backend: vendor → npm rollback](#4-backend-vendor--npm-rollback)
- [5. Frontend: vendor → npm rollback](#5-frontend-vendor--npm-rollback)
- [6. Update workflows](#6-update-workflows)
- [7. Upstream contribution](#7-upstream-contribution)
- [Decision Matrix](#decision-matrix)
- [Glossary](#glossary)
## Overview
The lenne.tech ecosystem consists of two complementary tools:
- **`lt CLI`** (`@lenne.tech/cli`) — Terminal tool for scaffolding, code generation, status, and mode conversion
- **`lt-dev` Plugin** — Claude Code plugin providing commands, autonomous agents, and skills for intelligent development workflows
Both tools support the **vendor mode** as a pilot for `@lenne.tech/nest-server` (backend) and `@lenne.tech/nuxt-extensions` (frontend). In vendor mode, the framework code is copied directly into the project as source code under `src/core/` (backend) or `app/core/` (frontend) — without an npm dependency.
## Architecture Diagram
```
┌─────────────────────────────────────────────────────────────────────┐
│ Developer / Claude Code │
└─────────┬────────────────────────────────────────────────┬──────────┘
│ │
│ Terminal │ Slash commands
▼ ▼
┌──────────────────────┐ ┌────────────────────────┐
│ lt CLI │ │ lt-dev Plugin │
│ │ │ │
│ • Scaffolding │ │ • Commands │
│ • Mode conversion │◄─── invoked by ──────┤ • Agents │
│ • Code generation │ │ • Skills │
│ • Status/diagnosis │ │ │
└──────────┬───────────┘ └────────────┬───────────┘
│ │
│ writes to │ operates on
▼ ▼
┌─────────────────────────────────────────────────────────────────────┐
│ Fullstack Project │
│ │
│ projects/api (Backend — NestJS) projects/app (Frontend) │
│ ├── npm mode: @lenne.tech/nest-server ├── npm mode: @lenne.tech/ │
│ │ in package.json │ nuxt-extensions │
│ └── vendor mode: src/core/ + VENDOR.md └── vendor mode: app/core/ │
│ + VENDOR.md │
└─────────────────────────────────────────────────────────────────────┘
▲ ▲
│ syncs from │ syncs from
│ │
┌──────────┴──────────────┐ ┌───────────┴────────────┐
│ github.com/lenneTech/ │ │ github.com/lenneTech/ │
│ nest-server │ │ nuxt-extensions │
│ nest-server-starter │ │ nuxt-base-starter │
└─────────────────────────┘ └────────────────────────┘
```
## lt CLI — Features
### Project Scaffolding
| Command | Purpose |
|---------|---------|
| `lt fullstack init` | Create a new monorepo with API + frontend. Supports npm and vendor mode for both sides |
| `lt frontend nuxt` | Standalone Nuxt 4 project from `nuxt-base-starter` |
| `lt frontend angular` | Standalone Angular project from `ng-base-starter` |
| `lt server create` | Standalone NestJS project from `nest-server-starter` |
| `lt starter chrome-extension` | Chrome extension starter |
| `lt cli create` | New CLI project via Gluegun |
| `lt typescript create` | TypeScript library starter |
**Fullstack init with vendor modes:**
```bash
lt fullstack init \
--name my-project \
--frontend nuxt \
--api-mode Rest \
--framework-mode vendor \
--frontend-framework-mode vendor \
--framework-upstream-branch 11.24.3 \
--noConfirm
```
Flags:
- `--framework-mode npm|vendor` — Backend mode
- `--frontend-framework-mode npm|vendor` — Frontend mode
- `--framework-upstream-branch <tag>` — Specific nest-server version for vendor
- `--dry-run` — Show plan without making changes
- `--next` — **Experimental:** clone [`nest-base`](https://github.com/lenneTech/nest-base) (Bun + Prisma 7 + Postgres + Better-Auth) for the API instead of `nest-server-starter`. Forces `--api-mode Rest`, `--framework-mode npm`, and skips workspace install (run `pnpm install` for app and `bun install` for api manually). Downstream `lt server module/object/addProp/test/permissions` are NOT compatible with the resulting layout.
### Server Development
| Command | Purpose |
|---------|---------|
| `lt server module` | Generate a NestJS module (model, service, controller, resolver, tests) |
| `lt server object` | Generate an input/output type |
| `lt server add-property` | Add a property to an existing module |
| `lt server test` | Generate E2E tests for a module |
| `lt server permissions` | Analyze all `@Roles`/`@Restricted` decorators, generate report (md/json/html) |
| `lt server create-secret` | Generate secure secrets for `.env` |
| `lt server set-secrets` | Set secrets in the project |
| **`lt server convert-mode`** | **Convert backend between npm and vendor mode** |
All code generators are **mode-aware**: In vendor mode they use relative paths to `src/core/`; in npm mode they use the bare specifier `@lenne.tech/nest-server`.
### Frontend Development
| Command | Purpose |
|---------|---------|
| `lt frontend nuxt` | Create Nuxt project from starter |
| `lt frontend angular` | Create Angular project from starter |
| **`lt frontend convert-mode`** | **Convert frontend between npm and vendor mode** |
### Fullstack Workflows
| Command | Purpose |
|---------|---------|
| `lt fullstack init` | Create fullstack monorepo (see above) |
| `lt fullstack update` | Show mode-specific update instructions for backend AND frontend |
| **`lt fullstack convert-mode`** | **Convert backend AND frontend between npm and vendor mode in a single command** |
**Fullstack mode conversion in one command:**
```bash
# Both subprojects to vendor mode
lt fullstack convert-mode --to vendor --noConfirm
# With specific upstream versions
lt fullstack convert-mode --to vendor \
--framework-upstream-branch 11.24.3 \
--frontend-framework-upstream-branch 1.5.3 \
--noConfirm
# Both back to npm
lt fullstack convert-mode --to npm --noConfirm
# Only convert backend
lt fullstack convert-mode --to vendor --skip-frontend --noConfirm
# Only convert frontend
lt fullstack convert-mode --to vendor --skip-backend --noConfirm
# Dry-run (plan without changes)
lt fullstack convert-mode --to vendor --dry-run
```
The command automatically locates `projects/api/` and `projects/app/` (or `packages/api` / `packages/app`), detects the current modes, shows a plan, and then orchestrates the conversion of both sides using the appropriate helper methods.
### Vendor-Mode Conversion
**Backend**: `lt server convert-mode`
```bash
# npm → vendor
cd projects/api
lt server convert-mode --to vendor --upstream-branch 11.24.3 --noConfirm
# vendor → npm
lt server convert-mode --to npm --version 11.24.3 --noConfirm
# Dry-run (plan without changes)
lt server convert-mode --to vendor --dry-run
```
**Frontend**: `lt frontend convert-mode`
```bash
# npm → vendor
cd projects/app
lt frontend convert-mode --to vendor --upstream-branch 1.5.3 --noConfirm
# vendor → npm
lt frontend convert-mode --to npm --version 1.5.3 --noConfirm
# Dry-run
lt frontend convert-mode --to vendor --dry-run
```
Both commands clone the respective upstream repo into `/tmp/`, perform the code transformation, and clean up at the end. **No local paths** are required.
### Status & Diagnostics
| Command | Purpose |
|---------|---------|
| `lt status` | Shows project type, framework mode (backend + frontend), config, git branch, versions. At the monorepo root, both subprojects are automatically scanned |
| `lt doctor` | Checks environment, versions, dependencies |
| `lt history` | Shows CLI command history |
**Example at the monorepo root:**
```
Monorepo Subprojects:
Backend: projects/api → vendor (src/core/, VENDOR.md)
Frontend: projects/app → vendor (app/core/, VENDOR.md)
```
### Additional Tools
| Area | Commands |
|------|----------|
| **Config** | `lt config init`, `lt config validate`, `lt config show`, `lt config help` |
| **Git** | `lt git create`, `git get`, `git update`, `git clean`, `git squash`, `git rebase`, `git rename`, `git reset`, `git undo`, `git clear`, `git force-pull` |
| **NPM** | `lt npm reinit` |
| **MongoDB** | `lt mongodb collection-export`, `mongodb s3-restore` |
| **Qdrant** | `lt qdrant stats`, `qdrant delete` |
| **Directus** | `lt directus docker-setup`, `directus typegen`, `directus remove` |
| **Deployment** | `lt deployment create` (GitHub/GitLab pipelines) |
| **Blocks/Components** | `lt blocks add`, `lt components add` |
| **Tools** | `lt tools regex`, `tools sha256`, `tools jwt-read`, `tools crypt`, `tools install-scripts` |
| **Docs** | `lt docs open` |
| **Claude** | `lt claude shortcuts`, `lt claude plugins` |
| **Templates** | `lt templates llm` |
## lt-dev Plugin — Features
The `lt-dev` Claude Code plugin provides **Commands** (user-invocable), **Agents** (autonomous execution), and **Skills** (knowledge bases).
### Commands
#### Backend
| Command | Purpose |
|---------|---------|
| `/lt-dev:backend:update-nest-server` | Update `@lenne.tech/nest-server` in npm mode with migration guides |
| `/lt-dev:backend:update-nest-server-core` | Sync vendored `src/core/` with upstream (vendor mode) |
| `/lt-dev:backend:convert-to-vendor` | Convert existing project from npm → vendor (incl. migration guides) |
| `/lt-dev:backend:convert-to-npm` | Convert vendored project back to npm |
| `/lt-dev:backend:contribute-nest-server-core` | Prepare local patches as upstream PR for nest-server |
| `/lt-dev:backend:sec-audit` | Security audit of backend code |
| `/lt-dev:backend:sec-review` | Security review of a specific code area |
| `/lt-dev:backend:test-generate` | Generate E2E tests |
| `/lt-dev:backend:code-cleanup` | Clean up code (imports, formatting) |
#### Frontend
| Command | Purpose |
|---------|---------|
| `/lt-dev:frontend:update-nuxt-extensions-core` | Sync vendored `app/core/` with upstream |
| `/lt-dev:frontend:convert-to-vendor` | Convert frontend project from npm → vendor |
| `/lt-dev:frontend:convert-to-npm` | Convert vendored frontend back to npm |
| `/lt-dev:frontend:contribute-nuxt-extensions-core` | Prepare local patches as upstream PR for nuxt-extensions |
| `/lt-dev:frontend:figma-init` | Initialize Figma Code Connect setup |
| `/lt-dev:frontend:figma-research` | Analyze Figma designs for implementation |
| `/lt-dev:frontend:figma-to-code` | Translate Figma design into Vue/Nuxt code |
| `/lt-dev:frontend:env-migrate` | Migrate `.env` from old standards |
| `/lt-dev:frontend:init-conventions` | Initialize frontend conventions |
#### Fullstack
| Command | Purpose |
|---------|---------|
| **`/lt-dev:fullstack:update-all`** | **Comprehensive update**: backend + frontend (mode-aware) + package maintenance + CLAUDE.md sync + validation |
| `/lt-dev:fullstack:update` | Simple backend + frontend update (legacy, less comprehensive) |
| `/lt-dev:fullstack:sync-claude-md` | Sync `CLAUDE.md` from upstream starter templates |
#### Maintenance
| Command | Purpose |
|---------|---------|
| `/lt-dev:maintenance:maintain` | FULL MODE: package update + audit + security + deduplication |
| `/lt-dev:maintenance:maintain-check` | DRY-RUN: analysis without changes |
| `/lt-dev:maintenance:maintain-security` | Security patches only |
| `/lt-dev:maintenance:maintain-pre-release` | Conservative patch-only before release |
| `/lt-dev:maintenance:maintain-post-feature` | Post-feature cleanup |
#### Git
| Command | Purpose |
|---------|---------|
| `/lt-dev:git:commit-message` | Generate conventional commit message from staging |
| `/lt-dev:git:create-request` | Create merge request with descriptive body |
| `/lt-dev:git:mr-description` | Generate MR description from commits |
| `/lt-dev:git:mr-description-clipboard` | Same, copied to clipboard |
| `/lt-dev:git:rebase` | Rebase onto development branch with conflict resolution |
| `/lt-dev:git:rebase-mrs` | Rebase multiple MRs sequentially |
#### Docker
| Command | Purpose |
|---------|---------|
| `/lt-dev:docker:gen-setup` | Generate Docker configuration (Dockerfile + compose + .env) |
#### Plugin
| Command | Purpose |
|---------|---------|
| `/lt-dev:plugin:check` | Validate the plugin setup after context loss |
| `/lt-dev:plugin:element` | Interactive creation of new plugin elements |
#### Vibe (Spec-Driven Development)
| Command | Purpose |
|---------|---------|
| `/lt-dev:vibe:plan` | Create implementation plan from requirement |
| `/lt-dev:vibe:build` | Implement according to plan |
| `/lt-dev:vibe:build-plan` | Plan + build in one flow |
#### Standalone
| Command | Purpose |
|---------|---------|
| `/lt-dev:debug` | Structured debugging session |
| `/lt-dev:review` | Code review with multiple reviewer perspectives |
| `/lt-dev:refactor-frontend` | Frontend refactoring helper |
| `/lt-dev:resolve-ticket` | Implement Linear ticket |
| `/lt-dev:create-ticket` | Create Linear ticket |
| `/lt-dev:create-story` | Create user story (German) |
| `/lt-dev:create-task` | Create Linear task |
| `/lt-dev:create-bug` | Create Linear bug |
| `/lt-dev:linear-comment` | Create Linear comment |
| `/lt-dev:dev-submit` | Dev-submit workflow (commit + push + MR) |
| `/lt-dev:interview` | Structured interview for requirements |
| `/lt-dev:skill-optimize` | Optimize a plugin skill |
| `/lt-dev:spec-to-tasks` | Spec → task list |
### Autonomous Agents
Autonomous agents perform multi-step tasks without interaction. They are spawned via commands or the Agent tool.
#### Vendor-Mode Agents
| Agent | Purpose | Spawned by |
|-------|---------|------------|
| `vendor-mode-converter` | Backend npm → vendor conversion incl. migration guides | `/lt-dev:backend:convert-to-vendor` |
| `vendor-mode-converter-frontend` | Frontend npm → vendor conversion incl. changelog | `/lt-dev:frontend:convert-to-vendor` |
| `nest-server-core-updater` | Upstream sync for vendored nest-server core | `/lt-dev:backend:update-nest-server-core` |
| `nuxt-extensions-core-updater` | Upstream sync for vendored nuxt-extensions core | `/lt-dev:frontend:update-nuxt-extensions-core` |
| `nest-server-core-contributor` | Upstream PR drafts from local backend patches | `/lt-dev:backend:contribute-nest-server-core` |
| `nuxt-extensions-core-contributor` | Upstream PR drafts from local frontend patches | `/lt-dev:frontend:contribute-nuxt-extensions-core` |
#### Update Agents
| Agent | Purpose |
|-------|---------|
| `nest-server-updater` | npm-mode update of nest-server incl. migration guides |
| `fullstack-updater` | Coordinated backend + frontend update (legacy) |
| `npm-package-maintainer` | Package optimization (5 modes) |
| `branch-rebaser` | Rebase automation with conflict resolution |
#### Development Agents
| Agent | Purpose |
|-------|---------|
| `backend-dev` | Autonomous NestJS development |
| `frontend-dev` | Autonomous Nuxt 4 development |
| `architect` | Architecture planning with stack enforcement |
| `devops` | Docker, CI/CD, environment |
#### Reviewer Agents
| Agent | Purpose |
|-------|---------|
| `code-reviewer` | 6-dimension code review |
| `backend-reviewer` | NestJS-specific |
| `frontend-reviewer` | Vue/Nuxt-specific |
| `security-reviewer` | OWASP-aligned |
| `a11y-reviewer` | Accessibility + Lighthouse |
| `ux-reviewer` | UX patterns |
| `performance-reviewer` | Bundle, queries, caching |
| `devops-reviewer` | Docker, CI/CD security |
| `docs-reviewer` | README, JSDoc, migration guides |
| `test-reviewer` | Test coverage + quality |
### Skills (Knowledge Base)
Skills contain structured knowledge and are automatically activated on matching queries.
| Skill | Purpose |
|-------|---------|
| **`nest-server-core-vendoring`** | Backend vendoring pattern, flatten-fix, sync workflows |
| **`nuxt-extensions-core-vendoring`** | Frontend vendoring pattern, nuxt.config rewrite, sync |
| `nest-server-updating` | npm-mode update processes, migration guides, error patterns |
| `generating-nest-servers` | Generate NestJS modules/services/controllers |
| `developing-lt-frontend` | Nuxt 4 development, composables, forms, auth |
| `maintaining-npm-packages` | Dependency optimization (5 modes) |
| `using-lt-cli` | lt CLI reference, conventions |
| `developing-claude-plugins` | Plugin development (skills, commands, agents) |
| `coordinating-agent-teams` | Agent team coordination, parallelism |
| `building-stories-with-tdd` | TDD workflow for user stories |
| `rebasing-branches` | Rebase strategies with conflict resolution |
| `general-frontend-security` | OWASP frontend security |
## Vendor-Mode Processes
### 1. Create a new project in vendor mode
```
┌────────────────────────────────────────────────────────────────┐
│ DEVELOPER │
│ │
│ lt fullstack init │
│ --name my-project │
│ --frontend nuxt │
│ --api-mode Rest │
│ --framework-mode vendor ← Backend vendored │
│ --frontend-framework-mode vendor ← Frontend vendored │
│ --framework-upstream-branch 11.24.3 │
│ --noConfirm │
│ │
└───────────────────────┬────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────┐
│ lt CLI performs: │
│ │
│ 1. git clone lt-monorepo │
│ 2. setup frontend (nuxt-base-starter) │
│ 3. setup backend (nest-server-starter) │
│ 4. convertCloneToVendored (backend): │
│ - clone nest-server 11.24.3 → /tmp │
│ - copy src/core/, index.ts, core.module.ts, etc. │
│ - apply flatten-fix (4 edge cases) │
│ - rewrite consumer imports (@lenne.tech/nest-server → ../) │
│ - merge upstream deps dynamically │
│ - apply express type-imports fix │
│ - create src/core/VENDOR.md │
│ - prepend vendor notice to CLAUDE.md │
│ 5. convertAppCloneToVendored (frontend): │
│ - clone nuxt-extensions 1.5.3 → /tmp │
│ - copy src/module.ts + src/runtime/ │
│ - rewrite nuxt.config.ts modules[] entry │
│ - rewrite consumer imports (4 files) │
│ - remove @lenne.tech/nuxt-extensions dep │
│ - create app/core/VENDOR.md │
│ - prepend vendor notice to CLAUDE.md │
│ 6. pnpm install (monorepo) │
│ 7. git init + initial commit │
│ │
└────────────────────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────┐
│ PROJECT READY │
│ │
│ my-project/ │
│ ├── projects/ │
│ │ ├── api/ │
│ │ │ ├── src/ │
│ │ │ │ ├── core/ ← Vendored nest-server │
│ │ │ │ │ └── VENDOR.md │
│ │ │ │ ├── server/ ← Project code │
│ │ │ │ └── main.ts │
│ │ │ ├── bin/migrate.js │
│ │ │ └── package.json (no @lenne.tech/nest-server) │
│ │ └── app/ │
│ │ ├── app/ │
│ │ │ ├── core/ ← Vendored nuxt-extensions │
│ │ │ │ ├── module.ts │
│ │ │ │ ├── runtime/ │
│ │ │ │ └── VENDOR.md │
│ │ │ └── ... │
│ │ ├── nuxt.config.ts (modules: ['./app/core/module']) │
│ │ └── package.json (no @lenne.tech/nuxt-extensions) │
│ └── CLAUDE.md │
└────────────────────────────────────────────────────────────────┘
```
**Alternative**: Only backend OR only frontend vendored. Omit the respective flag:
```bash
# Only backend vendored, frontend stays npm
lt fullstack init --name my-project --frontend nuxt --api-mode Rest \
--framework-mode vendor --framework-upstream-branch 11.24.3 --noConfirm
# Only frontend vendored, backend stays npm
lt fullstack init --name my-project --frontend nuxt --api-mode Rest \
--frontend-framework-mode vendor --noConfirm
```
### 2. Backend: convert npm → vendor
**Starting point**: Existing project in npm mode (`@lenne.tech/nest-server` in `package.json`).
```
┌──────────────────────────────────────────────────────────┐
│ DEVELOPER in projects/api/ │
│ │
│ Option A — Via Claude Code (with migration guides): │
│ /lt-dev:backend:convert-to-vendor │
│ │
│ Option B — Directly via CLI (no migration guides): │
│ lt server convert-mode --to vendor │
│ │
│ Option C — Dry-run (plan without changes): │
│ lt server convert-mode --to vendor --dry-run │
└─────────────┬────────────────────────────────────────────┘
│
▼ Option A uses agent
┌──────────────────────────────────────────────────────────┐
│ vendor-mode-converter agent │
│ │
│ Phase 0: Prerequisites │
│ - Verify npm mode │
│ - Verify NOT already vendored │
│ - Verify lt CLI available │
│ │
│ Phase 1: Version detection │
│ - SOURCE = current @lenne.tech/nest-server version │
│ - TARGET = latest (or specified) │
│ - Calculate version gap │
│ │
│ Phase 2: Migration-guide discovery │
│ - gh api lenneTech/nest-server/contents/migration- │
│ guides │
│ - Filter by from-version >= SOURCE, < TARGET │
│ - Build ordered migration plan │
│ │
│ Phase 3: CLI conversion │
│ - lt server convert-mode --to vendor │
│ --upstream-branch <TARGET> │
│ - Applies all transformations: │
│ • clone nest-server │
│ • copy + flatten-fix │
│ • rewrite imports │
│ • merge deps │
│ • express type-imports fix │
│ • VENDOR.md │
│ │
│ Phase 4: Migration application │
│ - Apply each migration guide in version order │
│ - Translate @lenne.tech/nest-server refs to relative │
│ paths │
│ │
│ Phase 5: Validation loop │
│ - tsc --noEmit │
│ - pnpm lint │
│ - pnpm test │
│ - Fix until green │
│ │
│ Phase 6: Report │
└──────────────────────────────────────────────────────────┘
```
### 3. Frontend: convert npm → vendor
**Starting point**: Existing Nuxt project in npm mode.
```
┌──────────────────────────────────────────────────────────┐
│ DEVELOPER in projects/app/ │
│ │
│ Option A — Via Claude Code (with changelog): │
│ /lt-dev:frontend:convert-to-vendor │
│ │
│ Option B — Directly via CLI: │
│ lt frontend convert-mode --to vendor │
│ │
│ Option C — Dry-run: │
│ lt frontend convert-mode --to vendor --dry-run │
└─────────────┬────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ vendor-mode-converter-frontend agent (Option A) │
│ │
│ Phase 0: Prerequisites │
│ Phase 1: Version detection │
│ - SOURCE = current @lenne.tech/nuxt-extensions │
│ - TARGET = latest │
│ │
│ Phase 2: Changelog discovery │
│ - Fetch CHANGELOG.md from nuxt-extensions repo │
│ - Fetch GitHub releases for version gap │
│ │
│ Phase 3: CLI conversion │
│ - lt frontend convert-mode --to vendor │
│ --upstream-branch <TARGET> │
│ - Transformations: │
│ • clone nuxt-extensions │
│ • copy src/module.ts + src/runtime/ │
│ • rewrite nuxt.config.ts │
│ • rewrite 4 explicit consumer imports │
│ • remove @lenne.tech/nuxt-extensions dep │
│ • VENDOR.md │
│ │
│ Phase 4: Changelog application │
│ - Apply breaking changes from changelog │
│ │
│ Phase 5: Validation │
│ - nuxt build │
│ - pnpm lint │
│ │
│ Phase 6: Report │
└──────────────────────────────────────────────────────────┘
```
### 4. Backend: vendor → npm rollback
**Starting point**: Project in vendor mode (`src/core/VENDOR.md` exists).
```
┌──────────────────────────────────────────────────────────┐
│ DEVELOPER in projects/api/ │
│ │
│ Option A — Via Claude Code: │
│ /lt-dev:backend:convert-to-npm │
│ │
│ Option B — Directly via CLI: │
│ lt server convert-mode --to npm │
│ │
│ With specific version: │
│ lt server convert-mode --to npm --version 11.24.3 │
└─────────────┬────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ lt CLI performs: │
│ │
│ 1. Read baseline version from src/core/VENDOR.md │
│ 2. Warn if local patches exist in VENDOR.md │
│ → Hint: /lt-dev:backend:contribute-nest-server-core │
│ should be run FIRST to upstream them │
│ 3. Rewrite consumer imports: │
│ relative paths → @lenne.tech/nest-server │
│ 4. Delete src/core/ │
│ 5. Restore @lenne.tech/nest-server dep │
│ 6. Restore migrate:* scripts to node_modules paths │
│ 7. Remove vendor artifacts: │
│ - bin/migrate.js │
│ - migrations-utils/ts-compiler.js │
│ - migration-guides/ │
│ 8. Remove CLAUDE.md vendor marker block │
│ 9. Post-verification: scan for stale relative imports │
└──────────────────────────────────────────────────────────┘
```
**⚠️ Warning before rollback:**
Before a `convert-to-npm`, all substantial local patches in the vendored core should be **contributed upstream** via `/lt-dev:backend:contribute-nest-server-core` — otherwise they will be lost.
### 5. Frontend: vendor → npm rollback
```
┌──────────────────────────────────────────────────────────┐
│ DEVELOPER in projects/app/ │
│ │
│ Option A — Via Claude Code: │
│ /lt-dev:frontend:convert-to-npm │
│ │
│ Option B — Directly via CLI: │
│ lt frontend convert-mode --to npm │
│ │
│ With specific version: │
│ lt frontend convert-mode --to npm --version 1.5.3 │
└─────────────┬────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ lt CLI performs: │
│ │
│ 1. Read baseline version from app/core/VENDOR.md │
│ 2. Warn if local patches exist in VENDOR.md │
│ 3. Rewrite consumer imports: │
│ relative paths → @lenne.tech/nuxt-extensions │
│ 4. Delete app/core/ │
│ 5. Restore @lenne.tech/nuxt-extensions dep │
│ 6. Rewrite nuxt.config.ts: │
│ './app/core/module' → '@lenne.tech/nuxt-extensions' │
│ 7. Remove vendor-freshness script │
│ 8. Remove CLAUDE.md vendor marker block │
│ 9. Post-verification │
└──────────────────────────────────────────────────────────┘
```
### 6. Update workflows
The **recommended** path for all updates is `/lt-dev:fullstack:update-all`. It is mode-aware and orchestrates the appropriate agents automatically.
```
┌──────────────────────────────────────────────────────────────────┐
│ /lt-dev:fullstack:update-all │
│ │
│ Phase 1: Detect project structure + framework modes │
│ Backend: test -f <api>/src/core/VENDOR.md → vendor | npm │
│ Frontend: test -f <app>/app/core/VENDOR.md → vendor | npm │
│ │
│ Phase 2: Version analysis + UPDATE_PLAN.md + user approval │
│ │
│ Phase 3: Backend framework update │
│ IF npm: spawn lt-dev:nest-server-updater │
│ IF vendor: spawn lt-dev:nest-server-core-updater │
│ │
│ Phase 4: Frontend framework update │
│ IF npm: spawn lt-dev:fullstack-updater --skip-backend │
│ IF vendor: spawn lt-dev:nuxt-extensions-core-updater │
│ │
│ Phase 5: Package maintenance │
│ → spawn lt-dev:npm-package-maintainer (FULL MODE) │
│ (for backend AND frontend package.json) │
│ │
│ Phase 6: CLAUDE.md sync from upstream starters │
│ │
│ Phase 7: Cross-validation (build + lint + tests) │
│ │
│ Phase 8: Final report │
└──────────────────────────────────────────────────────────────────┘
```
**All 4 mode combinations are supported:**
| Backend | Frontend | Backend Agent | Frontend Agent |
|---------|----------|---------------|----------------|
| npm | npm | `nest-server-updater` | `fullstack-updater --skip-backend` |
| npm | vendor | `nest-server-updater` | `nuxt-extensions-core-updater` |
| vendor | npm | `nest-server-core-updater` | `fullstack-updater --skip-backend` |
| vendor | vendor | `nest-server-core-updater` | `nuxt-extensions-core-updater` |
**Skip flags:**
```bash
/lt-dev:fullstack:update-all --dry-run # Plan only
/lt-dev:fullstack:update-all --skip-backend # Frontend only
/lt-dev:fullstack:update-all --skip-frontend # Backend only
/lt-dev:fullstack:update-all --skip-packages # Framework only, no package maintenance
```
**Individual updates** (if you only need one part):
```bash
# Backend npm mode
/lt-dev:backend:update-nest-server
# Backend vendor mode
/lt-dev:backend:update-nest-server-core
# Frontend vendor mode
/lt-dev:frontend:update-nuxt-extensions-core
# Packages only
/lt-dev:maintenance:maintain
```
### 7. Upstream contribution
If you have made **generally useful** changes to the vendored core (bug fixes, features), they can be contributed back as pull requests to the upstream repo.
```
┌──────────────────────────────────────────────────────────┐
│ BACKEND: /lt-dev:backend:contribute-nest-server-core │
│ FRONTEND: /lt-dev:frontend:contribute-nuxt-extensions-core│
│ │
│ Phase 1: git log since VENDOR.md baseline │
│ Phase 2: Filter cosmetic commits (format, lint) │
│ Phase 3: Categorize: │
│ - upstream-candidate: generic bugfix, framework │
│ enhancement, type correction │
│ - project-specific: business rules, branding │
│ Phase 4: Clone upstream fresh + cherry-pick candidates │
│ Phase 5: Generate PR draft with motivation │
│ Phase 6: Present summary for human review │
│ │
│ Human: reviews + pushes PR via normal GitHub flow │
└──────────────────────────────────────────────────────────┘
```
After the PR is merged, the next `/lt-dev:backend:update-nest-server-core` or `/lt-dev:frontend:update-nuxt-extensions-core` run will recognize the patch as "upstream-delivered" and remove it from the VENDOR.md local-changes log.
## Decision Matrix
### When to use npm mode?
- ✅ Standard project without local framework modifications
- ✅ Fast updates via `pnpm update`
- ✅ Simpler CI/CD
- ✅ Smaller memory footprint in the repo
### When to use vendor mode?
- ✅ Claude Code should **understand** the framework code (better context comprehension)
- ✅ Local patches to the framework are required
- ✅ Upstream contributions should emerge from real development
- ✅ Debugging in framework code with source maps / original code
- ✅ Framework changes immediately testable without npm release cycle
- ⚠️ Requires occasional merge conflict handling during sync
- ⚠️ Longer test import phase (TypeScript source)
## Glossary
| Term | Meaning |
|------|---------|
| **npm mode** | Framework as `@lenne.tech/nest-server` / `@lenne.tech/nuxt-extensions` npm dependency |
| **Vendor mode** | Framework source copied into `src/core/` (backend) or `app/core/` (frontend) |
| **VENDOR.md** | Marker file in the vendored core with baseline version, sync history, local patches |
| **Flatten-fix** | Import path rewrites in 4 backend files after copying (backend only) |
| **Consumer-import codemod** | Rewrite of `@lenne.tech/nest-server` to relative paths in project code |
| **Upstream sync** | Pulling upstream changes into the vendored core |
| **Upstream contribution** | Pushing local patches as PR to the upstream repo |
| **Mode-aware** | Code that automatically chooses correct paths for npm or vendor |
| **Starter** | `nest-server-starter` / `nuxt-base-starter` — template repo with standard config |
## Sources & References
### GitHub repos
| Repo | URL |
|------|-----|
| lt CLI | https://github.com/lenneTech/cli |
| lt-dev Plugin | https://github.com/lenneTech/claude-code |
| nest-server framework | https://github.com/lenneTech/nest-server |
| nest-server starter | https://github.com/lenneTech/nest-server-starter |
| nuxt-extensions module | https://github.com/lenneTech/nuxt-extensions |
| nuxt-base starter | https://github.com/lenneTech/nuxt-base-starter |
| lt-monorepo template | https://github.com/lenneTech/lt-monorepo |
### Local documentation
- `cli/CLAUDE.md` — CLI internal documentation + vendor touchpoints table
- `cli/docs/commands.md` — CLI command reference
- `cli/docs/lt.config.md` — CLI config reference
- `cli/scripts/test-vendor-init.sh` — Backend vendor integration tests (4 scenarios × ~22 assertions)
- `cli/scripts/test-frontend-vendor-init.sh` — Frontend vendor integration tests (4 scenarios)
## Quick Reference — The Most Important Commands
```bash
# ═══════════════════════════════════════════════════════════════
# PROJECT SETUP
# ═══════════════════════════════════════════════════════════════
# New project (both in vendor mode)
lt fullstack init --name <n> --frontend nuxt --api-mode Rest \
--framework-mode vendor --frontend-framework-mode vendor --noConfirm
# New project (npm mode, standard)
lt fullstack init --name <n> --frontend nuxt --api-mode Rest --noConfirm
# Check status (shows both modes at monorepo root)
lt status
# ═══════════════════════════════════════════════════════════════
# CONVERSION — Fullstack (both subprojects in one step)
# ═══════════════════════════════════════════════════════════════
# Both subprojects: npm → vendor (from monorepo root)
lt fullstack convert-mode --to vendor --noConfirm
# Both subprojects: vendor → npm (rollback)
lt fullstack convert-mode --to npm --noConfirm
# With specific upstream versions
lt fullstack convert-mode --to vendor \
--framework-upstream-branch 11.24.3 \
--frontend-framework-upstream-branch 1.5.3 \
--noConfirm
# Only backend or only frontend
lt fullstack convert-mode --to vendor --skip-frontend --noConfirm
lt fullstack convert-mode --to vendor --skip-backend --noConfirm
# Dry-run (plan without changes)
lt fullstack convert-mode --to vendor --dry-run
# ═══════════════════════════════════════════════════════════════
# CONVERSION — Individual (in the respective subprojects)
# ═══════════════════════════════════════════════════════════════
# Backend: npm → vendor (with migrations via Claude Code)
/lt-dev:backend:convert-to-vendor
# Backend: npm → vendor (directly via CLI)
cd projects/api && lt server convert-mode --to vendor
# Frontend: npm → vendor (with changelog via Claude Code)
/lt-dev:frontend:convert-to-vendor
# Frontend: npm → vendor (directly via CLI)
cd projects/app && lt frontend convert-mode --to vendor
# Rollback individually
cd projects/api && lt server convert-mode --to npm
cd projects/app && lt frontend convert-mode --to npm
# ═══════════════════════════════════════════════════════════════
# UPDATES
# ═══════════════════════════════════════════════════════════════
# Comprehensive fullstack update (recommended, mode-aware)
/lt-dev:fullstack:update-all
# Backend only
/lt-dev:backend:update-nest-server # npm mode
/lt-dev:backend:update-nest-server-core # vendor mode
# Frontend only
/lt-dev:frontend:update-nuxt-extensions-core # vendor mode
# Packages only
/lt-dev:maintenance:maintain
# ═══════════════════════════════════════════════════════════════
# UPSTREAM CONTRIBUTION
# ═══════════════════════════════════════════════════════════════
# Backend: prepare local patches as PR
/lt-dev:backend:contribute-nest-server-core
# Frontend: prepare local patches as PR
/lt-dev:frontend:contribute-nuxt-extensions-core
```
*This file is intended as living documentation. It should be updated when new features are added to the lt CLI or lt-dev plugin.*