Develops lenne.tech frontend applications with Nuxt 4, Nuxt UI 4, strict TypeScript, and Valibot forms. Integrates backend APIs via generated types (types.gen.ts, sdk.gen.ts). Creates components with programmatic modals (useOverlay), composables per backend controller, TailwindCSS-only styling. Handles Nuxt 4 patterns including app/ directory, useFetch, useState, SSR, and hydration. Use when working with app/interfaces/, app/composables/, app/components/, app/pages/ in Nuxt projects or monorepos (projects/app/). NOT for NestJS backend (use generating-nest-servers).
/plugin marketplace add lenneTech/claude-code/plugin install lt-dev@lenne-techThis skill inherits all available tools. When active, it can use any tool Claude has access to.
reference/api.mdreference/components.mdreference/composables.mdreference/forms.mdreference/modals.mdreference/nuxt.mdreference/typescript.mdapp/components/, app/composables/, app/pages/, app/interfaces/types.gen.ts, sdk.gen.ts)projects/app/ or packages/app/ structureNOT for: NestJS backend development (use generating-nest-servers skill instead)
generating-nest-servers - For NestJS backend development (API implementation)using-lt-cli - For Git operations and Fullstack initializationbuilding-stories-with-tdd - For TDD approach when backend integration is neededUse the LSP tool when available for better code intelligence in TypeScript/Vue/Nuxt projects:
| Operation | Use Case |
|---|---|
goToDefinition | Find where a type, composable, or component is defined |
findReferences | Find all usages of a symbol across the codebase |
hover | Get type information for props, refs, and computed values |
documentSymbol | List all exports, functions, and types in a file |
workspaceSymbol | Search for composables, interfaces, or components |
goToImplementation | Find implementations of interfaces |
When to use LSP:
types.gen.ts is used → findReferencesdocumentSymbolgoToDefinitionworkspaceSymbolInstallation (if LSP not available):
claude plugins install typescript-lsp --marketplace claude-plugins-official
app/ # Application code (srcDir)
├── components/ # Auto-imported components
├── composables/ # Auto-imported composables
├── interfaces/ # TypeScript interfaces
├── pages/ # File-based routing
├── layouts/ # Layout components
└── api-client/ # Generated types & SDK
server/ # Nitro server routes
public/ # Static assets
nuxt.config.ts
CRITICAL: Never create custom interfaces for backend DTOs!
| Priority | Source | Use For |
|---|---|---|
| 1. | ~/api-client/types.gen.ts | All backend DTOs (REQUIRED) |
| 2. | ~/api-client/sdk.gen.ts | All API calls (REQUIRED) |
| 3. | Nuxt UI types | Component props (auto-imported) |
| 4. | app/interfaces/*.interface.ts | Frontend-only types (UI state, forms) |
Prerequisites: Backend API must be running!
# Start API first (in monorepo)
cd projects/api && npm run start:dev
# Then generate types
npm run generate-types
If types.gen.ts or sdk.gen.ts are missing or outdated:
npm run generate-typesimport type { SeasonDto } from '~/api-client/types.gen'
import { seasonControllerGet } from '~/api-client/sdk.gen'
const response = await seasonControllerGet()
const seasons: SeasonDto[] = response.data ?? []
export function useSeasons() {
const seasons = ref<SeasonDto[]>([])
const loading = ref<boolean>(false)
async function fetchSeasons(): Promise<void> {
loading.value = true
try {
const response = await seasonControllerGet()
if (response.data) seasons.value = response.data
} finally {
loading.value = false
}
}
return { seasons: readonly(seasons), loading: readonly(loading), fetchSeasons }
}
// For state shared across components (SSR-safe)
export function useAuth() {
const user = useState<UserDto | null>('auth-user', () => null)
const isAuthenticated = computed<boolean>(() => !!user.value)
return { user: readonly(user), isAuthenticated }
}
const overlay = useOverlay()
overlay.open(ModalCreate, {
props: { title: 'Neu' },
onClose: (result) => { if (result) refreshData() }
})
import { object, string, minLength } from 'valibot'
import type { InferOutput } from 'valibot'
const schema = object({
title: string([minLength(3, 'Mindestens 3 Zeichen')])
})
type Schema = InferOutput<typeof schema>
const state = reactive<Schema>({ title: '' })
| Rule | Value |
|---|---|
| UI Labels | German (Speichern, Abbrechen) |
| Code/Comments | English |
| Styling | TailwindCSS only, no <style> |
| Types | Explicit, no implicit any |
| Backend Types | Generated only (types.gen.ts) |
| Custom Interfaces | Frontend-only (app/interfaces/*.interface.ts) |
| Composables | app/composables/use*.ts |
| Shared State | useState() for SSR-safe state |
| Local State | ref() / reactive() |
| Topic | File |
|---|---|
| TypeScript | reference/typescript.md |
| Components | reference/components.md |
| Composables | reference/composables.md |
| Forms | reference/forms.md |
| Modals | reference/modals.md |
| API | reference/api.md |
| Nuxt Patterns | reference/nuxt.md |
types.gen.ts)sdk.gen.tsnpm run generate-types)useOverlayanyThis skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.