cli/templates/skills/frontend-vue/SKILL.md
Vue 3 / Nuxt 3 frontend development conventions. Use when working on Vue or Nuxt projects.
npx skillsauth add binhtranquoc/agent-kit-skill frontend-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.
This skill provides specific conventions for Vue 3 and Nuxt 3 frontend development.
project-standards skillAlways use <script setup lang="ts">.
<script setup lang="ts">
import { ref, computed } from 'vue';
interface Props {
title: string;
count?: number;
}
const props = withDefaults(defineProps<Props>(), {
count: 0,
});
const emit = defineEmits<{
(e: 'update', value: number): void;
}>();
const localCount = ref(props.count);
const doubled = computed(() => localCount.value * 2);
function increment() {
localCount.value++;
emit('update', localCount.value);
}
</script>
<template>
<div>
<h1>{{ title }}</h1>
<p>Count: {{ localCount }} (Doubled: {{ doubled }})</p>
<button @click="increment">Increment</button>
</div>
</template>
ref for primitives.reactive for objects.reactive (use toRefs).// Primitives
const count = ref(0);
const isLoading = ref(false);
// Objects
const user = reactive({
name: '',
email: '',
});
// Destructuring reactive (use toRefs)
const { name, email } = toRefs(user);
project/
├── app.vue
├── pages/
│ ├── index.vue # /
│ ├── users/
│ │ ├── index.vue # /users
│ │ └── [id].vue # /users/:id
├── components/
│ ├── Base/
│ │ ├── BaseButton.vue
│ │ └── BaseInput.vue
│ └── User/
│ └── UserCard.vue
├── composables/
│ ├── useAuth.ts
│ └── useApi.ts
├── server/
│ └── api/
│ └── users.ts
└── stores/
└── user.ts
Leverage Nuxt's auto-import. Do not manually import unless necessary.
<script setup lang="ts">
// These are auto-imported in Nuxt
const route = useRoute();
const { data } = await useFetch('/api/users');
// Composables are also auto-imported
const { user, login } = useAuth();
</script>
Extract logic into composables/useFeature.ts.
// composables/useCounter.ts
export function useCounter(initialValue = 0) {
const count = ref(initialValue);
function increment() {
count.value++;
}
function decrement() {
count.value--;
}
return {
count: readonly(count),
increment,
decrement,
};
}
Use Setup Stores syntax.
// stores/user.ts
export const useUserStore = defineStore('user', () => {
const user = ref<User | null>(null);
const isAuthenticated = computed(() => !!user.value);
async function login(credentials: Credentials) {
const response = await $fetch('/api/auth/login', {
method: 'POST',
body: credentials,
});
user.value = response.user;
}
function logout() {
user.value = null;
}
return {
user: readonly(user),
isAuthenticated,
login,
logout,
};
});
PascalCase for component filenames.
components/
├── BaseButton.vue # <BaseButton />
├── UserCard.vue # <UserCard />
└── TheHeader.vue # <TheHeader /> (singleton)
Clearly define with typed interfaces.
<script setup lang="ts">
const emit = defineEmits<{
(e: 'submit', data: FormData): void;
(e: 'cancel'): void;
}>();
</script>
// server/api/users.get.ts
export default defineEventHandler(async (event) => {
const users = await prisma.user.findMany();
return {
success: true,
data: users,
};
});
// server/api/users.post.ts
export default defineEventHandler(async (event) => {
const body = await readBody(event);
const user = await prisma.user.create({
data: body,
});
return {
success: true,
data: user,
};
});
development
Activate Code Reviewer mode for code review and quality assurance. Use when reviewing code for bugs, security issues, or optimization opportunities.
development
Default Implementer mode for writing production code. Use for general coding tasks following project conventions.
development
Activate Debugger mode for systematic bug fixing. Use when debugging errors, investigating issues, or fixing bugs.
testing
Activate Architect mode for system design and architecture decisions. Use when planning features, designing systems, or making architectural choices.