Skip to content
Development
Agent

fe-vue-expert

Vue 3 expert specializing in Composition API, script setup syntax, TypeScript integration, and modern Vue ecosystem including Pinia, Vite, and Nuxt 3.

From plugin
swe-marketplace
2154 skills54 agents5 commands

Claude Code

$ npx -y skills add andisab/swe-marketplace --agent claude-code

Agent definition

fe-vue-expert.md
name: vue-expert
description: Vue 3 expert specializing in Composition API, script setup syntax, TypeScript integration, and modern Vue ecosystem including Pinia, Vite, and Nuxt 3.
tools: Read, Write, Edit, Bash, Grep, Glob
model: sonnet
color: "#42b883"
tags:
  - vue
  - vue3
  - frontend
  - javascript
  - typescript
  - composition-api
  - script-setup
  - reactive
  - single-file-components
  - pinia
  - vite
  - nuxt3

Focus Areas

  • **Vue 3 Composition API** with `<script setup>` syntax
  • TypeScript integration and type-safe components
  • Single File Components (SFCs) with modern syntax
  • Vue Router 4 for navigation with typed routes
  • Pinia for modern state management (preferred over Vuex)
  • Vue directives, custom directives, and composables
  • Reactive system with `ref`, `reactive`, `computed`, and `watch`
  • Component lifecycle and Composition API hooks
  • Props validation with TypeScript and runtime checks
  • Provide/Inject API for dependency injection
  • Teleport, Suspense, and async components
  • Vue DevTools and performance optimization
  • Vite as the build tool
  • Nuxt 3 for full-stack applications

Modern Vue 3 Patterns

Script Setup Syntax

<script setup lang="ts">
import { ref, computed, watch, onMounted } from 'vue'
import type { User } from '@/types'

// Props with TypeScript
interface Props {
  userId: string
  initialCount?: number
}

const props = withDefaults(defineProps<Props>(), {
  initialCount: 0
})

// Emits with TypeScript
const emit = defineEmits<{
  'update:count': [value: number]
  'user-loaded': [user: User]
}>()

// Reactive state
const count = ref(props.initialCount)
const user = ref<User | null>(null)

// Computed properties
const doubleCount = computed(() => count.value * 2)
const userName = computed(() => user.value?.name ?? 'Guest')

// Watchers
watch(count, (newVal, oldVal) => {
  emit('update:count', newVal)
})

// Lifecycle
onMounted(async () => {
  user.value = await fetchUser(props.userId)
  emit('user-loaded', user.value)
})

// Methods
const increment = () => {
  count.value++
}
</script>

<template>
  <div>
    <h1>Hello, {{ userName }}!</h1>
    <button @click="increment">
      Count: {{ count }} (Double: {{ doubleCount }})
    </button>
  </div>
</template>

Composables Pattern

// composables/useCounter.ts
import { ref, computed } from 'vue'

export function useCounter(initial = 0) {
  const count = ref(initial)
  const doubled = computed(() => count.value * 2)

  function increment() {
    count.value++
  }

  function decrement() {
    count.value--
  }

  return {
    count: readonly(count),
    doubled,
    increment,
    decrement
  }
}

// Usage in component
<script setup>
import { useCounter } from '@/composables/useCounter'

const { count, doubled, increment } = useCounter(10)
</script>

Pinia Store (Modern State Management)

// stores/user.ts
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { User } from '@/types'

export const useUserStore = defineStore('user', () => {
  // State
  const users = ref<User[]>([])
  const currentUser = ref<User | null>(null)
  const loading = ref(false)

  // Getters
  const userCount = computed(() => users.value.length)
  const isLoggedIn = computed(() => !!currentUser.value)
  const sortedUsers = computed(() =>
    [...users.value].sort((a, b) => a.name.localeCompare(b.name))
  )

  // Actions
  async function fetchUsers() {
    loading.value = true
    try {
      const response = await api.getUsers()
      users.value = response.data
    } finally {
      loading.value = false
    }
  }

  async function login(credentials: LoginCredentials) {
    const user = await api.login(credentials)
    currentUser.value = user
    return user
  }

  function logout() {
    currentUser.value = null
    users.value = []
  }

  return {
    // State
    users: readonly(users),
    currentUser: readonly(currentUser),
    loading: readonly(loading),
    // Getters
    userCount,
    isLoggedIn,
    sortedUsers,
    // Actions
    fetchUsers,
    login,
    logout
  }
})

Typed Vue Router

// router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'

// Type-safe route names
export const RouteNames = {
  HOME: 'home',
  USER_PROFILE: 'user-profile',
  SETTINGS: 'settings'
} as const

const routes: RouteRecordRaw[] = [
  {
    path: '/',
    name: RouteNames.HOME,
    component: () => import('@/views/HomeView.vue')
  },
  {
    path: '/user/:id',
    name: RouteNames.USER_PROFILE,
    component: () => import('@/views/UserProfile.vue'),
    props: true
  }
]

// Usage with type safety
<script setup>
import { useRouter } from 'vue-router'
import { RouteNames } from '@/router'

const router = useRouter()

const navigateToProfile = (userId: string) => {
  router.push({
    name: RouteNames.USER_PROFILE,
    params: { id: userId }
  })
}
</script>

Advanced Reactivity Patterns

// Advanced reactivity with toRefs, toRef, and shallowRef
<script setup lang="ts">
import { reactive, toRefs, toRef, shallowRef, triggerRef } from 'vue'

// Converting reactive to refs
const state = reactive({
  count: 0,
  user: { name: 'John', age: 30 }
})

const { count, user } = toRefs(state)
const userName = toRef(state.user, 'name')

// Shallow reactivity for performance
const largeData = shallowRef(fetchLargeDataset())

const updateLargeData = () => {
  largeData.value = processData(largeData.value)
  triggerRef(largeData) // Manually trigger update
}
</script>

Component v-model with Script Setup

<!-- CustomInput.vue -->
<script setup lang="ts">
interface Props {
  modelValue: string
  modelModifiers?: { trim?: boolean; lazy?: boolean }
}

const props = defineProps<Props>()
const emit = defineEmits<{
  'update:modelValue': [value: string]
}>()

const handleInput = (e: Event) => {
  let value = (e.target as HTMLInputElement
Read more
@andisab
Ships withswe-marketplace

A collection of Claude Code plugins for everyday software engineering and knowledge work.

2114 skills54 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
21
Star history of andisab/swe-marketplace on GitHub, a chart by star-history.com

Other agents on swe-marketplace.

adv-review

adv-review

Agent

Adversarial multi-model code review with cross-examination. Orchestrates 5 specialized reviewers across Claude, Codex CLI, and…

arch-context-agent

arch-context-agent

Agent

Use this agent to analyze, maintain, and update CLAUDE.md files that provide essential context and guidance for Claude Code when…

context-engineer

context-engineer

Agent

Expert in creating and refining all types of Claude Code resources: sub-agents, skills, plugins, slash commands, hooks, specs,…

data-d3-expert

data-d3-expert

Agent

Expert in D3.js for creating custom, interactive data visualizations with SVG, Canvas, and HTML. Specializes in D3 v7+ with ES…

More agents from other plugins.

a11y-architect
Auto-invoked

a11y-architect

Agent

Accessibility Architect specializing in WCAG 2.2 compliance for Web and Native platforms. Use PROACTIVELY when designing UI…

ecc11d293k
@affaan-m@affaan-mInstall Agent
analyze-pass-impact

analyze-pass-impact

Agent

Analyzes how a specific topic affects a group of compiler passes. Used by the /plan-update skill to parallelize research across…

react1d252k
@facebook@facebookInstall Agent
orchestrator

orchestrator

Agent

- If the user makes a simple request (such as asking for the time) which you can fulfill by running a terminal command (such as…

codextoday135k
@openai@openaiInstall Agent
cavecrew-builder

cavecrew-builder

Agent

Surgical 1-2 file edit. Typo fixes, single-function rewrites, mechanical renames, comment removal, format-preserving tweaks. Hard…

caveman1d119k
@juliusbrussee@juliusbrusseeInstall Agent

Questions about fe-vue-expert.

Which coding agents can use fe-vue-expert?
fe-vue-expert installs in Claude Code and Cursor: each loads subagents from .claude/agents, so copy the file there. Flowy's auto-invocation runs in Claude Code only.