vue-expert-js
jeffallan/claude-skills
Build Vue 3 apps in JavaScript with JSDoc typing—no TypeScript required.
What is vue-expert-js?
Creates Vue 3 components, composables, and Vite projects using vanilla JavaScript with comprehensive JSDoc type annotations (@typedef, @param, @returns). Use this when building Vue 3 applications without TypeScript, migrating from Vue 2 Options API to Composition API in JavaScript, or when teams prefer plain JavaScript with type hints via JSDoc.
- Generate Vue 3 components with `<script setup>` and JSDoc-typed props/emits
- Build vanilla JavaScript composables with @typedef, @param, and @returns annotations
- Configure Vite projects and set up Vue Router 4 and Pinia in JavaScript
- Create @typedef definitions for complex object shapes shared across files
- Verify JSDoc type coverage using ESLint with eslint-plugin-jsdoc
- Use .mjs ES modules and Composition API patterns without TypeScript
How to install vue-expert-js
npx skills add https://github.com/jeffallan/claude-skills --skill vue-expert-js- Node.js and npm installed
- Familiarity with Vue 3 Composition API concepts
- Basic understanding of JSDoc syntax and type annotations
- ESLint with eslint-plugin-jsdoc for type coverage verification (recommended)
How to use vue-expert-js
- 1.Install the skill via `npx skills add https://github.com/jeffallan/claude-skills --skill vue-expert-js`
- 2.Describe your Vue component, composable, or project structure in plain language
- 3.The skill will generate JavaScript files with `<script setup>` and comprehensive JSDoc annotations
- 4.Review generated @typedef, @param, and @returns comments for type coverage
- 5.Run ESLint with the JSDoc plugin to verify all public APIs are annotated
- 6.Test with Vitest using JavaScript test files and confirm JSDoc coverage is complete
Use cases
- Building a Vue 3 SPA entirely in JavaScript with full type hints via JSDoc comments
- Migrating a Vue 2 Options API codebase to Vue 3 Composition API while staying in JavaScript
- Setting up a quick prototype or team project that avoids TypeScript setup overhead
- Creating reusable composables with documented parameter and return types for team collaboration
- Configuring Vite + Vue Router + Pinia in a JavaScript-only project with type safety through annotations
- Frontend developers who prefer JavaScript over TypeScript
- Teams standardized on vanilla JavaScript without a TypeScript compiler
- Vue 2 developers migrating to Vue 3 Composition API in JavaScript
- Developers building rapid prototypes or MVPs without TypeScript infrastructure
- Projects using .mjs modules and ES2022+ JavaScript
vue-expert-js FAQ
No. This skill is specifically for JavaScript-only projects. For TypeScript, use the related vue-expert skill instead.
Use comprehensive JSDoc annotations with @typedef, @param, and @returns on all public APIs, then verify coverage with ESLint and the eslint-plugin-jsdoc plugin.
Use .mjs for ES modules when needed (especially composables), and .vue for components. Both work; .mjs makes module intent explicit.
Yes. This skill helps migrate Vue 2 Options API code to Vue 3 Composition API in JavaScript, following the core workflow for architecture planning and JSDoc annotation.
Vitest with JavaScript test files. The skill generates components and composables that work with Vue Test Utils and Vitest for unit and integration testing.
Full instructions (SKILL.md)
Source of truth, from jeffallan/claude-skills.
name: vue-expert-js description: Creates Vue 3 components, builds vanilla JS composables, configures Vite projects, and sets up routing and state management using JavaScript only — no TypeScript. Generates JSDoc-typed code with @typedef, @param, and @returns annotations for full type coverage without a TS compiler. Use when building Vue 3 applications with JavaScript only (no TypeScript), when projects require JSDoc-based type hints, when migrating from Vue 2 Options API to Composition API in JS, or when teams prefer vanilla JavaScript, .mjs modules, or need quick prototypes without TypeScript setup. license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: frontend triggers: Vue JavaScript, Vue without TypeScript, Vue JSDoc, Vue JS only, Vue vanilla JavaScript, .mjs Vue, Vue no TS role: specialist scope: implementation output-format: code related-skills: vue-expert, javascript-pro
Vue Expert (JavaScript)
Senior Vue specialist building Vue 3 applications with JavaScript and JSDoc typing instead of TypeScript.
Core Workflow
- Design architecture — Plan component structure and composables with JSDoc type annotations
- Implement — Build with
<script setup>(nolang="ts"),.mjsmodules where needed - Annotate — Add comprehensive JSDoc comments (
@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 proceeding - Test — Verify with Vitest using JavaScript files; confirm JSDoc coverage on all public APIs; if tests fail, revisit the relevant composable or component, correct the logic or annotation, and re-run until the suite is green
Reference Guide
Load 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
Code Patterns
Component with JSDoc-typed props and emits
<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>
Composable with @typedef, @param, and @returns
// 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 }
}
@typedef for a complex object used across files
// 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} */
Constraints
MUST DO
- Use Composition API with
<script setup> - Use JSDoc comments for type documentation
- Use
.mjsextension for ES modules when needed - Annotate every public function with
@paramand@returns - Use
@typedeffor complex object shapes shared across files - Use
@typeannotations for reactive variables - Follow vue-expert patterns adapted for JavaScript
MUST NOT DO
- Use TypeScript syntax (no
<script setup lang="ts">) - Use
.tsfile extensions - Skip JSDoc types for public APIs
- Use CommonJS
require()in Vue files - Ignore type safety entirely
- Mix TypeScript files with JavaScript in the same component
Output Templates
When implementing Vue features in JavaScript:
- Component file with
<script setup>(no lang attribute) and JSDoc-typed props/emits @typedefdefinitions for complex prop or state shapes- Composable with
@paramand@returnsannotations - Brief note on type coverage
Knowledge Reference
Vue 3 Composition API, JSDoc, ESM modules, Pinia, Vue Router 4, Vite, VueUse, Vitest, Vue Test Utils, JavaScript ES2022+
Related skills
More from jeffallan/claude-skills and the wider catalog.

websocket-engineer
Build real-time bidirectional communication systems with WebSockets and Socket.IO, including clustering and presence tracking.

wordpress-pro
Expert WordPress theme, plugin, and Gutenberg development with security hardening and performance optimization.

angular-architect
Generates Angular 17+ standalone components, NgRx state management, RxJS patterns, and optimized routing for enterprise applications.

api-designer
Design REST and GraphQL APIs with OpenAPI 3.1 specifications, resource modeling, and versioning strategies.

backtesting-trading-strategies
Backtest crypto and traditional trading strategies with performance metrics, equity curves, and parameter optimization.

mindmap-generator
|