frontend-dev skill
Vue 3 및 React를 위한 코딩 표준을 적용하며, UI 제약 사항, TypeScript 규칙, API 처리 프로토콜을 포함합니다.
- GitHub 스타
- 1,061
- 파일
- 4
- 마지막 커밋
- 2026년 8월 26일
- 라이선스
- —
- 허용된 도구
- —
frontend-dev skill은 무엇을 하나요?
frontend-dev은(는) agent skill입니다. Vue 3 및 React를 위한 코딩 표준을 적용하며, UI 제약 사항, TypeScript 규칙, API 처리 프로토콜을 포함합니다.
skill의 SKILL.md에서 생성된 요약입니다.
frontend-dev skill 정보
이 SKILL은 엔터프라이즈급 웹 애플리케이션을 구축하는 개발자가 Vue 3 및 React에 대한 전문적인 프론트엔드 코딩 표준을 준수할 수 있도록 지원합니다. UI 디자인에 대한 엄격한 프레임워크를 제공하여, 네온 그라데이션, 글래스모피즘, 과도한 장식 요소를 금지하고 절제된 블랙, 화이트, 그레이 팔레트를 사용하여 인터페이스를 깔끔하고 전문적으로 유지합니다.
에이전트가 이 SKILL을 로드하면 .vue, .tsx, .ts 파일을 포함한 다양한 파일 유형에 특정 기술적 제약을 적용합니다. Pinia를 사용하는 Vue 3 또는 Zustand를 사용하는 React 18 구현을 가이드하며, 빌드 도구로 Vite 사용을 의무화합니다. 또한 API 호출 시 제네릭 제약 조건을 요구하고 타입 안정성을 우회하기 위한 any 사용을 금지하는 등 엄격한 TypeScript 규칙을 준수하는 코드를 생성합니다. 아울러 로딩, 빈 상태, 에러와 같은 필수적인 상호작용 상태를 특정 컴포넌트 패턴을 통해 처리하도록 보장합니다.
agent가 수행할 수 있는 작업
- 1Vue 3 컴포넌트 구조 표준화적절한 props, emits, 라이프사이클 훅을 포함한 script setup 패턴의 Vue 3 컴포넌트를 생성합니다.
- 2타입 안정성이 보장된 API 통합 강제unknown을 반환하거나 타입 단언을 사용하는 대신 제네릭을 사용하도록 API 호출 코드를 리팩터링합니다.
- 3일관된 에러 처리 구현모든 네트워크 요청에 에러 처리와 비성공 응답에 대한 사용자 알림이 포함되도록 합니다.
- 4UI 스타일 제약 적용UI 디자인을 검토하여 사이버펑크나 과도한 그라데이션과 같은 금지된 스타일이 사용되지 않았는지 확인합니다.
skill의 SKILL.md를 기반으로 작성되었습니다. 모든 사용 사례는 해당 문서의 인용구와 대조 확인되었습니다.
frontend-dev skill 설치 방법
각 명령은 skill 폴더를 클라이언트의 skills 디렉터리에 복사합니다. 클라이언트를 재시작하거나 새 세션을 시작하여 로드하세요.플러그인에 frontend-dev skill 설치
/plugin marketplace add doccker/cc-use-exp /plugin install cc-use-exp@cc-use-exp
Claude Code에 frontend-dev skill 설치
~/.claude/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev ~/.claude/skills/frontend-devClaude Code (project)에 frontend-dev skill 설치
.claude/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev .claude/skills/frontend-devCodex에 frontend-dev skill 설치
~/.agents/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev ~/.agents/skills/frontend-devGemini CLI에 frontend-dev skill 설치
~/.gemini/skills/frontend-dev/SKILL.md
$ npx degit doccker/cc-use-exp/skills/frontend-dev ~/.gemini/skills/frontend-devClaude.ai에 frontend-dev skill 설치
npx degit doccker/cc-use-exp/skills/frontend-dev frontend-dev && zip -r frontend-dev.zip frontend-dev # claude.ai → Customize → Skills → + → Create skill → Upload a skill → frontend-dev.zip
자동 검사
2026년 11월 15일에 실행됨전체 보고서 →아직 검증되지 않았습니다. 스킬은 점수 80, 심각한 발견 없음, 검사에 충분한 데이터가 필요합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능doccker/cc-use-exp/skills/frontend-dev is public and reachablegithub.com/doccker/cc-use-exp/tree/HEAD/skills/frontend-dev ↗통과
- 오픈 소스 라이선스 (OSI)No license결함 발견
- 최근 1년 내 커밋 또는 릴리스Last commit 2026-08-26github.com/doccker/cc-use-exp/commits ↗통과
- 스크립트에 다운로드 후 실행이나 자격 증명 탈취가 없음No scripts in the skill folder통과
- SKILL.md에 숨겨진 지침 없음No override phrases, safeguard switches, credential requests or hidden charactersgithub.com/doccker/cc-use-exp/blob/HEAD/skills/frontend-dev/ ↗통과
- 사전 허용 도구가 제한됨No pre-approved tools; the agent asks before using onegithub.com/doccker/cc-use-exp/blob/HEAD/skills/frontend-dev/ ↗통과
- SKILL.md가 Agent Skills 형식을 따름the description does not say when to use the skillgithub.com/doccker/cc-use-exp/blob/HEAD/skills/frontend-dev/ ↗결함 발견
SKILL.md
GitHub에서 보기前端开发规范
参考来源: Vue 官方风格指南、Element Plus 最佳实践
UI 风格约束
严格禁止(常见 AI 风格)
- ❌ 蓝紫色霓虹渐变、发光描边、玻璃拟态
- ❌ 大面积渐变、过多装饰性几何图形
- ❌ 赛博风、暗黑科技风、AI 风格 UI
- ❌ UI 文案中使用 emoji
后台系统(默认风格)
| 要素 | 要求 |
|---|---|
| 主题 | 使用组件库默认主题 |
| 配色 | 黑白灰为主 + 1 个主色点缀 |
| 动效 | 克制,仅保留必要交互反馈 |
技术栈
| 层级 | Vue(首选) | React(备选) |
|---|---|---|
| 框架 | Vue 3 + TypeScript | React 18 + TypeScript |
| 构建 | Vite | Vite |
| 路由 | Vue Router 4 | React Router 6 |
| 状态 | Pinia | Zustand |
| UI 库 | Element Plus | Ant Design |
Vue 编码规范
组件基础
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import type { User } from '@/types'
// Props & Emits
const props = defineProps<{ userId: number }>()
const emit = defineEmits<{ (e: 'update', value: string): void }>()
// 响应式状态
const loading = ref(false)
const user = ref<User | null>(null)
// 计算属性
const displayName = computed(() => user.value?.name ?? '未知用户')
// 生命周期
onMounted(async () => { await fetchUser() })
// 方法
async function fetchUser() {
loading.value = true
try {
user.value = await api.getUser(props.userId)
} finally {
loading.value = false
}
}
</script>
<template>
<div class="user-card">
<h3>{{ displayName }}</h3>
</div>
</template>
<style scoped>
.user-card { padding: 16px; }
</style>
命名约定
| 类型 | 约定 | 示例 |
|---|---|---|
| 组件文件 | PascalCase.vue | UserCard.vue |
| Composables | useXxx.ts | useAuth.ts |
| Store | useXxxStore.ts | useUserStore.ts |
状态管理(Pinia)
// stores/user.ts
export const useUserStore = defineStore('user', () => {
const user = ref<User | null>(null)
const token = ref<string>('')
const isLoggedIn = computed(() => !!token.value)
async function login(username: string, password: string) {
const res = await api.login(username, password)
token.value = res.token
user.value = res.user
}
return { user, token, isLoggedIn, login }
})
交互状态处理
必须处理的状态: loading、empty、error、disabled、submitting
<template>
<el-skeleton v-if="loading" :rows="5" animated />
<el-result v-else-if="error" icon="error" :title="error">
<template #extra>
<el-button @click="fetchData">重试</el-button>
</template>
</el-result>
<el-empty v-else-if="list.length === 0" description="暂无数据" />
<template v-else>
<!-- 正常内容 -->
</template>
</template>
TypeScript 规范
// types/user.ts
export interface User {
id: number
username: string
role: 'admin' | 'user'
}
export interface ApiResponse<T = unknown> {
code: number
message: string
data: T
}
API 调用类型安全
| 规则 | 说明 |
|---|---|
| ✅ API 工具函数支持泛型 | get<T>(url): Promise<T> 而非返回 unknown |
| ✅ 调用处指定泛型或断言 | get<UserInfo>(url) 或 data as typeof ref.value |
❌ 禁止 as any 绕过 |
掩盖类型问题,后续维护踩坑 |
// ❌ get() 返回 unknown,赋值报 TS2322
const data = await get('/contact/config')
contact.value = data
// ❌ as any 绕过
contact.value = data as any
// ✅ 泛型约束(推荐)
const data = await get<ContactConfig>('/contact/config')
contact.value = data
// ✅ 类型断言(最小改动)
contact.value = data as typeof contact.value
性能优化
| 场景 | 方案 |
|---|---|
| 大列表 | 虚拟滚动 |
| 路由 | 懒加载 () => import() |
| 计算 | 使用 computed 缓存 |
| 大数据 | 使用 shallowRef |
// 路由懒加载
const routes = [
{ path: '/dashboard', component: () => import('@/views/Dashboard.vue') }
]
// 请求防抖
import { useDebounceFn } from '@vueuse/core'
const debouncedSearch = useDebounceFn((keyword) => api.search(keyword), 300)
目录结构
src/
├── assets/
│ └── styles/ # 全局/共享样式
├── api/ # API 请求
├── components/ # 通用组件
├── composables/ # 组合式函数
├── router/ # 路由配置
├── stores/ # Pinia stores
├── types/ # TypeScript 类型
├── utils/ # 工具函数
├── views/ # 页面组件
├── App.vue
└── main.ts
样式管理规范
| 规则 | 说明 |
|---|---|
❌ 禁止在 .vue 中写大段样式 |
<style> 块不超过 20 行 |
❌ 禁止在 .tsx 中写大段内联样式 |
样式对象/CSS-in-JS 不超过 20 行 |
✅ 共享样式抽到 src/assets/styles/ |
按模块拆分文件 |
| ✅ 组件内只保留极简样式 | Vue: scoped 微调;React: className 引用 |
src/assets/styles/
├── variables.scss # 变量(颜色、间距、字号)
├── common.scss # 通用样式
└── [module].scss # 按模块拆分
请求体完整性规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止 UI 可选字段未传入 API | 用户选择/输入的字段必须全部传入请求体 |
| ✅ 提交函数与表单字段一一对应 | 用 TypeScript interface 约束请求体 |
// ❌ UI 有支付方式选择器,但请求体没传 payMethod
const payMethod = ref<'wechat' | 'points' | 'mixed'>('wechat')
async function createOrder() {
await api.createOrder({
items: orderItems.value,
addressId: selectedAddress.value.id,
// payMethod 忘记传了!支付方式选择 UI 形同虚设
})
}
// ✅ 请求体与 UI 表单字段对应
interface CreateOrderRequest {
items: OrderItem[]
addressId: number
payMethod: 'wechat' | 'points' | 'mixed' // 类型约束确保不遗漏
}
async function createOrder() {
const request: CreateOrderRequest = {
items: orderItems.value,
addressId: selectedAddress.value.id,
payMethod: payMethod.value, // TypeScript 会提示缺少字段
}
await api.createOrder(request)
}
API 错误处理规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止静默忽略非成功响应 | res.code !== 200 时必须提示用户 |
| ✅ 统一错误提示 | 非成功响应统一 message.error 提示 |
| ✅ 网络异常也要处理 | try/catch 捕获请求异常 |
// ❌ 只处理成功,非 200 静默忽略
const res = await api.getList(params)
if (res.code === 200) {
list.value = res.data
}
// ✅ 成功 + 失败都处理
try {
const res = await api.getList(params)
if (res.code === 200) {
list.value = res.data
} else {
message.error(res.message || '加载失败')
}
} catch (e) {
message.error('网络异常,请稍后重试')
}
类型复用规范
| 规则 | 说明 |
|---|---|
| ❌ 禁止多个文件重复定义相同接口 | PageResponse、BaseResult 等 |
✅ 通用类型统一放 @/types/common.ts |
全局导出,各处引用 |
// ❌ 每个 api 文件都定义一遍
// api/user.ts
interface PageResponse<T> { list: T[]; total: number }
// api/order.ts
interface PageResponse<T> { list: T[]; total: number } // 重复
// ✅ 统一定义,各处引用
// types/common.ts
export interface PageResponse<T> {
list: T[]
total: number
}
// api/user.ts
import type { PageResponse } from '@/types/common'
详细参考
| 文件 | 内容 |
|---|---|
references/frontend-style.md |
UI 风格、Vue 3 规范、Pinia、API 封装、性能优化 |
references/miniapp-pitfalls.md |
uni-app 陷阱:页面栈只读、Storage 清理时机、生命周期双触发、前端校验镜像 |
references/date-time.md |
dayjs/date-fns 日期加减、账期计算、禁止月末对齐 |
📋 本回复遵循:
frontend-dev- [具体章节]
이 스킬의 파일
4frontend-dev skill 질문
Claude Code에 frontend-dev skill을 어떻게 설치하나요?
npx degit doccker/cc-use-exp/skills/frontend-dev ~/.claude/skills/frontend-dev를 실행합니다. Claude Code는 ~/.claude/skills(모든 프로젝트) 또는 .claude/skills(한 프로젝트)에서 skills를 로드하며, 설명이 작업과 일치할 때 skill을 사용합니다.
frontend-dev skill을 사용할 수 있는 클라이언트는 무엇인가요?
Agent Skills 형식을 읽는 모든 클라이언트(Claude Code, Codex, Gemini CLI, claude.ai(ZIP으로 업로드))가 사용할 수 있습니다. skill 내 스크립트는 클라이언트가 코드 실행을 허용하는 경우에만 실행됩니다.
금지된 UI 스타일은 무엇인가요?
네온 그라데이션, 글로우 보더, 글래스모피즘, 대규모 그라데이션, 과도한 장식용 기하학적 도형, 사이버/AI 스타일, UI 문구 내 이모지 사용을 엄격히 금지합니다.
API 에러는 어떻게 처리해야 하나요?
성공하지 않은 응답을 무시해서는 안 됩니다. 응답 코드가 200이 아닌 경우 사용자에게 통합된 에러 메시지를 보여주어야 하며, try/catch를 사용하여 네트워크 예외를 처리해야 합니다.
Vue 컴포넌트와 composables의 명명 규칙은 무엇인가요?
컴포넌트 파일은 PascalCase(예: UserCard.vue)를 사용해야 하며, composables는 useXxx.ts 패턴(예: useAuth.ts)을 따라야 합니다.