plugins/lt-dev/skills/contributing-to-lt-framework/SKILL.md
Guides local development on the lenne.tech framework libraries themselves (@lenne.tech/nest-server and @lenne.tech/nuxt-extensions) and validation of those changes from within a consuming starter project. Covers the pnpm link workflow for both frameworks, expected repository layouts, build/watch commands, rollback, and the handoff to the upstream contribution agents. Activates when the user mentions "modify nest-server", "change nuxt-extensions", "pnpm link", "test framework locally", "develop lt framework", "contribute to nest-server", "contribute to nuxt-extensions", or wants to iterate on framework source while exercising it in nest-server-starter / nuxt-base-starter. NOT for consuming frameworks inside a project (use generating-nest-servers or developing-lt-frontend). NOT for vendored-core workflows inside projects (use nest-server-core-vendoring or nuxt-extensions-core-vendoring). NOT for npm version upgrades (use nest-server-updating).
npx skillsauth add lennetech/claude-code contributing-to-lt-frameworkInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Framework-level development happens in the framework repositories, not in consuming application code. This skill covers the round-trip: edit framework source → link into a starter → run/test → unlink → prepare an upstream contribution.
@lenne.tech/nest-server or @lenne.tech/nuxt-extensions source codenest-server-starter or nuxt-base-starterpnpm link between a framework repo and a starternest-server or nuxt-extensions| User Intent | Correct Skill |
|-------------|---------------|
| "Modify @lenne.tech/nest-server itself" | THIS SKILL |
| "Change @lenne.tech/nuxt-extensions source" | THIS SKILL |
| "Link framework locally for testing" | THIS SKILL |
| "Build a feature in my app" | generating-nest-servers / developing-lt-frontend |
| "Update nest-server version in my project" | nest-server-updating |
| "Sync vendored core from upstream" | nest-server-core-vendoring / nuxt-extensions-core-vendoring |
| "Open a PR with my vendored-core change" | nest-server-core-vendoring → nest-server-core-contributor agent |
Four git repositories must be available locally on the user's machine, all cloned from github.com/lenneTech/:
| Repo | Role |
|------|------|
| nest-server | Backend framework source |
| nest-server-starter | Backend template that consumes @lenne.tech/nest-server |
| nuxt-extensions | Frontend framework source |
| nuxt-base-starter | Frontend template that consumes @lenne.tech/nuxt-extensions |
The exact filesystem location is user-specific (e.g. side-by-side sibling directories). Ask the user for the paths at the start of the workflow, or detect them via shell history / common parent directories. All commands below use $FRAMEWORK_DIR and $STARTER_DIR as placeholders — resolve them to the user's actual paths before execution.
@lenne.tech/nest-server)Let $FRAMEWORK_DIR = path to the nest-server clone and $STARTER_DIR = path to the nest-server-starter clone.
# In the framework repo
cd "$FRAMEWORK_DIR"
pnpm install
pnpm build # TS → JS output in dist/
pnpm link --global # register globally
# In the starter
cd "$STARTER_DIR"
pnpm link --global @lenne.tech/nest-server
# Framework side: rebuild on change
cd "$FRAMEWORK_DIR"
pnpm build --watch
# Starter side: prefer lt dev up — it serves under stable HTTPS URLs
# and won't collide with other parallel lt sessions on 3000/3001.
cd "$STARTER_DIR"
lt dev up # starts nest-server-starter behind Caddy under https://api.<slug>.localhost
# or (non-lt fallback): pnpm dev # default port 3000
Use run_in_background: true for pnpm build --watch. Clean up with pkill -f "build --watch" when done. For the starter dev server, prefer lt dev up/lt dev down — see managing-dev-servers skill.
pnpm testBASE_URL/APP_URL (set automatically by lt dev up) propagate correctly. Auth is bound to those env vars, not to fixed port numbers — see managing-dev-servers skill.cd "$STARTER_DIR"
pnpm unlink --global @lenne.tech/nest-server
pnpm install # restore the published dependency
$FRAMEWORK_DIRlenneTech/nest-server@lenne.tech/nuxt-extensions)Let $FRAMEWORK_DIR = path to the nuxt-extensions clone and $STARTER_DIR = path to the nuxt-base-starter clone.
cd "$FRAMEWORK_DIR"
pnpm install
pnpm build # Nuxt module build
pnpm link --global
cd "$STARTER_DIR"
pnpm link --global @lenne.tech/nuxt-extensions
# Framework side: rebuild on change (or rely on Nuxt HMR if the module supports it)
cd "$FRAMEWORK_DIR"
pnpm dev # framework dev mode, if available
# otherwise: pnpm build --watch
# Starter side
cd "$STARTER_DIR"
lt dev up # starts nuxt-base-starter behind Caddy under https://<slug>.localhost
# or (non-lt fallback): pnpm dev # default port 3001
Same dev-server lifecycle rules apply — prefer lt dev up/down, use run_in_background: true + pkill for the framework pnpm build --watch side.
lt dev up in the api workspace starts it under https://api.<slug>.localhost and exports NUXT_API_URL for the app.cd "$STARTER_DIR"
pnpm unlink --global @lenne.tech/nuxt-extensions
pnpm install
$FRAMEWORK_DIRlenneTech/nuxt-extensionspnpm build was not re-run or --watch is not active. Fix: verify the build output timestamp under dist/.package.json version locally or adjust peer ranges for the test cycle (do NOT commit starter-side peer-range changes from this workflow).pnpm why @lenne.tech/nest-server.lt dev status --all to see which project owns it, then lt dev down in that project (or pkill the process for non-lt projects).Skills:
using-lt-cli — for scaffolding starters via lt fullstack initgenerating-nest-servers — when the framework change requires reference to NestJS patternsdeveloping-lt-frontend — when the framework change requires reference to Nuxt patternsnest-server-core-vendoring / nuxt-extensions-core-vendoring — for the different pattern where framework source lives inside a projectmanaging-dev-servers — lifecycle rules for all long-running processes started in this workflowAgents for upstream contribution from a vendored project (not this workflow, but adjacent):
nest-server-core-contributor — extracts local vendored-core changes into a framework PRnuxt-extensions-core-contributor — same, for the frontend frameworkdevelopment
Single source of truth for the lenne.tech fullstack production-readiness checklist. Defines the eight pillars (configuration & secrets, observability & logging, health & lifecycle, security hardening, data durability, resilience under load, deployment hygiene, runbook & rollback) with concrete file/line evidence requirements per pillar, severity classification (Critical / Major / Minor), and a canonical machine-parseable report block. Activates whenever an agent or command needs to gate a release on production-readiness — currently used by /lt-dev:production-ready, lt-dev:production-readiness-orchestrator, and the devops-reviewer (read-only). NOT for OWASP-style code-level security review (use security-reviewer). NOT for npm dependency audits (use maintaining-npm-packages).
development
Single source of truth for executing GitLab CI/CD pipelines locally with the same image, env vars, and service containers as the real runner — so pipeline failures are caught before push. Defines pipeline discovery (.gitlab-ci.yml + includes), per-job execution via gitlab-runner exec, service-container orchestration (Mongo, Redis, MailHog), env injection without secrets, cache/artifact handling, and a job-by-job verdict report. Also describes the GitHub Actions equivalent via act for projects that mirror to GitHub. Activates whenever an agent or command needs to validate that the CI pipeline will pass — currently used by /lt-dev:production-ready and lt-dev:production-readiness-orchestrator. NOT for running the local check script (use running-check-script). NOT for writing or refactoring CI configs (use the devops agent).
development
Single source of truth for designing, running, and interpreting k6 load tests against lenne.tech fullstack APIs. Defines installation paths (brew, docker, npm), the three canonical scenarios (smoke / load / soak), endpoint discovery from the generated SDK, realistic Better-Auth login flows, threshold defaults for ~10 concurrent users (p95 < 500ms, error rate < 1%, http_req_failed < 1%), result interpretation, and the optimisation ladder when the system fails (DB indices, query rewrites, caching, connection pool sizing, rate-limit relaxation, payload trimming). Activates whenever an agent or command needs to validate that the API is stable for ~10 concurrent users performing many actions in short time, or to detect performance regressions via k6. Currently used by /lt-dev:production-ready, lt-dev:production-readiness-orchestrator, and lt-dev:performance-reviewer. NOT for Lighthouse frontend performance (use a11y-reviewer). NOT for unit performance assertions (use the test runner directly).
tools
Migrates lenne.tech projects from the legacy jest+eslint+prettier toolchain to the current vitest+oxlint+oxfmt baseline used by nest-server-starter and nuxt-base-starter. Covers swc decoratorMetadata config, the @Prop union-type fix for SWC, supertest default-import correction, ESM/CJS interop, the Nitro PORT-vs-NITRO_PORT bug, ANSI escape stripping in workspace runners (lerna/nx), free-port logic for check-server-start.sh, the offers-pattern config.env.ts (NSC__-only + fail-fast + auto-derived appUrl), and the multi-phase check-envs.sh smoke test. Activates whenever someone is migrating an existing project to the new toolchain, debugging "Cannot determine a type for the X field" Mongoose errors, ERR_SOCKET_BAD_PORT crashes from check-server-start, or wants to align an existing project with the current starter conventions.