PluginBench
Skill
Pass
Audit score 90

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
Prerequisites
  • 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)
Claude Code
Cursor
Windsurf
Cline

How to use vue-expert-js

  1. 1.Install the skill via `npx skills add https://github.com/jeffallan/claude-skills --skill vue-expert-js`
  2. 2.Describe your Vue component, composable, or project structure in plain language
  3. 3.The skill will generate JavaScript files with `<script setup>` and comprehensive JSDoc annotations
  4. 4.Review generated @typedef, @param, and @returns comments for type coverage
  5. 5.Run ESLint with the JSDoc plugin to verify all public APIs are annotated
  6. 6.Test with Vitest using JavaScript test files and confirm JSDoc coverage is complete

Use cases

Good for
  • 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
Who it's for
  • 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

Can I use TypeScript with this skill?

No. This skill is specifically for JavaScript-only projects. For TypeScript, use the related vue-expert skill instead.

How do I ensure type safety without TypeScript?

Use comprehensive JSDoc annotations with @typedef, @param, and @returns on all public APIs, then verify coverage with ESLint and the eslint-plugin-jsdoc plugin.

Should I use .mjs or .js file extensions?

Use .mjs for ES modules when needed (especially composables), and .vue for components. Both work; .mjs makes module intent explicit.

Can I use this skill with existing Vue 2 projects?

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.

What testing approach does this skill use?

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

  1. Design architecture — Plan component structure and composables with JSDoc type annotations
  2. Implement — Build with <script setup> (no lang="ts"), .mjs modules where needed
  3. 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
  4. 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:

TopicReferenceLoad When
JSDoc Typingreferences/jsdoc-typing.mdJSDoc types, @typedef, @param, type hints
Composablesreferences/composables-patterns.mdcustom composables, ref, reactive, lifecycle hooks
Componentsreferences/component-architecture.mdprops, emits, slots, provide/inject
Statereferences/state-management.mdPinia, stores, reactive state
Testingreferences/testing-patterns.mdVitest, component testing, mocking

For shared Vue concepts, defer to vue-expert:

  • vue-expert/references/composition-api.md - Core reactivity patterns
  • vue-expert/references/components.md - Props, emits, slots
  • vue-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 .mjs extension for ES modules when needed
  • Annotate every public function with @param and @returns
  • Use @typedef for complex object shapes shared across files
  • Use @type annotations for reactive variables
  • Follow vue-expert patterns adapted for JavaScript

MUST NOT DO

  • Use TypeScript syntax (no <script setup lang="ts">)
  • Use .ts file 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:

  1. Component file with <script setup> (no lang attribute) and JSDoc-typed props/emits
  2. @typedef definitions for complex prop or state shapes
  3. Composable with @param and @returns annotations
  4. 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+

Documentation