plugins/lt-dev/skills/nuxt-extensions-core-vendoring/SKILL.md
Provides knowledge and resources for projects that have vendored the @lenne.tech/nuxt-extensions module directly into their source tree (under app/core/ instead of consuming via npm). Covers the vendor model, the Upstream-to-Project sync workflow, the Project-to-Upstream PR workflow, typical conflicts, and how cosmetic changes are distinguished from substantial upstream candidates. Activates for vendored nuxt-extensions discussions, "sync frontend core from upstream", "port local frontend core change to upstream", conflict resolution during frontend vendor sync, or questions about the frontend vendor pattern. Delegates execution to lt-dev:nuxt-extensions-core-updater (for syncs) and lt-dev:nuxt-extensions-core-contributor (for upstream PR preparation). NOT for npm-based nuxt-extensions updates (use developing-lt-frontend). NOT for writing new Nuxt code (use developing-lt-frontend).
npx skillsauth add lennetech/claude-code nuxt-extensions-core-vendoringInstall 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.
v prefix — @lenne.tech/nuxt-extensions publishes tags like 7.19.0, not v7.19.0. Using v7.19.0 in git refs or changelog links produces 404s. This differs from @lenne.tech/nest-server which also drops the prefix but some tooling adds it back automatically.nuxt.config.ts module registration is NOT auto-handled on sync — When a new composable or module file is added upstream, the sync agent copies the file but does NOT register it in nuxt.config.ts. You must manually add the module reference after a sync, otherwise Nuxt does not expose the new functionality.app/core/ are auto-imported by Nuxt for composables and components, but explicitly imported types (e.g. import type { Foo } from '@lenne.tech/nuxt-extensions') need their paths rewritten to relative references after vendoring. This rewrite is not fully automated.app/core/ are invisible to future syncs — Same gotcha as nest-server-core-vendoring: the updater can't infer your intent. Document intentional local deviations in app/core/LOCAL-PATCHES.md.src/runtime/composables/use-lt-ai*.ts, src/runtime/lib/ai.ts, and src/runtime/types/ai.ts (~700 LoC). After sync, projects MUST add an ltExtensions.ai: { enabled, basePath } section to nuxt.config.ts — auto-imports do not work until the option is registered. Default option in upstream is enabled: true, so projects that never want AI should set enabled: false after the sync.app/core/. Rename map (apply via project-wide replace after sync): useLtAiSnippets → useLtAiPrompts, LtAiPromptSnippet → LtAiPrompt, LtAiPromptSnippetInput → LtAiPromptInput, LtAiPromptTemplate → LtAiSlot, LtAiPromptTemplateInput → LtAiSlotInput, UseLtAiSnippetsReturn → UseLtAiPromptsReturn. Additionally: the EXECUTION payload type for useLtAi.prompt() was renamed LtAiPromptInput → LtAiPromptRunInput (CRUD input keeps the conventional LtAiPromptInput name). Projects that synced a 1.6.x or earlier baseline are unaffected.This skill provides knowledge and resources for lenne.tech projects that have vendored the @lenne.tech/nuxt-extensions module into their source tree. For automated execution, use the matching agents:
lt-dev:nuxt-extensions-core-updater via /lt-dev:frontend:update-nuxt-extensions-core --
pulls upstream changes into the vendored core, with AI-driven curation against
local patcheslt-dev:nuxt-extensions-core-contributor via /lt-dev:frontend:contribute-nuxt-extensions-core --
identifies substantial local changes to the vendored core and prepares them as
Upstream-Pull-Requests to the nuxt-extensions repository| User Intent | Correct Skill | | ---------------------------------------------------------- | ------------------------------------- | | "Sync vendored frontend core from upstream 1.5.3" | THIS SKILL | | "Port this composable fix back to nuxt-extensions" | THIS SKILL | | "Update nuxt-extensions via npm" | developing-lt-frontend | | "Create a new Nuxt composable" | developing-lt-frontend | | "Fix a CVE via npm audit" | maintaining-npm-packages | | "Sync vendored backend core from upstream" | nest-server-core-vendoring | | "Modify @lenne.tech/nuxt-extensions itself and test via pnpm link" | contributing-to-lt-framework |
A project is considered vendored if all of the following are true:
app/core/VENDOR.md exists (in the frontend subproject root, e.g. projects/app/app/core/VENDOR.md)package.json does not list @lenne.tech/nuxt-extensions in
dependencies or devDependenciesapp/core/ contains the nuxt-extensions source (composables, components, plugins, etc.)A project is npm-based (classic) if:
@lenne.tech/nuxt-extensions is a regular dependency in package.jsonVENDOR.md under app/core/The fullstack-updater (classic agent) detects this automatically and delegates
to nuxt-extensions-core-updater for vendored projects.
app/core/)Vendoring copies the nuxt-extensions source into the project tree so Claude Code can read it directly -- this is a comprehension aid, not an invitation to fork. The policy:
app/core/ ONLY when the change is generally useful to all
nuxt-extensions consumers. Valid reasons:
app/core/),
via project-level composables, components, middleware, or plugin
overrides. Project-specific business rules, customer branding, or
proprietary integrations must never live in the vendored core.github.com/lenneTech/nuxt-extensions. Use
/lt-dev:frontend:contribute-nuxt-extensions-core to prepare the PR.
Do not let useful fixes rot in a single project's vendor tree -- they
belong upstream so every consumer benefits and the local patch
disappears on the next sync.app/core/. The contributor
agent exists precisely to keep the vendor tree close to upstream.The nuxt-extensions-core-contributor agent enforces this distinction by
categorizing every local commit as upstream-candidate (generic) vs.
project-specific (stays local) vs. unclear (asks the human).
The vendored frontend core lives as first-class project code. Flow is:
Upstream (github.com/lenneTech/nuxt-extensions)
|
| /lt-dev:frontend:update-nuxt-extensions-core (curated, one-way)
v
Project vendor (app/core/)
|
| /lt-dev:frontend:contribute-nuxt-extensions-core (manual review, cherry-pick)
v
Upstream PR (via normal GitHub review process)
Local patches are expected. Projects legitimately modify the vendored core when business rules, integration adapters, or bugfixes are needed before upstream ships them. Those patches persist through syncs.
Changes are never auto-pushed. The contributor agent prepares PR drafts -- a human reviews and submits them through normal GitHub workflow. No git-subtree push, no automatic upstream replay.
Unlike the backend vendor model (nest-server), the nuxt-extensions source structure
is already flat. The upstream repository organizes its code directly in src/
without a nested core/ subdirectory, so when vendored into app/core/, no
import-path rewriting is needed for internal files.
This is an explicit simplification compared to the backend vendoring pattern:
index.ts, core.module.ts,
test/test.helper.ts, and core-persistence-model.interface.ts after every syncThe only import changes required are in the consumer project, not in the vendored code itself:
nuxt.config.ts -- remove the @lenne.tech/nuxt-extensions module entry,
replace with local module registration pointing to app/core/After vendoring, the frontend subproject looks like:
projects/app/
├── app/
│ ├── core/
│ │ ├── VENDOR.md <- NEW (marker + baseline metadata)
│ │ ├── LICENSE <- copied for provenance
│ │ ├── composables/ <- copied from upstream src/runtime/composables/
│ │ ├── components/ <- copied from upstream src/runtime/components/
│ │ ├── plugins/ <- copied from upstream src/runtime/plugins/
│ │ ├── middleware/ <- copied from upstream src/runtime/middleware/
│ │ ├── utils/ <- copied from upstream src/runtime/utils/
│ │ ├── types/ <- copied from upstream src/runtime/types/
│ │ └── ... <- other runtime directories
│ ├── components/ <- project components
│ ├── composables/ <- project composables
│ └── ...
├── nuxt.config.ts <- module entry rewritten
├── package.json <- @lenne.tech/nuxt-extensions removed
└── ...
Nuxt's auto-import mechanism handles composables and components from app/core/
automatically -- no consumer-import codemod is needed for auto-imported items.
When converting from npm to vendor mode, the nuxt.config.ts module registration
changes:
Before (npm mode):
export default defineNuxtConfig({
modules: [
'@lenne.tech/nuxt-extensions',
// other modules...
],
})
After (vendor mode):
export default defineNuxtConfig({
modules: [
// '@lenne.tech/nuxt-extensions' removed -- vendored into app/core/
// other modules...
],
})
The lt frontend convert-mode --to vendor CLI command handles this rewrite
automatically.
When a new upstream version is available, the nuxt-extensions-core-updater agent:
VENDOR.md baseline version and baseline commit SHA/tmp/upstream-delta.patch: upstream baseline -> upstream targetlocal-changes.patch: upstream baseline -> current project vendorconflicts.json: file-level intersection of both diffs--no-maintain) refreshes the rest via /lt-dev:maintenance:maintain.
A vendored project must never ship dependencies older than the upstream it mirrors.nuxt build + pnpm run lint -- commits if greenCLAUDE.md into the frontend project's CLAUDE.md --
section-level merge preserving project-specific contentVENDOR.md with new baseline + sync history entryIMPORTANT -- Tag format: nuxt-extensions tags have no v prefix. Use
--branch 1.5.3, not --branch v1.5.3.
When a local change in the vendored core looks generally useful, the
nuxt-extensions-core-contributor agent:
VENDOR.md baseline versiongit log --oneline app/core/ since baselinechore: format, style:, oxfmt, lint:fix, prettierupdate-nuxt-extensions-core run will pick up the
change as upstream-delivered and can remove the local patch from
VENDOR.md's local-changes logUnlike backend contributions (where ./common/ must become ./core/common/
before submitting upstream), nuxt-extensions uses a 1:1 path mapping between
the vendored tree and upstream. Files can be cherry-picked directly without
any import-path transformation.
Running pnpm run format and pnpm run lint on a freshly vendored upstream
often produces a formatting-only commit if the project's formatter config
differs from upstream's. These commits have real line changes but zero
semantic content. Without filtering, the contributor agent would suggest
them as upstream-PRs -- wasting reviewer time on upstream and creating
unwanted churn.
The filter lives in the agent, not in .oxlintignore or .prettierignore.
The vendored code should always stay format-compliant with project standards.
If the vendor pilot fails or needs to be reverted:
# In the consumer project frontend:
cd projects/app
git log --oneline | grep -E "vendor|framework" | head -20
# Identify the vendor commit range
git revert <first-vendor-commit>..<last-commit> --no-edit
pnpm install
pnpm run build
This restores @lenne.tech/nuxt-extensions as an npm dependency and removes the
app/core/ vendor tree. No data loss, no upstream impact.
nest-server-core-vendoringdevelopment
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.