skills/vue/SKILL.md
Vue.js mastery. Composition API, Pinia, Vue Router, Nuxt SSR/SSG, Vite optimization, testing.
npx skillsauth add arbazkhan971/godmode vueInstall 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.
/godmode:vue, "Vue app", "Vue component"cat package.json 2>/dev/null \
| grep -E '"vue"|"nuxt"|"@vue/"'
cat node_modules/vue/package.json 2>/dev/null \
| grep '"version"'
Vue version: <2.x / 3.x>
Build tool: Vite | Webpack | Nuxt
API style: Composition | Options | Mixed
State: Pinia | Vuex | none
Router: Vue Router | file-based (Nuxt)
CSS: Tailwind | UnoCSS | SCSS | scoped
TypeScript: yes | no
Meta-framework: Nuxt 3 | none
IF starting fresh: "Need SSR? Use Nuxt."
| Factor | Composition API | Options API |
|-------------|-----------------|-------------|
| Vue version | Vue 3 (native) | Vue 2 & 3 |
| TypeScript | Excellent | Requires decorators|
| Logic reuse | Composables | Mixins (fragile)|
| Organization| By feature | By option type|
| Bundle | Tree-shakeable | Full runtime |
| Complex comp| Scales well | Gets unwieldy|
IF new Vue 3 project: Composition API + <script setup>
IF existing Vue 2: keep Options unless migrating
IF mixed codebase: plan migration, don't stay mixed
WHEN team is new to Vue: Options first, then migrate
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import type { User } from '@/types'
const props = defineProps<{ userId: string }>()
const emit = defineEmits<{ save: [user: User] }>()
</script>
Composable rules:
use prefix: useAuth, useCart| Store | Purpose | Persistence |
|--------------|---------------|-------------|
| useAuthStore | Authentication| localStorage |
| useUserStore | User profile | Session only |
| useCartStore | Shopping cart | localStorage |
Rules:
| Path | Component | Guard |
|---------------|-----------|-------------|
| / | Home.vue | none |
| /dashboard | Dashboard | auth-required|
| /admin/* | Admin | admin-only |
| /:pathMatch(*)| NotFound | none |
Rules:
| Route | Strategy | Reason |
|---------------|---------|---------------|
| / | SSG | Static, fast |
| /blog/:slug | ISR 60s | Content, SEO |
| /dashboard | SPA | Auth-gated |
| /products/:id | SSR | Dynamic, SEO |
// nuxt.config.ts
export default defineNuxtConfig({
routeRules: {
'/': { prerender: true },
'/blog/**': { isr: 60 },
'/dashboard/**': { ssr: false },
}
})
Rules:
# Run unit/component tests
npx vitest run
# Run e2e tests
npx playwright test
# Type check
npx vue-tsc --noEmit
Coverage target: >80% statements, >70% branches.
| Check | Status |
|-------------------------------|--------|
| API style consistent | PASS |
| <script setup> used | PASS |
| TypeScript strict | PASS |
| Composables use* convention | PASS |
| Pinia setup syntax | PASS |
| Routes lazy-loaded | PASS |
| Props typed (defineProps<T>) | PASS |
| Emits typed (defineEmits<T>) | PASS |
| No v-html with user input | PASS |
| Every v-for has :key | PASS |
Log to .godmode/vue-results.tsv:
timestamp\taction\tcomponents\tstores\tcomposables\tstatus
Print: Vue: {action}. Components: {N}. Stores: {N}. vue-tsc: {status}. Status: {DONE|PARTIAL}.
KEEP if: vue-tsc passes AND tests pass
AND audit shows no regressions
DISCARD if: type errors OR test failures
OR bundle exceeds budget. Revert immediately.
STOP when:
- All audit checks PASS
- vue-tsc --noEmit exits 0
- vitest run exits 0
- No v-for without :key, no v-html, no mixins
development
Web performance optimization. Lighthouse, bundle analysis, code splitting, image optimization, critical CSS, fonts, service workers, CDN.
development
Webhook design, delivery, retry, HMAC verification, event subscriptions, dead letter queues.
development
Evidence gate. Run command, read full output, confirm or deny claim. No trust, only proof.
content-media
File upload handling, image optimization, media processing, signed URLs, multipart, virus scanning.