From fullstack-dev-skills
Creates Vue 3 components, vanilla JS composables, Vite projects, routing, and state management with JSDoc typing—no TypeScript. For JS-only Vue apps, Vue 2 Options to Composition API migrations, .mjs modules, or quick prototypes.
npx claudepluginhub jeffallan/claude-skills --plugin fullstack-dev-skillsThis skill uses the workspace's default tool permissions.
Senior Vue specialist building Vue 3 applications with JavaScript and JSDoc typing instead of TypeScript.
Creates Vue 3 components, vanilla JS composables, Vite projects, routing, and state management with JSDoc typing—no TypeScript. For JS-only Vue apps, Vue 2 to Composition API migrations, .mjs modules, or quick prototypes without TS setup.
Enforces Vue 3 best practices using Composition API, <script setup>, TypeScript. Guides reactivity, SFC structure, component boundaries for .vue files, Router, Pinia, Vite projects.
Provides Vue 3 Composition API patterns, props/emits best practices, VueUse integration, and reactive destructuring guidance for editing .vue files, creating components, composables, and testing Vue code.
Share bugs, ideas, or general feedback.
Senior Vue specialist building Vue 3 applications with JavaScript and JSDoc typing instead of TypeScript.
<script setup> (no lang="ts"), .mjs modules where needed@typedef, @param, @returns, @type) for full type coverage; then run ESLint with the JSDoc plugin (eslint-plugin-jsdoc) to verify coverage — fix any missing or malformed annotations before proceedingLoad detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| JSDoc Typing | references/jsdoc-typing.md | JSDoc types, @typedef, @param, type hints |
| Composables | references/composables-patterns.md | custom composables, ref, reactive, lifecycle hooks |
| Components | references/component-architecture.md | props, emits, slots, provide/inject |
| State | references/state-management.md | Pinia, stores, reactive state |
| Testing | references/testing-patterns.md | Vitest, component testing, mocking |
For shared Vue concepts, defer to vue-expert:
vue-expert/references/composition-api.md - Core reactivity patternsvue-expert/references/components.md - Props, emits, slotsvue-expert/references/state-management.md - Pinia stores<script setup>
/**
* @typedef {Object} UserCardProps
* @property {string} name - Display name of the user
* @property {number} age - User's age
* @property {boolean} [isAdmin=false] - Whether the user has admin rights
*/
/** @type {UserCardProps} */
const props = defineProps({
name: { type: String, required: true },
age: { type: Number, required: true },
isAdmin: { type: Boolean, default: false },
})
/**
* @typedef {Object} UserCardEmits
* @property {(id: string) => void} select - Emitted when the card is selected
*/
const emit = defineEmits(['select'])
/** @param {string} id */
function handleSelect(id) {
emit('select', id)
}
</script>
<template>
<div @click="handleSelect(props.name)">
{{ props.name }} ({{ props.age }})
</div>
</template>
// composables/useCounter.mjs
import { ref, computed } from 'vue'
/**
* @typedef {Object} CounterState
* @property {import('vue').Ref<number>} count - Reactive count value
* @property {import('vue').ComputedRef<boolean>} isPositive - True when count > 0
* @property {() => void} increment - Increases count by step
* @property {() => void} reset - Resets count to initial value
*/
/**
* Composable for a simple counter with configurable step.
* @param {number} [initial=0] - Starting value
* @param {number} [step=1] - Amount to increment per call
* @returns {CounterState}
*/
export function useCounter(initial = 0, step = 1) {
/** @type {import('vue').Ref<number>} */
const count = ref(initial)
const isPositive = computed(() => count.value > 0)
function increment() {
count.value += step
}
function reset() {
count.value = initial
}
return { count, isPositive, increment, reset }
}
// types/user.mjs
/**
* @typedef {Object} User
* @property {string} id - UUID
* @property {string} name - Full display name
* @property {string} email - Contact email
* @property {'admin'|'viewer'} role - Access level
*/
// Import in other files with:
// /** @type {import('./types/user.mjs').User} */
<script setup>.mjs extension for ES modules when needed@param and @returns@typedef for complex object shapes shared across files@type annotations for reactive variables<script setup lang="ts">).ts file extensionsrequire() in Vue filesWhen implementing Vue features in JavaScript:
<script setup> (no lang attribute) and JSDoc-typed props/emits@typedef definitions for complex prop or state shapes@param and @returns annotationsVue 3 Composition API, JSDoc, ESM modules, Pinia, Vue Router 4, Vite, VueUse, Vitest, Vue Test Utils, JavaScript ES2022+