skills/team/vue-feature-slice/SKILL.md
Scaffolds feature-based Vue / TypeScript architecture using feature folders, presentational + container SFCs, composables, a typed data layer, and structural CQRS (query composables vs mutation composables). Vue analog of dotnet-vertical-slice and react-feature-slice — no DI framework; uses props/provide-inject for dependency injection and a query layer for server state. Use when creating feature-based Vue projects, adding Vue features, organizing components by feature rather than by technical type, or scaffolding a feature's data layer.
npx skillsauth add michaelalber/ai-toolkit vue-feature-sliceInstall 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.
"The best code is code that never has to be written." -- Jeff Atwood
"Organize around business capabilities, not technical layers." -- Sam Newman, Building Microservices
Feature slice architecture organizes code by feature, not by technical type. The default Vue tutorial
layout — components/, composables/, utils/, services/ — spreads one feature across many
directories, so adding "checkout" means touching five folders. This skill replaces that with
self-contained vertical slices: features/cart/, features/checkout/, each owning its full stack —
components, composables, data layer, types, and tests.
Vue has no mediator and no DI container. Dependency injection is props and provide/inject; the
container resolves nothing for you. CQRS is a structural and naming convention — read composables
(useOrdersQuery) versus mutation composables (useCreateOrder) — backed by a query layer (TanStack
Query for Vue / Pinia actions) for server state, never a library contract.
Grounding note: the KB has a Vue 2/3 corpus under
collection="javascript"(alongside TS). Usecollection="ui_ux"for accessible component design, and cite vuejs.org for composable/component patterns. Never invent avuecollection.
Non-Negotiable Constraints:
strict — every component, composable, and prop is typed; no any without justificationshared/ or composition onlyfetch; query/mutation composables doref + onMounted for server dataindex.tsWhat this skill is NOT:
provide/inject context or Pinia both fit the conventionsThe 10 domain principles (applied-as examples) and the grounding query map live in
references/domain-principles.md. The structural CQRS conventions live in references/vue-cqrs-conventions.md.
AI discipline rules, the anti-patterns catalog, and error-recovery procedures live in
references/discipline-and-recovery.md.
Objective: Understand the existing structure before scaffolding.
# Vue + tooling versions
grep -E '"(vue|typescript|vite|nuxt|pinia|vuex|@tanstack/vue-query)"' package.json
# TypeScript strictness
grep -n '"strict"' tsconfig*.json
# Existing layout — type-based, feature-based, or mixed
find src -type d -maxdepth 2 | head -30
# Existing data-fetching pattern
grep -rn "useQuery\|defineStore\|fetch(\|axios" src/ | head -20
Record: Vue version, bundler (Vite/Vue CLI/Nuxt), TS strict on/off, state/query libraries, current layout, router.
Create the feature folder. See references/feature-folder-template.md for file-by-file content.
src/features/<name>/
components/<Name>List.vue # container: wires composable → view
components/<Name>ListView.vue # presentational: props in, template out
components/<Name>Form.vue # form with boundary validation
composables/use<Name>sQuery.ts # read (query composable)
composables/useCreate<Name>.ts # write (mutation composable)
data/api.ts # api client + zod parse; the only I/O
data/schema.ts # zod schemas + inferred types
types.ts # feature-local types
index.ts # barrel: the feature's public surface
<Name>List.test.ts # component test
composables/useCreate<Name>.test.ts # composable test
Register the slice with the router and (only if shared) a provide/inject context.
// app/routes.ts
import { OrdersPage } from "@/features/orders"; // barrel import only
{ path: "/orders", component: OrdersPage }
// provide/inject only when prop-drilling earns it:
// provide(CartKey, cart) at the feature root; useCart() calls inject(CartKey).
npx vue-tsc --noEmit # types clean (SFC-aware)
npx eslint src/features/<name> # incl. vue + a11y rules
npx vitest run src/features/<name> # slice tests green
# Cross-feature import check — should print nothing:
grep -rn "features/" "src/features/<name>" | grep -v "features/<name>"
<vue-feature-slice-state>
phase: DETECT | SCAFFOLD | WIRE | VERIFY | COMPLETE
feature_name: [name]
vue_version: [detected]
existing_structure: type-based | feature-based | mixed | unknown
query_lib: tanstack-vue-query | pinia | none
route_registered: true | false
query_composable_created: true | false
mutation_composable_created: true | false
tests_scaffolded: true | false
last_action: [description]
next_action: [description]
</vue-feature-slice-state>
Emit a "Feature Slice Scaffold" report (Files Created / Wiring / Verification checklist) plus the
feature-folder diagram. Both full templates live in references/output-templates.md.
| Skill | Relationship |
|-------|-------------|
| vue-component-scaffolder | Component-level quality (props typing, component test, story, a11y). Use to generate the individual components inside a slice. |
| vue-app-scaffolder | When there is no app yet, scaffold the Vite + TS + router + Vitest skeleton first, then add slices. |
| vue-security-review | After scaffolding, audit the slice's boundary validation, link/URL handling, and token usage against OWASP. |
| vue-architecture-checklist | Architecture quality gate. Run after several slices to verify isolation, reactivity discipline, and coupling. |
| tdd | Drive each composable and component test-first (RED → GREEN → REFACTOR) rather than scaffolding code ahead of tests. |
development
Interviews the user relentlessly about a plan, decision, or idea — one question at a time, each with a recommended answer. Shared engine behind "grill-me" and "grill-with-docs". Use on any "grill" trigger phrase or to stress-test thinking. Do NOT use to build the plan; it ends at shared understanding, not implementation.
testing
Runs a relentless interview to sharpen a plan or design, capturing the decisions as ADRs and a glossary along the way. Use when the user wants to be grilled AND wants the session to leave durable domain documentation behind. Do NOT use for a throwaway stress-test with no artifacts; use grill-me instead.
tools
OWASP-based security review of Vue/TypeScript front-ends. Detects framework (Vite/Vue CLI/Nuxt), entry points, and data flows; scans the OWASP Top 10 (2025) mapped to Vue client-side risks (raw-HTML XSS via v-html, URL/protocol injection, bundled secrets, insecure token storage, dependency CVEs, missing CSP, open redirects, router guard bypass); emits an exec summary plus graded findings. Use to audit Vue for vulnerabilities. Not for architecture grading (vue-architecture-checklist).
tools
Analyzes legacy Vue codebases and produces actionable modernization plans. Primary migration paths include Options API to Composition API, Vue 2 to Vue 3, Vue CLI to Vite, JavaScript to TypeScript, Vue Test Utils/Karma/Mocha to Vitest + Vue Testing Library, legacy Vuex to Pinia, and removed-in-Vue-3 pattern cleanup (filters, event bus, `$listeners`). Does NOT perform the migration — assesses, quantifies risk, and plans.