From node-vue
Implements a feature using Fastify + Drizzle ORM + Vue3 in the monorepo. Creates backend schemas, services, routes in backend/ and Vue SFCs in frontend/. Invoked by core:implement and core:sprint — not usually called directly. Use when the user says "implement with Fastify", "build node-vue feature", or when core:architecture returns node-vue.
How this skill is triggered — by the user, by Claude, or both
Slash command
/node-vue:implement-node-vue FEAT-001FEAT-001The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Implement the feature specified in `$ARGUMENTS` using Fastify (backend) and Vue3 (frontend)
Implement the feature specified in $ARGUMENTS using Fastify (backend) and Vue3 (frontend)
in the monorepo layout. Read the feature spec and data model before writing any code.
backend/
├── src/
│ ├── index.ts # Fastify server, plugin registration
│ ├── db/
│ │ ├── index.ts # Drizzle client
│ │ └── schema/ # Drizzle table definitions per entity
│ ├── services/ # Business logic + Drizzle queries
│ ├── routes/ # Fastify plugins per feature
│ └── llm.ts # LLM provider (scaffold when feature needs RAG/embeddings)
├── drizzle/ # generated migrations
├── drizzle.config.ts
├── package.json
└── Dockerfile.api
frontend/
├── src/
│ ├── main.ts
│ ├── App.vue
│ ├── router/index.ts
│ ├── stores/ # Pinia stores per feature
│ └── views/ # Vue SFCs per feature
├── package.json
├── vite.config.ts
└── Dockerfile.web
docker-compose.yml # at monorepo root
.env.example # at monorepo root
node-vue:test-node-vue)node-vue:migration)any TypeScript type — use proper Zod schemas and Drizzle inferred typesbackend/src/db/schema/<entity>.ts — Drizzle table definitionbackend/src/services/<feature>.ts — service functions with Drizzle queriesbackend/src/routes/<feature>.ts — Fastify plugin with Zod-validated routesfrontend/src/stores/<feature>.ts — Pinia storefrontend/src/views/<Feature>View.vue — Vue3 SFC with TailwindCSSbackend/src/index.tsfrontend/src/router/index.tsIf feature mentions embeddings, search, similarity, or RAG:
backend/src/llm.ts if absent (see LLM section below)vector column to the Drizzle schema using customTypeRun: cd backend && npx eslint --fix src/ && npx prettier --write src/
Scaffold when a feature needs embeddings or text generation:
// backend/src/llm.ts
const OLLAMA_BASE = process.env.OLLAMA_BASE_URL ?? 'http://ollama:11434'
export async function generate(prompt: string, model?: string): Promise<string> {
if (process.env.OPENAI_API_KEY) {
const { OpenAI } = await import('openai')
const client = new OpenAI()
const resp = await client.chat.completions.create({
model: model ?? 'gpt-4o-mini',
messages: [{ role: 'user', content: prompt }],
})
return resp.choices[0].message.content ?? ''
}
// Ollama fallback
const res = await fetch(`${OLLAMA_BASE}/api/generate`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ model: model ?? 'llama3.2', prompt, stream: false }),
})
const data = await res.json()
return data.response as string
}
export async function embed(text: string): Promise<number[]> {
if (process.env.OPENAI_API_KEY) {
const { OpenAI } = await import('openai')
const client = new OpenAI()
const resp = await client.embeddings.create({ model: 'text-embedding-3-small', input: text })
return resp.data[0].embedding
}
const res = await fetch(`${OLLAMA_BASE}/api/embeddings`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ model: 'nomic-embed-text', prompt: text }),
})
const data = await res.json()
return data.embedding as number[]
}
docs/features/FEAT-XXX-*.md for the feature spec and ACsdocs/data_model.md for entity definitionsbackend/src/ for patterns and conventionsbackend/src/index.tsfrontend/src/stores/frontend/src/views/frontend/src/router/index.tscd backend && npx eslint --fix src/ && npx prettier --write src/npx claudepluginhub bfh-krg1/sdd-web-app --plugin node-vueCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.