From 5b8c43b2bcb093136b2191e1202f769705e07bca Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 06 八月 2026 15:45:09 +0800
Subject: [PATCH] 银川 1.修改配置

---
 /dev/null         |   95 -----------------------
 .gitignore        |    4 +
 .codex/hooks.json |   29 +++++++
 skills-lock.json  |   83 ++++++++++++++++++++
 4 files changed, 116 insertions(+), 95 deletions(-)

diff --git a/.claude/add-language-rules.md b/.claude/add-language-rules.md
deleted file mode 100644
index 4d17abf..0000000
--- a/.claude/add-language-rules.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-name: add-language-rules
-description: Workflow command scaffold for add-language-rules in everything-claude-code.
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /add-language-rules
-
-Use this workflow when working on **add-language-rules** in `everything-claude-code`.
-
-## Goal
-
-Adds a new programming language to the rules system, including coding style, hooks, patterns, security, and testing guidelines.
-
-## Common Files
-
-- `rules/*/coding-style.md`
-- `rules/*/hooks.md`
-- `rules/*/patterns.md`
-- `rules/*/security.md`
-- `rules/*/testing.md`
-
-## Suggested Sequence
-
-1. Understand the current state and failure mode before editing.
-2. Make the smallest coherent change that satisfies the workflow goal.
-3. Run the most relevant verification for touched files.
-4. Summarize what changed and what still needs review.
-
-## Typical Commit Signals
-
-- Create a new directory under rules/{language}/
-- Add coding-style.md, hooks.md, patterns.md, security.md, and testing.md files with language-specific content
-- Optionally reference or link to related skills
-
-## Notes
-
-- Treat this as a scaffold, not a hard-coded script.
-- Update the command if the workflow evolves materially.
\ No newline at end of file
diff --git a/.claude/api-service.md b/.claude/api-service.md
deleted file mode 100644
index 4c0574c..0000000
--- a/.claude/api-service.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-name: api-service
-description: 鍒涘缓鏂扮殑 API 鏈嶅姟妯″潡锛屽寘鍚� TypeScript 绫诲瀷瀹氫箟
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /api-service
-
-鍒涘缓鏂扮殑 API 鏈嶅姟妯″潡鏃朵娇鐢ㄦ宸ヤ綔娴併��
-
-## 鐩爣
-
-鍒涘缓涓�涓被鍨嬪畨鍏ㄧ殑 API 鏈嶅姟妯″潡锛屽寘鍚纭殑璇锋眰/鍝嶅簲绫诲瀷瀹氫箟銆�
-
-## 甯哥敤鏂囦欢
-
-- `src/api/**/*.ts`
-- `src/services/**/*.ts`
-
-## 寤鸿姝ラ
-
-1. 瀹氫箟璇锋眰/鍝嶅簲鐨� TypeScript 鎺ュ彛
-2. 鍒涘缓甯︾被鍨嬫柟娉曠殑 API 鏈嶅姟瀵硅薄
-3. 瀵煎嚭绫诲瀷鍜屾湇鍔�
-4. 濡傞渶瑕侊紝娣诲姞閿欒澶勭悊
-
-## API 鏈嶅姟妯℃澘
-
-```typescript
-// types.ts
-export interface User {
-  id: number;
-  name: string;
-  email: string;
-  createdAt: string;
-}
-
-export interface UserQuery {
-  page?: number;
-  pageSize?: number;
-  name?: string;
-}
-
-export interface CreateUserDTO {
-  name: string;
-  email: string;
-}
-
-export interface UserListResponse {
-  list: User[];
-  total: number;
-}
-
-// user.ts
-import { request } from '#/utils/request';
-import type { User, UserQuery, CreateUserDTO, UserListResponse } from './types';
-
-export const userApi = {
-  // 鑾峰彇鐢ㄦ埛鍒楄〃
-  getList: (params?: UserQuery) =>
-    request.get<UserListResponse>('/users', { params }),
-
-  // 鏍规嵁ID鑾峰彇鐢ㄦ埛
-  getById: (id: number) =>
-    request.get<User>(`/users/${id}`),
-
-  // 鍒涘缓鐢ㄦ埛
-  create: (data: CreateUserDTO) =>
-    request.post<User>('/users', data),
-
-  // 鏇存柊鐢ㄦ埛
-  update: (id: number, data: Partial<CreateUserDTO>) =>
-    request.put<User>(`/users/${id}`, data),
-
-  // 鍒犻櫎鐢ㄦ埛
-  delete: (id: number) =>
-    request.delete<void>(`/users/${id}`),
-};
-```
-
-## 鍏稿瀷鎻愪氦淇℃伅
-
-- feat: add [妯″潡鍚峕 API service
-- feat: implement [妯″潡鍚峕 API with types
\ No newline at end of file
diff --git a/.claude/database-migration.md b/.claude/database-migration.md
deleted file mode 100644
index 855f94e..0000000
--- a/.claude/database-migration.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-name: database-migration
-description: Workflow command scaffold for database-migration in everything-claude-code.
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /database-migration
-
-Use this workflow when working on **database-migration** in `everything-claude-code`.
-
-## Goal
-
-Database schema changes with migration files
-
-## Common Files
-
-- `**/schema.*`
-- `migrations/*`
-
-## Suggested Sequence
-
-1. Understand the current state and failure mode before editing.
-2. Make the smallest coherent change that satisfies the workflow goal.
-3. Run the most relevant verification for touched files.
-4. Summarize what changed and what still needs review.
-
-## Typical Commit Signals
-
-- Create migration file
-- Update schema definitions
-- Generate/update types
-
-## Notes
-
-- Treat this as a scaffold, not a hard-coded script.
-- Update the command if the workflow evolves materially.
\ No newline at end of file
diff --git a/.claude/feature-development.md b/.claude/feature-development.md
deleted file mode 100644
index 864a880..0000000
--- a/.claude/feature-development.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-name: feature-development
-description: Workflow command scaffold for feature-development in everything-claude-code.
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /feature-development
-
-Use this workflow when working on **feature-development** in `everything-claude-code`.
-
-## Goal
-
-Standard feature implementation workflow
-
-## Common Files
-
-- `manifests/*`
-- `schemas/*`
-- `**/*.test.*`
-- `**/api/**`
-
-## Suggested Sequence
-
-1. Understand the current state and failure mode before editing.
-2. Make the smallest coherent change that satisfies the workflow goal.
-3. Run the most relevant verification for touched files.
-4. Summarize what changed and what still needs review.
-
-## Typical Commit Signals
-
-- Add feature implementation
-- Add tests for feature
-- Update documentation
-
-## Notes
-
-- Treat this as a scaffold, not a hard-coded script.
-- Update the command if the workflow evolves materially.
\ No newline at end of file
diff --git a/.claude/pinia-store.md b/.claude/pinia-store.md
deleted file mode 100644
index a3f238a..0000000
--- a/.claude/pinia-store.md
+++ /dev/null
@@ -1,99 +0,0 @@
----
-name: pinia-store
-description: 鍒涘缓鏂扮殑 Pinia 鐘舵�佸瓨鍌紝鍖呭惈 TypeScript 绫诲瀷
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /pinia-store
-
-鍒涘缓鏂扮殑 Pinia 鐘舵�佸瓨鍌ㄦ椂浣跨敤姝ゅ伐浣滄祦銆�
-
-## 鐩爣
-
-浣跨敤 Composition API 椋庢牸鍒涘缓绫诲瀷瀹夊叏鐨� Pinia 鐘舵�佸瓨鍌ㄣ��
-
-## 甯哥敤鏂囦欢
-
-- `src/stores/**/*.ts`
-- `src/**/store.ts`
-
-## 寤鸿姝ラ
-
-1. 瀹氫箟鐘舵�佹帴鍙�
-2. 浣跨敤 setup 璇硶鍒涘缓 store
-3. 娣诲姞璁$畻灞炴�э紙getters锛�
-4. 娣诲姞鎿嶄綔鏂规硶锛坅ctions锛�
-5. 濡傞渶瑕侊紝閰嶇疆鎸佷箙鍖�
-
-## Pinia Store 妯℃澘
-
-```typescript
-// stores/user.ts
-import { ref, computed } from 'vue';
-import { defineStore } from 'pinia';
-import type { User } from '#/api/types';
-
-interface UserState {
-  user: User | null;
-  token: string | null;
-}
-
-export const useUserStore = defineStore(
-  'user',
-  () => {
-    // 鐘舵��
-    const user = ref<User | null>(null);
-    const token = ref<string | null>(null);
-
-    // 璁$畻灞炴�� (Getters)
-    const isLoggedIn = computed(() => !!token.value && !!user.value);
-    const userName = computed(() => user.value?.name ?? '');
-    const userRoles = computed(() => user.value?.roles ?? []);
-
-    // 鎿嶄綔鏂规硶 (Actions)
-    const setUser = (newUser: User) => {
-      user.value = newUser;
-    };
-
-    const setToken = (newToken: string) => {
-      token.value = newToken;
-    };
-
-    const logout = () => {
-      user.value = null;
-      token.value = null;
-    };
-
-    const hasRole = (role: string) => {
-      return userRoles.value.includes(role);
-    };
-
-    return {
-      // 鐘舵��
-      user,
-      token,
-      // 璁$畻灞炴��
-      isLoggedIn,
-      userName,
-      userRoles,
-      // 鎿嶄綔鏂规硶
-      setUser,
-      setToken,
-      logout,
-      hasRole,
-    };
-  },
-  {
-    persist: {
-      key: 'user-store',
-      storage: localStorage,
-      pick: ['token'], // 鍙寔涔呭寲 token锛屼笉鎸佷箙鍖栫敤鎴峰璞�
-    },
-  }
-);
-```
-
-## 鍏稿瀷鎻愪氦淇℃伅
-
-- feat: add [Store鍚峕 store
-- feat: implement [Store鍚峕 state management
\ No newline at end of file
diff --git a/.claude/rules/typescript.md b/.claude/rules/typescript.md
deleted file mode 100644
index e2f700b..0000000
--- a/.claude/rules/typescript.md
+++ /dev/null
@@ -1,135 +0,0 @@
----
-paths:
-  - "**/*.ts"
-  - "**/*.vue"
----
-
-# TypeScript 鍓嶇寮�鍙戣鍒�
-
-> 鍩轰簬 ECC TypeScript 瑙勫垯鎵╁睍锛岄�傞厤 Vue Vben Admin 椤圭洰銆�
-
-## 绫诲瀷瀹氫箟
-
-### 绂佹 any
-
-```typescript
-// 鉂� 閿欒锛氫娇鐢� any
-function handleData(data: any) {
-  return data.value;
-}
-
-// 鉁� 姝g‘锛氫娇鐢ㄥ叿浣撶被鍨�
-interface DataType {
-  value: string;
-}
-
-function handleData(data: DataType) {
-  return data.value;
-}
-
-// 鉁� 姝g‘锛氫娇鐢� unknown + 绫诲瀷瀹堝崼
-function getErrorMessage(error: unknown): string {
-  if (error instanceof Error) {
-    return error.message;
-  }
-  return '鏈煡閿欒';
-}
-```
-
-### import type
-
-```typescript
-// 鉁� 姝g‘锛氱被鍨嬪鍏ヤ娇鐢� import type
-import type { UserInfo } from '#/api/system/user';
-import type { VxeTableGridOptions } from '#/adapter/vxe-table';
-
-// 鉂� 閿欒锛氭櫘閫氬鍏ョ被鍨�
-import { UserInfo } from '#/api/system/user';
-```
-
-### 鎺ュ彛瀹氫箟
-
-```typescript
-// 鉁� 姝g‘锛氬疄浣撴帴鍙�
-export namespace UserApi {
-  export interface User {
-    id?: number;
-    username: string;
-    nickname?: string;
-    status: number;
-  }
-}
-
-// 鉁� 姝g‘锛歅rops 鎺ュ彛
-interface Props {
-  userId: number;
-  userName?: string;
-}
-
-const props = withDefaults(defineProps<Props>(), {
-  userName: '',
-});
-```
-
-## 涓嶅彲鍙樻��
-
-```typescript
-// 鉂� 閿欒锛氱洿鎺ヤ慨鏀� props
-props.userName = 'new name';
-
-// 鉁� 姝g‘锛氫娇鐢� emit 鏇存柊
-emit('update:userName', 'new name');
-
-// 鉁� 姝g‘锛氫娇鐢ㄥ睍寮�杩愮畻绗�
-const newUser = { ...user, name: 'new name' };
-```
-
-## 閿欒澶勭悊
-
-```typescript
-// 鉁� 姝g‘锛歛sync/await + try-catch
-async function loadUser(id: number) {
-  try {
-    const user = await getUser(id);
-    return user;
-  } catch (error: unknown) {
-    if (error instanceof Error) {
-      message.error(error.message);
-    }
-    throw error;
-  }
-}
-```
-
-## 璺緞鍒悕
-
-```typescript
-// 鉁� 姝g‘锛氫娇鐢� # 鍒悕
-import { getUser } from '#/api/system/user';
-import DictTag from '#/components/dict-tag/dict-tag.vue';
-
-// 鉂� 閿欒锛氫娇鐢ㄧ浉瀵硅矾寰�
-import { getUser } from '../../../api/system/user';
-```
-
-## 缁勪欢鍛藉悕
-
-```typescript
-// 鉁� 姝g‘锛氱粍浠舵枃浠跺悕 PascalCase
-UserList.vue
-DictTag.vue
-TableAction.vue
-
-// 鉁� 姝g‘锛氬畾涔夌粍浠跺悕
-defineOptions({ name: 'UserList' });
-```
-
-## 鎺у埗鍙拌緭鍑�
-
-```typescript
-// 鉂� 绂佹锛歝onsole.log 鍦ㄧ敓浜т唬鐮佷腑
-console.log('debug info');
-
-// 鉁� 姝g‘锛氫娇鐢ㄦ棩蹇楀簱鎴栫Щ闄�
-// 鐢熶骇鐜绉婚櫎鎵�鏈夎皟璇曡緭鍑�
-```
\ No newline at end of file
diff --git a/.claude/rules/vue-component.md b/.claude/rules/vue-component.md
deleted file mode 100644
index 922b860..0000000
--- a/.claude/rules/vue-component.md
+++ /dev/null
@@ -1,166 +0,0 @@
----
-paths:
-  - "**/*.vue"
----
-
-# Vue 缁勪欢寮�鍙戣鍒�
-
-> 鍩轰簬 Vue Vben Admin 椤圭洰瑙勮寖銆�
-
-## 缁勪欢缁撴瀯
-
-### script setup
-
-```vue
-<script lang="ts" setup>
-// 1. 缁勪欢鍛藉悕锛堝繀椤伙級
-defineOptions({ name: 'ComponentName' });
-
-// 2. 绫诲瀷瀵煎叆
-import type { PropType } from './types';
-
-// 3. Props 瀹氫箟
-interface Props {
-  id: number;
-  name?: string;
-}
-
-const props = withDefaults(defineProps<Props>(), {
-  name: '',
-});
-
-// 4. Emits 瀹氫箟
-interface Emits {
-  (e: 'update', value: string): void;
-  (e: 'delete', id: number): void;
-}
-
-const emit = defineEmits<Emits>();
-
-// 5. 鍝嶅簲寮忕姸鎬�
-const loading = ref(false);
-
-// 6. 璁$畻灞炴��
-const displayName = computed(() => props.name || '鏈懡鍚�');
-
-// 7. 鏂规硶
-function handleSubmit() {
-  emit('update', displayName.value);
-}
-</script>
-
-<template>
-  <div class="component-name">
-    <!-- 妯℃澘鍐呭 -->
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.component-name {
-  /* 鏍峰紡 */
-}
-</style>
-```
-
-## Props 瑙勮寖
-
-```vue
-<script lang="ts" setup>
-// 鉁� 姝g‘锛氫娇鐢� withDefaults + defineProps
-interface Props {
-  userId: number;
-  userName?: string;
-}
-
-const props = withDefaults(defineProps<Props>(), {
-  userName: '',
-});
-
-// 鉂� 閿欒锛氫娇鐢ㄨ繍琛屾椂澹版槑
-const props = defineProps({
-  userId: { type: Number, required: true },
-  userName: { type: String, default: '' },
-});
-</script>
-```
-
-## Emits 瑙勮寖
-
-```vue
-<script lang="ts" setup>
-// 鉁� 姝g‘锛氱被鍨嬪寲 Emits
-interface Emits {
-  (e: 'update', value: string): void;
-  (e: 'delete', id: number): void;
-  (e: 'change', data: { id: number; name: string }): void;
-}
-
-const emit = defineEmits<Emits>();
-
-// 鉂� 閿欒锛氳繍琛屾椂澹版槑
-const emit = defineEmits(['update', 'delete']);
-</script>
-```
-
-## 鏍峰紡瑙勮寖
-
-```vue
-<template>
-  <!-- 鉁� 姝g‘锛氫紭鍏堜娇鐢� Tailwind CSS -->
-  <div class="flex items-center p-4 bg-white rounded-lg">
-    <span class="text-base font-medium text-gray-900">鏍囬</span>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-/* 鉁� 姝g‘锛氱粍浠舵牱寮忎娇鐢� scoped */
-.component-name {
-  /* 鉁� 姝g‘锛氶鑹蹭娇鐢� CSS 鍙橀噺 */
-  background-color: var(--component-background);
-
-  /* 鉁� 姝g‘锛氳鐩栫粍浠跺簱鏍峰紡浣跨敤 :deep */
-  :deep(.ant-table) {
-    border-radius: 8px;
-  }
-}
-
-/* 鉂� 閿欒锛氱‖缂栫爜棰滆壊 */
-.bad-style {
-  background-color: #ffffff;
-}
-</style>
-```
-
-## 缁勪欢鍛藉悕
-
-| 绫诲瀷 | 鍛藉悕瑙勫垯 | 绀轰緥 |
-|-----|---------|-----|
-| 椤甸潰缁勪欢 | 涓庣洰褰曞悕涓�鑷� | `UserList.vue` 鈫� `name: 'UserList'` |
-| 琛ㄥ崟寮圭獥 | 鍔熻兘 + Form | `UserForm.vue` 鈫� `name: 'UserForm'` |
-| 璇︽儏寮圭獥 | 鍔熻兘 + Detail | `UserDetail.vue` 鈫� `name: 'UserDetail'` |
-| 閫夋嫨鍣� | 鍔熻兘 + Select | `UserSelect.vue` 鈫� `name: 'UserSelect'` |
-| 鍒楄〃缁勪欢 | 鍔熻兘 + List | `UserBomList.vue` 鈫� `name: 'UserBomList'` |
-
-## 瀵煎叆璺緞
-
-```vue
-<script lang="ts" setup>
-// 鉁� 姝g‘锛氫娇鐢� # 鍒悕
-import { getUser } from '#/api/system/user';
-import DictTag from '#/components/dict-tag/dict-tag.vue';
-import { useVbenForm } from '#/adapter/form';
-
-// 鉁� 姝g‘锛氱浉瀵硅矾寰勫鍏ュ悓鐩綍
-import Form from './modules/form.vue';
-import { useGridColumns } from './data';
-</script>
-```
-
-## 娉ㄦ剰浜嬮」
-
-1. **蹇呴』浣跨敤 `defineOptions` 瀹氫箟缁勪欢鍚�**
-2. **缁熶竴浣跨敤 `<script setup lang="ts">` 璇硶**
-3. **Props 浣跨敤 `withDefaults` + `defineProps<T>()`**
-4. **Emits 浣跨敤 `defineEmits<T>()`**
-5. **鏍峰紡浼樺厛浣跨敤 Tailwind CSS**
-6. **缁勪欢鏍峰紡蹇呴』 `scoped`**
\ No newline at end of file
diff --git a/.claude/settings.local.json b/.claude/settings.local.json
deleted file mode 100644
index b82122e..0000000
--- a/.claude/settings.local.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "permissions": {
-    "allow": [
-      "WebFetch(domain:github.com)",
-      "Bash(gh repo *)",
-      "WebSearch",
-      "PowerShell(pnpm typecheck *)",
-      "PowerShell(pnpm dev *)",
-      "PowerShell(Get-ChildItem -Path \"D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\\\\src\\\\views\\\\mes\" -Directory -Recurse | Where-Object { $_.GetDirectories\\(\\).Count -gt 0 -or $_.Parent.Name -in @\\('mes','md','pro','process-design','cal','dv','qc','wm','tm','pd'\\) } | Select-Object -ExpandProperty FullName | ForEach-Object { $_.Substring\\(66\\) })",
-      "PowerShell(cd \"D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\"; Get-ChildItem -Path \"src/views/mes\" -Directory -Recurse | Select-Object -ExpandProperty FullName | ForEach-Object { $_.Replace\\('D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\\\\', ''\\) })",
-      "PowerShell(cd \"D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\"; Get-ChildItem -Path \"src/api/mes\" -Recurse -File | Select-Object -ExpandProperty FullName | ForEach-Object { $_.Replace\\('D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\\\\', ''\\) })",
-      "PowerShell(cd \"D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\"; Get-ChildItem -Path \"src/router\" -Recurse -File | Select-Object -ExpandProperty FullName | ForEach-Object { $_.Replace\\('D:\\\\宸ヤ綔\\\\鑺鍏徃\\\\椤圭洰\\\\杩涢攢瀛榎\\\mom-pro2-before\\\\', ''\\) })",
-      "Bash(pnpm approve-builds *)",
-      "Bash(pnpm list *)",
-      "Bash(pnpm search *)",
-      "Bash(pnpm add *)",
-      "Bash(pnpm exec *)",
-      "Bash(pnpm stub *)",
-      "Bash(pnpm dev *)",
-      "Bash(Get-Content \"C:\\\\Users\\\\浜慭\\\AppData\\\\Local\\\\Temp\\\\claude\\\\D-----------mom-pro2-after-mom-pro2-before\\\\3ceea64d-d347-46b2-88a2-57009ccd0961\\\\tasks\\\\bak5v4put.output\")",
-      "Bash(pnpm rebuild *)",
-      "Bash(node lib/script/postinstall.js)",
-      "Bash(mvn compile *)"
-    ]
-  },
-  "enabledMcpjsonServers": [
-    "idea"
-  ],
-  "enableAllProjectMcpServers": true
-}
diff --git a/.claude/skills/antd-vue-components/SKILL.md b/.claude/skills/antd-vue-components/SKILL.md
deleted file mode 100644
index 97f402c..0000000
--- a/.claude/skills/antd-vue-components/SKILL.md
+++ /dev/null
@@ -1,212 +0,0 @@
----
-name: antd-vue-components
-description: Ant Design Vue 缁勪欢寮�鍙戞ā寮忓拰鏈�浣冲疄璺�
----
-
-# Ant Design Vue 缁勪欢鎶�鑳�
-
-## 浣曟椂浣跨敤
-
-鍦ㄤ互涓嬪満鏅縺娲绘鎶�鑳斤細
-- 浣跨敤 Ant Design Vue 缁勪欢鏋勫缓琛ㄥ崟
-- 鍒涘缓 Vxe-Table 鎴� Ant Design 琛ㄦ牸
-- 瀹炵幇妯℃�佹鍜屾娊灞夌粍浠�
-- 浣跨敤 Ant Design 琛ㄥ崟楠岃瘉
-- 鑷畾涔� Ant Design 涓婚
-
-## 宸ヤ綔鍘熺悊
-
-姝ゆ妧鑳戒负 Ant Design Vue 4.x 寮�鍙戞ā寮忔彁渚涙寚瀵笺��
-
-## 鎶�鏈爤
-
-- **Ant Design Vue**: 4.2.x
-- **Vxe-Table**: 4.19.x锛堢敤浜庡鏉傝〃鏍硷級
-- **琛ㄥ崟楠岃瘉**: VeeValidate + Zod schema
-- **鍥炬爣**: @iconify/vue 鍜� @lucide/vue
-
-## 甯哥敤妯″紡
-
-### 甯﹂獙璇佺殑琛ㄥ崟
-
-```vue
-<script setup lang="ts">
-import { useForm } from 'vee-validate';
-import { toTypedSchema } from '@vee-validate/zod';
-import { z } from 'zod';
-
-const schema = toTypedSchema(
-  z.object({
-    username: z.string().min(3, '鐢ㄦ埛鍚嶈嚦灏�3涓瓧绗�'),
-    email: z.string().email('閭鏍煎紡涓嶆纭�'),
-    role: z.enum(['admin', 'user', 'guest']),
-  })
-);
-
-const { handleSubmit, setFieldValue, values } = useForm({
-  validationSchema: schema,
-  initialValues: {
-    username: '',
-    email: '',
-    role: 'user',
-  },
-});
-
-const onSubmit = handleSubmit(async (values) => {
-  // 绫诲瀷瀹夊叏鐨� values
-  console.log(values);
-});
-</script>
-
-<template>
-  <a-form @submit="onSubmit">
-    <a-form-item label="鐢ㄦ埛鍚�" name="username">
-      <a-input v-model:value="values.username" />
-    </a-form-item>
-    <a-form-item label="閭" name="email">
-      <a-input v-model:value="values.email" type="email" />
-    </a-form-item>
-    <a-form-item label="瑙掕壊" name="role">
-      <a-select v-model:value="values.role">
-        <a-select-option value="admin">绠$悊鍛�</a-select-option>
-        <a-select-option value="user">鐢ㄦ埛</a-select-option>
-        <a-select-option value="guest">璁垮</a-select-option>
-      </a-select>
-    </a-form-item>
-    <a-button type="primary" html-type="submit">鎻愪氦</a-button>
-  </a-form>
-</template>
-```
-
-### 甯︽搷浣滃垪鐨勮〃鏍�
-
-```vue
-<script setup lang="ts">
-import { ref, computed } from 'vue';
-import type { TableColumn } from '#/types';
-
-interface User {
-  id: number;
-  name: string;
-  email: string;
-  status: 'active' | 'inactive';
-}
-
-const columns: TableColumn<User>[] = [
-  { title: '濮撳悕', dataIndex: 'name', key: 'name' },
-  { title: '閭', dataIndex: 'email', key: 'email' },
-  {
-    title: '鐘舵��',
-    dataIndex: 'status',
-    key: 'status',
-    customRender: ({ text }) => text === 'active' ? '鍚敤' : '绂佺敤',
-  },
-  {
-    title: '鎿嶄綔',
-    key: 'actions',
-    width: 150,
-  },
-];
-
-const dataSource = ref<User[]>([]);
-const loading = ref(false);
-
-const handleEdit = (record: User) => {
-  // 缂栬緫閫昏緫
-};
-
-const handleDelete = (id: number) => {
-  // 鍒犻櫎閫昏緫
-};
-</script>
-
-<template>
-  <a-table
-    :columns="columns"
-    :data-source="dataSource"
-    :loading="loading"
-    row-key="id"
-  >
-    <template #bodyCell="{ column, record }">
-      <template v-if="column.key === 'actions'">
-        <a-space>
-          <a-button type="link" @click="handleEdit(record)">缂栬緫</a-button>
-          <a-popconfirm
-            title="纭畾瑕佸垹闄ゅ悧锛�"
-            @confirm="handleDelete(record.id)"
-          >
-            <a-button type="link" danger>鍒犻櫎</a-button>
-          </a-popconfirm>
-        </a-space>
-      </template>
-    </template>
-  </a-table>
-</template>
-```
-
-### 妯℃�佹
-
-```vue
-<script setup lang="ts">
-import { ref } from 'vue';
-
-const visible = ref(false);
-const loading = ref(false);
-
-const open = () => {
-  visible.value = true;
-};
-
-const handleOk = async () => {
-  loading.value = true;
-  try {
-    // 淇濆瓨閫昏緫
-    visible.value = false;
-  } finally {
-    loading.value = false;
-  }
-};
-
-const handleCancel = () => {
-  visible.value = false;
-};
-
-defineExpose({ open });
-</script>
-
-<template>
-  <a-modal
-    v-model:open="visible"
-    title="瀵硅瘽妗嗘爣棰�"
-    :confirm-loading="loading"
-    @ok="handleOk"
-    @cancel="handleCancel"
-  >
-    <p>妯℃�佹鍐呭</p>
-  </a-modal>
-</template>
-```
-
-## 鏈�浣冲疄璺�
-
-### 鎺ㄨ崘
-
-- 澶嶆潅琛ㄥ崟楠岃瘉浣跨敤 VeeValidate + Zod
-- Ant Design 杈撳叆妗嗕娇鐢� `v-model:value`
-- 鍦ㄦā鏉垮瑙f瀯琛ㄦ牸鍒楀畾涔�
-- 鍗遍櫓鎿嶄綔浣跨敤 `a-popconfirm` 纭
-- 璁剧疆琛ㄦ牸 `row-key` 鎻愬崌鎬ц兘
-
-### 閬垮厤
-
-- 涓嶈娣风敤 Ant Design 3.x 鍜� 4.x API
-- 涓嶈蹇樿澶勭悊鍔犺浇鐘舵��
-- 涓嶈浣跨敤鍐呰仈鏍峰紡 - 浣跨敤 Tailwind 鎴� scoped CSS
-
-## Vxe-Table 澶嶆潅琛ㄦ牸
-
-浠ヤ笅鍦烘櫙浣跨敤 Vxe-Table锛�
-- 澶ф暟鎹泦铏氭嫙婊氬姩
-- Excel 椋庢牸缂栬緫
-- 澶嶆潅鍗曞厓鏍煎悎骞�
-- 鏍戝舰鏁版嵁灞曞紑/鎶樺彔
diff --git a/.claude/skills/api-service-pattern.md b/.claude/skills/api-service-pattern.md
deleted file mode 100644
index ddb07ce..0000000
--- a/.claude/skills/api-service-pattern.md
+++ /dev/null
@@ -1,213 +0,0 @@
----
-name: api-service-pattern
-description: API 鎺ュ彛瀹氫箟妯″紡锛屽寘鎷被鍨嬪畾涔夈�佹帴鍙e嚱鏁般�佸垎椤垫煡璇€�佸懡鍚嶇┖闂磋鑼冦��
-origin: ECC
----
-
-# API 鎺ュ彛瀹氫箟妯″紡
-
-椤圭洰 API 鎺ュ彛寮�鍙戣鑼冿紝浣跨敤 namespace 缁勭粐绫诲瀷鍜屽嚱鏁般��
-
-## When to Use
-
-- 鍒涘缓鏂扮殑 API 鎺ュ彛鏂囦欢
-- 瀹氫箟鎺ュ彛璇锋眰/鍝嶅簲绫诲瀷
-- 缂栧啓 CRUD 鎺ュ彛鍑芥暟
-- 澶勭悊鍒嗛〉鏌ヨ
-
-## 鏂囦欢缁撴瀯
-
-```
-src/api/
-鈹斺攢鈹� mes/
-    鈹斺攢鈹� pro/
-        鈹斺攢鈹� workorder/
-            鈹溾攢鈹� index.ts          # 宸ュ崟鎺ュ彛
-            鈹斺攢鈹� bom/
-                鈹斺攢鈹� index.ts      # 宸ュ崟 BOM 鎺ュ彛
-```
-
-## 鎺ュ彛瀹氫箟妯℃澘
-
-```typescript
-import type { PageParam, PageResult } from '@vben/request';
-
-import { requestClient } from '#/api/request';
-
-export namespace WorkOrderApi {
-  /** 宸ュ崟淇℃伅 */
-  export interface WorkOrder {
-    id?: number;                    // 缂栧彿
-    code?: string;                  // 缂栫爜
-    name?: string;                  // 鍚嶇О
-    status?: number;                // 鐘舵��
-    createTime?: number;            // 鍒涘缓鏃堕棿
-  }
-
-  /** 鍒嗛〉鏌ヨ鍙傛暟 */
-  export interface PageParams extends PageParam {
-    code?: string;
-    name?: string;
-    status?: number;
-  }
-}
-
-/** 鏌ヨ宸ュ崟鍒嗛〉 */
-export function getWorkOrderPage(params: WorkOrderApi.PageParams) {
-  return requestClient.get<PageResult<WorkOrderApi.WorkOrder>>(
-    '/mes/pro/work-order/page',
-    { params },
-  );
-}
-
-/** 鏌ヨ宸ュ崟璇︽儏 */
-export function getWorkOrder(id: number) {
-  return requestClient.get<WorkOrderApi.WorkOrder>(
-    `/mes/pro/work-order/get?id=${id}`,
-  );
-}
-
-/** 鏂板宸ュ崟 */
-export function createWorkOrder(data: WorkOrderApi.WorkOrder) {
-  return requestClient.post<number>('/mes/pro/work-order/create', data);
-}
-
-/** 淇敼宸ュ崟 */
-export function updateWorkOrder(data: WorkOrderApi.WorkOrder) {
-  return requestClient.put('/mes/pro/work-order/update', data);
-}
-
-/** 鍒犻櫎宸ュ崟 */
-export function deleteWorkOrder(id: number) {
-  return requestClient.delete(`/mes/pro/work-order/delete?id=${id}`);
-}
-
-/** 瀵煎嚭宸ュ崟 */
-export function exportWorkOrder(params: any) {
-  return requestClient.download('/mes/pro/work-order/export-excel', { params });
-}
-```
-
-## 绫诲瀷瀹氫箟瑙勮寖
-
-### 瀹炰綋鎺ュ彛
-
-```typescript
-export namespace ItemApi {
-  /** 鐗╂枡淇℃伅 */
-  export interface Item {
-    id?: number;                    // 缂栧彿锛堝彲閫夛紝鏂板鏃舵棤锛�
-    code: string;                   // 缂栫爜锛堝繀濉級
-    name: string;                   // 鍚嶇О锛堝繀濉級
-    specification?: string;         // 瑙勬牸鍨嬪彿
-    unitMeasureId?: number;         // 鍗曚綅缂栧彿
-    unitMeasureName?: string;       // 鍗曚綅鍚嶇О锛堝啑浣欏瓧娈碉級
-    status?: number;                // 鐘舵��
-    remark?: string;                // 澶囨敞
-    createTime?: number;            // 鍒涘缓鏃堕棿
-  }
-}
-```
-
-### 鍒嗛〉鍙傛暟
-
-```typescript
-export namespace ItemApi {
-  /** 鍒嗛〉鏌ヨ鍙傛暟 */
-  export interface PageParams extends PageParam {
-    code?: string;                  // 缂栫爜锛堟ā绯婏級
-    name?: string;                  // 鍚嶇О锛堟ā绯婏級
-    status?: number;                // 鐘舵��
-    categoryId?: number;            // 鍒嗙被缂栧彿
-    createTime?: number[];          // 鍒涘缓鏃堕棿鑼冨洿
-  }
-}
-```
-
-### 鍒楄〃鎺ュ彛
-
-```typescript
-export namespace ProcessApi {
-  /** 宸ュ簭绮剧畝淇℃伅锛堜笅鎷夐�夋嫨鐢級 */
-  export interface ProcessSimple {
-    id: number;
-    code: string;
-    name: string;
-  }
-}
-
-/** 鏌ヨ宸ュ簭鍒楄〃 */
-export function getProcessList(params?: ProcessApi.ListParams) {
-  return requestClient.get<ProcessApi.Process[]>(
-    '/mes/pro/process/list',
-    { params },
-  );
-}
-
-/** 鏌ヨ宸ュ簭绮剧畝鍒楄〃 */
-export function getProcessSimpleList() {
-  return requestClient.get<ProcessApi.ProcessSimple[]>(
-    '/mes/pro/process/simple-list',
-  );
-}
-```
-
-## 璇锋眰鏂规硶鏄犲皠
-
-| 鎿嶄綔 | 鏂规硶 | URL 鏍煎紡 | 杩斿洖绫诲瀷 |
-|-----|------|---------|---------|
-| 鍒嗛〉鏌ヨ | GET | `/module/page` | `PageResult<T>` |
-| 鍒楄〃鏌ヨ | GET | `/module/list` | `T[]` |
-| 绮剧畝鍒楄〃 | GET | `/module/simple-list` | `SimpleT[]` |
-| 璇︽儏鏌ヨ | GET | `/module/get?id=` | `T` |
-| 鏂板 | POST | `/module/create` | `number` |
-| 淇敼 | PUT | `/module/update` | `void` |
-| 鍒犻櫎 | DELETE | `/module/delete?id=` | `void` |
-| 瀵煎嚭 | GET | `/module/export-excel` | `Blob` |
-
-## 瀛愭ā鍧楁帴鍙�
-
-瀛愭ā鍧楁帴鍙f斁鍦ㄧ埗妯″潡鐩綍涓嬶細
-
-```
-src/api/mes/pro/workorder/
-鈹溾攢鈹� index.ts          # 宸ュ崟鎺ュ彛
-鈹斺攢鈹� bom/
-    鈹斺攢鈹� index.ts      # 宸ュ崟 BOM 鎺ュ彛
-```
-
-```typescript
-// bom/index.ts
-export namespace WorkOrderBomApi {
-  export interface WorkOrderBom {
-    id?: number;
-    workOrderId?: number;           // 鍏宠仈鐖惰〃
-    itemId?: number;
-    itemName?: string;
-    quantity?: number;
-  }
-
-  export interface PageParams extends PageParam {
-    workOrderId?: number;           // 蹇呴』鏈夌埗琛� ID
-  }
-}
-```
-
-## 瀵煎叆浣跨敤
-
-```typescript
-// 瀵煎叆绫诲瀷
-import type { WorkOrderApi } from '#/api/mes/pro/workorder';
-import type { WorkOrderBomApi } from '#/api/mes/pro/workorder/bom';
-
-// 瀵煎叆鍑芥暟
-import { getWorkOrderPage, createWorkOrder } from '#/api/mes/pro/workorder';
-```
-
-## 娉ㄦ剰浜嬮」
-
-1. **浣跨敤 namespace 缁勭粐绫诲瀷**锛氶伩鍏嶇被鍨嬪懡鍚嶅啿绐�
-2. **瀹炰綋瀛楁鍏ㄩ儴鍙��**锛氶�傚簲鏂板/缂栬緫/鏌ヨ鍦烘櫙
-3. **鍒嗛〉鍙傛暟缁ф壙 PageParam**锛氬寘鍚� `pageNo`銆乣pageSize`
-4. **杩斿洖绫诲瀷鏄庣‘鎸囧畾**锛歚requestClient.get<T>`
-5. **璺緞鍙傛暟浣跨敤妯℃澘瀛楃涓�**锛歚/module/get?id=${id}`
\ No newline at end of file
diff --git a/.claude/skills/frontend-code-review/SKILL.md b/.claude/skills/frontend-code-review/SKILL.md
deleted file mode 100644
index 124769d..0000000
--- a/.claude/skills/frontend-code-review/SKILL.md
+++ /dev/null
@@ -1,168 +0,0 @@
----
-name: frontend-code-review
-description: Vue 3 + TypeScript 椤圭洰鍓嶇浠g爜瀹℃煡鎸囧崡
----
-
-# 鍓嶇浠g爜瀹℃煡鎶�鑳�
-
-## 浣曟椂浣跨敤
-
-鍦ㄤ互涓嬪満鏅縺娲绘鎶�鑳斤細
-- 瀹℃煡 Pull Request
-- 杩涜 Vue 缁勪欢浠g爜瀹℃煡
-- 妫�鏌ュ畨鍏ㄦ紡娲�
-- 楠岃瘉 TypeScript 绫诲瀷瀹夊叏
-- 瀹℃煡鎬ц兘浼樺寲
-
-## 宸ヤ綔鍘熺悊
-
-姝ゆ妧鑳芥彁渚涘墠绔唬鐮佸鏌ョ殑妫�鏌ユ竻鍗曞拰鎸囧崡銆�
-
-## 瀹℃煡娓呭崟
-
-### TypeScript 鍜岀被鍨�
-
-- [ ] 娌℃湁涓嶅悎鐞嗙殑 `any` 绫诲瀷
-- [ ] Props 鍜� Emits 鏈夋纭殑 TypeScript 鎺ュ彛
-- [ ] API 鍝嶅簲鏈夌被鍨嬫帴鍙�
-- [ ] 姝g‘浣跨敤娉涘瀷
-- [ ] 绫诲瀷瀵煎叆浣跨敤 `import type` 璇硶
-
-### Vue 缁勪欢
-
-- [ ] 浣跨敤 `<script setup>` 璇硶
-- [ ] 鍙�� Props 鏈夐粯璁ゅ��
-- [ ] Emits 浣跨敤 TypeScript 绫诲瀷
-- [ ] 娌℃湁鐩存帴淇敼 props
-- [ ] 姝g‘浣跨敤 `computed` vs `watch`
-- [ ] 鍦� `onUnmounted` 涓竻鐞嗗壇浣滅敤
-
-### 瀹夊叏鎬�
-
-- [ ] 娌℃湁 XSS 婕忔礊锛堢敤鎴峰唴瀹逛娇鐢� `v-dompurify-html`锛�
-- [ ] 娌℃湁纭紪鐮佺殑瀵嗛挜鎴� API Key
-- [ ] 鐢ㄦ埛杈撳叆宸茶繃婊�
-- [ ] 鏁忔劅鏁版嵁涓嶅湪 localStorage锛堜娇鐢� secure-ls 鎴� sessionStorage锛�
-- [ ] CSRF token 姝g‘澶勭悊
-
-### 鎬ц兘
-
-- [ ] 澶у垪琛ㄤ娇鐢ㄨ櫄鎷熸粴鍔�
-- [ ] 鍥剧墖宸蹭紭鍖�
-- [ ] 璺敱鎳掑姞杞�
-- [ ] 娌℃湁涓嶅繀瑕佺殑閲嶆覆鏌�
-- [ ] 姝g‘浣跨敤 `v-memo` 鍜� `v-once`
-
-### 鍙闂��
-
-- [ ] 姝g‘鐨� ARIA 灞炴��
-- [ ] 閿洏瀵艰埅鍙敤
-- [ ] 棰滆壊瀵规瘮搴﹁冻澶�
-- [ ] 妯℃�佹鐒︾偣绠$悊
-
-### 浠g爜璐ㄩ噺
-
-- [ ] 鍑芥暟鑱岃矗鍗曚竴
-- [ ] 娌℃湁閲嶅浠g爜锛堟彁鍙栧埌缁勫悎寮忓嚱鏁帮級
-- [ ] 閿欒澶勭悊瀹屽杽
-- [ ] 鍔犺浇鐘舵�佸凡澶勭悊
-- [ ] 杈圭晫鎯呭喌宸茶�冭檻
-
-## 甯歌闂鏍囪
-
-### 1. 鐩存帴淇敼 Props
-
-```typescript
-// 閿欒
-props.value = newValue;
-
-// 姝g‘
-emit('update:value', newValue);
-```
-
-### 2. 鍐呭瓨娉勬紡
-
-```typescript
-// 閿欒 - 娌℃湁娓呯悊
-onMounted(() => {
-  window.addEventListener('resize', handleResize);
-});
-
-// 姝g‘ - 缁勪欢鍗歌浇鏃舵竻鐞�
-onMounted(() => {
-  window.addEventListener('resize', handleResize);
-});
-
-onUnmounted(() => {
-  window.removeEventListener('resize', handleResize);
-});
-```
-
-### 3. 涓嶅繀瑕佺殑鍝嶅簲寮�
-
-```typescript
-// 閿欒 - 闈欐�佹暟鎹笉闇�瑕佸搷搴斿紡
-const menuItems = reactive([
-  { label: '棣栭〉', path: '/' },
-  { label: '鍏充簬', path: '/about' },
-]);
-
-// 姝g‘ - 闈欐�佹暟鎹笉闇�瑕佸搷搴斿紡
-const menuItems = [
-  { label: '棣栭〉', path: '/' },
-  { label: '鍏充簬', path: '/about' },
-];
-```
-
-### 4. 缂哄皯閿欒杈圭晫
-
-```vue
-<!-- 閿欒 - 娌℃湁閿欒澶勭悊 -->
-<template>
-  <ExpensiveComponent />
-</template>
-
-<!-- 姝g‘ - 鏈夐敊璇竟鐣� -->
-<template>
-  <ErrorBoundary>
-    <ExpensiveComponent />
-  </ErrorBoundary>
-</template>
-```
-
-## 瀹夊叏绾㈢嚎
-
-1. **XSS 椋庨櫓**
-   - 浣跨敤 `v-html` 浣嗘病鏈夎繃婊�
-   - 娓叉煋鐢ㄦ埛鐢熸垚鐨勫唴瀹�
-   - 閫氳繃 `window.location` 杩涜 URL 娉ㄥ叆
-
-2. **鏁版嵁娉勯湶**
-   - 鎺у埗鍙拌緭鍑烘晱鎰熸暟鎹�
-   - Token 鍦� localStorage 涓湭鍔犲瘑
-   - 婧愪唬鐮佷腑鏈� API Key
-
-3. **娉ㄥ叆椋庨櫓**
-   - 鍔ㄦ�佺粍浠跺悕鏉ヨ嚜鐢ㄦ埛杈撳叆
-   - 浣跨敤 `eval()` 鎴� `Function()`
-   - API 璋冪敤涓殑 SQL 娉ㄥ叆
-
-## 瀹℃煡鎰忚鏍煎紡
-
-浣跨敤寤鸿鎬х殑璇勮锛�
-
-```markdown
-**寤鸿**: 杩欓噷鑰冭檻浣跨敤 `computed` 鏇夸唬 `watch` 浠ヨ幏寰楁洿濂界殑鎬ц兘銆�
-
-```typescript
-// 褰撳墠浠g爜
-watch(() => props.value, (val) => {
-  doubled.value = val * 2;
-});
-
-// 寤鸿淇敼
-const doubled = computed(() => props.value * 2);
-```
-
-鍘熷洜: 璁$畻灞炴�ф湁缂撳瓨锛屽彧鏈変緷璧栧彉鍖栨椂鎵嶉噸鏂拌绠椼��
-```
diff --git a/.claude/skills/vben-table-form.md b/.claude/skills/vben-table-form.md
deleted file mode 100644
index 81ab6c2..0000000
--- a/.claude/skills/vben-table-form.md
+++ /dev/null
@@ -1,421 +0,0 @@
----
-name: vben-table-form
-description: Vue Vben Admin 琛ㄦ牸鍜岃〃鍗曞紑鍙戞ā寮忥紝鍖呮嫭 useVbenVxeGrid銆乽seVbenModal銆乽seVbenForm 鐨勪娇鐢ㄣ��
-origin: ECC
----
-
-# Vue Vben Admin 琛ㄦ牸琛ㄥ崟妯″紡
-
-椤圭洰鏍稿績缁勪欢鐨勪娇鐢ㄦ寚鍗楋細琛ㄦ牸锛坲seVbenVxeGrid锛夈�佽〃鍗曞脊绐楋紙useVbenModal锛夈�佽〃鍗曪紙useVbenForm锛夈��
-
-## When to Use
-
-- 寮�鍙戝垪琛ㄩ〉闈�
-- 寮�鍙戣〃鍗曞脊绐�
-- 閰嶇疆琛ㄦ牸鍒楀拰鎼滅储鏉′欢
-- 澶勭悊澧炲垹鏀规煡鎿嶄綔
-
-## 琛ㄦ牸缁勪欢 (useVbenVxeGrid)
-
-### 鍩虹鐢ㄦ硶
-
-```vue
-<script lang="ts" setup>
-import type { VxeTableGridOptions } from '#/adapter/vxe-table';
-import type { UserApi } from '#/api/system/user';
-
-import { useVbenVxeGrid, TableAction, ACTION_ICON } from '#/adapter/vxe-table';
-import { getUserPage } from '#/api/system/user';
-import { getDictOptions } from '@vben/hooks';
-
-const [Grid, gridApi] = useVbenVxeGrid({
-  formOptions: {
-    schema: [
-      {
-        fieldName: 'username',
-        label: '鐢ㄦ埛鍚�',
-        component: 'Input',
-      },
-      {
-        fieldName: 'status',
-        label: '鐘舵��',
-        component: 'Select',
-        componentProps: {
-          options: getDictOptions('common_status', 'number'),
-        },
-      },
-    ],
-  },
-  gridOptions: {
-    columns: [
-      { type: 'checkbox', width: 50 },
-      { field: 'username', title: '鐢ㄦ埛鍚�', width: 120 },
-      { field: 'nickname', title: '鏄电О', minWidth: 150 },
-      {
-        field: 'status',
-        title: '鐘舵��',
-        width: 100,
-        cellRender: {
-          name: 'CellDict',
-          props: { type: 'common_status' },
-        },
-      },
-      { field: 'createTime', title: '鍒涘缓鏃堕棿', width: 180, formatter: 'formatDateTime' },
-      { title: '鎿嶄綔', width: 180, fixed: 'right', slots: { default: 'actions' } },
-    ],
-    height: 'auto',
-    keepSource: true,
-    proxyConfig: {
-      ajax: {
-        query: async ({ page }, formValues) => {
-          return await getUserPage({
-            pageNo: page.currentPage,
-            pageSize: page.pageSize,
-            ...formValues,
-          });
-        },
-      },
-    },
-    rowConfig: {
-      keyField: 'id',
-      isHover: true,
-    },
-    toolbarConfig: {
-      refresh: true,
-      search: true,
-    },
-  } as VxeTableGridOptions<UserApi.User>,
-});
-
-// 鍒锋柊琛ㄦ牸
-function handleRefresh() {
-  gridApi.query();
-}
-</script>
-
-<template>
-  <Grid table-title="鐢ㄦ埛鍒楄〃">
-    <template #toolbar-tools>
-      <TableAction
-        :actions="[
-          {
-            label: '鏂板',
-            type: 'primary',
-            icon: ACTION_ICON.ADD,
-            onClick: handleCreate,
-          },
-        ]"
-      />
-    </template>
-    <template #actions="{ row }">
-      <TableAction
-        :actions="[
-          {
-            label: '缂栬緫',
-            type: 'link',
-            icon: ACTION_ICON.EDIT,
-            onClick: handleEdit.bind(null, row),
-          },
-          {
-            label: '鍒犻櫎',
-            type: 'link',
-            danger: true,
-            icon: ACTION_ICON.DELETE,
-            popConfirm: {
-              title: `纭鍒犻櫎銆�${row.username}銆戝悧锛焋,
-              confirm: handleDelete.bind(null, row),
-            },
-          },
-        ]"
-      />
-    </template>
-  </Grid>
-</template>
-```
-
-### 琛ㄦ牸鍒楁覆鏌撳櫒
-
-| 娓叉煋鍣� | 鐢ㄩ�� | 绀轰緥 |
-|-------|------|------|
-| `CellDict` | 瀛楀吀鏍囩 | `cellRender: { name: 'CellDict', props: { type: 'common_status' } }` |
-| `CellImage` | 鍗曞浘 | `cellRender: { name: 'CellImage' }` |
-| `CellImages` | 澶氬浘 | `cellRender: { name: 'CellImages' }` |
-| `CellLink` | 閾炬帴 | `cellRender: { name: 'CellLink', props: { text: '鏌ョ湅' } }` |
-| `CellSwitch` | 寮�鍏� | `cellRender: { name: 'CellSwitch', attrs: { beforeChange } }` |
-
-### 琛ㄦ牸浜嬩欢
-
-```typescript
-const [Grid, gridApi] = useVbenVxeGrid({
-  gridEvents: {
-    checkboxAll: ({ records }) => {
-      checkedIds.value = records.map(item => item.id!);
-    },
-    checkboxChange: ({ records }) => {
-      checkedIds.value = records.map(item => item.id!);
-    },
-  },
-});
-```
-
-## 琛ㄥ崟寮圭獥 (useVbenModal)
-
-### 鍒楄〃椤靛畾涔�
-
-```vue
-<script lang="ts" setup>
-import { useVbenModal } from '@vben/common-ui';
-import Form from './modules/form.vue';
-
-const [FormModal, formModalApi] = useVbenModal({
-  connectedComponent: Form,
-  destroyOnClose: true,
-});
-
-// 鏂板
-function handleCreate() {
-  formModalApi.setData({ formType: 'create' }).open();
-}
-
-// 缂栬緫
-function handleEdit(row: UserApi.User) {
-  formModalApi.setData({ formType: 'update', id: row.id }).open();
-}
-</script>
-
-<template>
-  <FormModal @success="handleRefresh" />
-</template>
-```
-
-### 琛ㄥ崟缁勪欢
-
-```vue
-<script lang="ts" setup>
-import type { UserApi } from '#/api/system/user';
-
-import { computed, ref } from 'vue';
-
-import { useVbenModal } from '@vben/common-ui';
-import { useVbenForm } from '#/adapter/form';
-import { createUser, updateUser, getUser } from '#/api/system/user';
-import { $t } from '#/locales';
-
-const emit = defineEmits(['success']);
-const formData = ref<UserApi.User>();
-const formType = ref<'create' | 'update'>('create');
-
-const getTitle = computed(() => {
-  return formType.value === 'update'
-    ? $t('ui.actionTitle.edit', ['鐢ㄦ埛'])
-    : $t('ui.actionTitle.create', ['鐢ㄦ埛']);
-});
-
-const [Form, formApi] = useVbenForm({
-  commonConfig: {
-    componentProps: { class: 'w-full' },
-    labelWidth: 100,
-  },
-  layout: 'horizontal',
-  schema: [
-    {
-      fieldName: 'username',
-      label: '鐢ㄦ埛鍚�',
-      component: 'Input',
-      rules: 'required',
-    },
-    {
-      fieldName: 'nickname',
-      label: '鏄电О',
-      component: 'Input',
-      rules: 'required',
-    },
-    {
-      fieldName: 'email',
-      label: '閭',
-      component: 'Input',
-      rules: 'email',
-    },
-    {
-      fieldName: 'status',
-      label: '鐘舵��',
-      component: 'Select',
-      componentProps: {
-        options: getDictOptions('common_status', 'number'),
-      },
-    },
-    {
-      fieldName: 'remark',
-      label: '澶囨敞',
-      component: 'Textarea',
-      formItemClass: 'col-span-2',
-    },
-  ],
-  showDefaultActions: false,
-  wrapperClass: 'grid-cols-2',
-});
-
-const [Modal, modalApi] = useVbenModal({
-  async onConfirm() {
-    const { valid } = await formApi.validate();
-    if (!valid) return;
-
-    modalApi.lock();
-    const data = await formApi.getValues();
-
-    try {
-      if (formData.value?.id) {
-        await updateUser({ ...data, id: formData.value.id });
-      } else {
-        await createUser(data);
-      }
-      await modalApi.close();
-      emit('success');
-      message.success($t('ui.actionMessage.operationSuccess'));
-    } finally {
-      modalApi.unlock();
-    }
-  },
-  async onOpenChange(isOpen: boolean) {
-    if (!isOpen) {
-      formData.value = undefined;
-      return;
-    }
-
-    const data = modalApi.getData<{ formType: string; id?: number }>();
-    formType.value = data.formType;
-
-    if (data.id) {
-      modalApi.lock();
-      try {
-        formData.value = await getUser(data.id);
-        await formApi.setValues(formData.value);
-      } finally {
-        modalApi.unlock();
-      }
-    }
-  },
-});
-</script>
-
-<template>
-  <Modal :title="getTitle" class="w-2/5">
-    <Form class="mx-4" />
-  </Modal>
-</template>
-```
-
-## 琛ㄥ崟 Schema 閰嶇疆
-
-### 甯哥敤缁勪欢
-
-```typescript
-const schema: VbenFormSchema[] = [
-  // 杈撳叆妗�
-  {
-    fieldName: 'name',
-    label: '鍚嶇О',
-    component: 'Input',
-    componentProps: {
-      placeholder: '璇疯緭鍏ュ悕绉�',
-    },
-    rules: 'required',
-  },
-
-  // 鏁板瓧杈撳叆
-  {
-    fieldName: 'quantity',
-    label: '鏁伴噺',
-    component: 'InputNumber',
-    componentProps: {
-      class: '!w-full',
-      min: 0,
-      precision: 2,
-    },
-  },
-
-  // 涓嬫媺閫夋嫨
-  {
-    fieldName: 'status',
-    label: '鐘舵��',
-    component: 'Select',
-    componentProps: {
-      options: getDictOptions('common_status', 'number'),
-    },
-  },
-
-  // 鏃ユ湡閫夋嫨
-  {
-    fieldName: 'date',
-    label: '鏃ユ湡',
-    component: 'DatePicker',
-    componentProps: {
-      class: '!w-full',
-      format: 'YYYY-MM-DD',
-      valueFormat: 'x',
-    },
-  },
-
-  // 闅愯棌瀛楁
-  {
-    fieldName: 'id',
-    component: 'Input',
-    dependencies: {
-      triggerFields: [''],
-      show: () => false,
-    },
-  },
-
-  // 鏉′欢鏄剧ず
-  {
-    fieldName: 'clientId',
-    label: '瀹㈡埛',
-    component: markRaw(CrmCustomerSelect),
-    dependencies: {
-      triggerFields: ['orderSourceType'],
-      show: (values) => values.orderSourceType === 'ORDER',
-    },
-  },
-];
-```
-
-## TableAction 鎿嶄綔鎸夐挳
-
-```vue
-<TableAction
-  :actions="[
-    {
-      label: '缂栬緫',
-      type: 'link',
-      icon: ACTION_ICON.EDIT,
-      auth: ['system:user:update'],
-      onClick: handleEdit,
-    },
-    {
-      label: '鍒犻櫎',
-      type: 'link',
-      danger: true,
-      icon: ACTION_ICON.DELETE,
-      auth: ['system:user:delete'],
-      popConfirm: {
-        title: '纭鍒犻櫎鍚楋紵',
-        confirm: handleDelete,
-      },
-    },
-  ]"
-  :drop-down-actions="[
-    {
-      label: '鍒嗛厤瑙掕壊',
-      auth: ['system:user:assign-role'],
-      onClick: handleAssignRole,
-    },
-  ]"
-/>
-```
-
-## 娉ㄦ剰浜嬮」
-
-1. **琛ㄦ牸蹇呴』鏈� `keyField`**锛歚rowConfig: { keyField: 'id' }`
-2. **寮圭獥蹇呴』 `destroyOnClose: true`**锛氶槻姝㈡暟鎹畫鐣�
-3. **琛ㄥ崟楠岃瘉浣跨敤 `rules` 灞炴��**锛氭敮鎸� `required`銆乣email`銆乣selectRequired` 绛�
-4. **鏉冮檺鎺у埗浣跨敤 `auth` 灞炴��**锛歚auth: ['system:user:update']`
\ No newline at end of file
diff --git a/.claude/skills/vue-component-patterns.md b/.claude/skills/vue-component-patterns.md
deleted file mode 100644
index d110756..0000000
--- a/.claude/skills/vue-component-patterns.md
+++ /dev/null
@@ -1,170 +0,0 @@
----
-name: vue-component-patterns
-description: Vue 3 缁勪欢寮�鍙戞ā寮忥紝鍖呮嫭 Composition API銆丳rops/Emits 瀹氫箟銆佺粍浠跺懡鍚嶈鑼冦�傞�傜敤浜庡紑鍙� Vue 缁勪欢鏃躲��
-origin: ECC
----
-
-# Vue 3 缁勪欢寮�鍙戞ā寮�
-
-鍩轰簬 Vue Vben Admin 椤圭洰鐨� Vue 3 缁勪欢寮�鍙戣鑼冦��
-
-## When to Use
-
-- 寮�鍙戞柊鐨� Vue 缁勪欢
-- 瀹氫箟缁勪欢 Props 鍜� Emits
-- 浣跨敤 Composition API
-- 缁勪欢鐘舵�佺鐞嗗拰鐢熷懡鍛ㄦ湡
-
-## How It Works
-
-椤圭洰浣跨敤 Vue 3.5 + TypeScript + `<script setup>` 璇硶銆�
-
-## 缁勪欢瀹氫箟瑙勮寖
-
-### 鍩虹缁撴瀯
-
-```vue
-<script lang="ts" setup>
-import type { PropsType } from './types';
-
-import { ref, computed } from 'vue';
-
-// 1. 缁勪欢鍛藉悕锛堝繀椤伙級
-defineOptions({ name: 'ComponentName' });
-
-// 2. Props 瀹氫箟
-interface Props {
-  userId: number;
-  userName?: string;
-}
-
-const props = withDefaults(defineProps<Props>(), {
-  userName: '',
-});
-
-// 3. Emits 瀹氫箟
-interface Emits {
-  (e: 'update', value: string): void;
-  (e: 'delete', id: number): void;
-}
-
-const emit = defineEmits<Emits>();
-
-// 4. 鍝嶅簲寮忕姸鎬�
-const loading = ref(false);
-
-// 5. 璁$畻灞炴��
-const displayName = computed(() => props.userName || '鏈懡鍚�');
-
-// 6. 鏂规硶
-function handleSubmit() {
-  emit('update', displayName.value);
-}
-</script>
-
-<template>
-  <div class="component-name">
-    <!-- 妯℃澘鍐呭 -->
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.component-name {
-  /* 鏍峰紡 */
-}
-</style>
-```
-
-### TypeScript 瑙勮寖
-
-```typescript
-// 鉁� 姝g‘锛氫娇鐢� import type 瀵煎叆绫诲瀷
-import type { UserInfo } from '#/api/system/user';
-
-// 鉁� 姝g‘锛氬畾涔夊叿浣撴帴鍙�
-interface Props {
-  userId: number;
-  userName?: string;
-}
-
-// 鉂� 閿欒锛氫娇鐢� any
-const data: any = {};
-
-// 鉁� 姝g‘锛氫娇鐢� unknown + 绫诲瀷瀹堝崼
-function getErrorMessage(error: unknown): string {
-  if (error instanceof Error) {
-    return error.message;
-  }
-  return '鏈煡閿欒';
-}
-```
-
-## 椤甸潰鏂囦欢缁撴瀯
-
-鏍囧噯 CRUD 椤甸潰鐨勬枃浠剁粨鏋勶細
-
-```
-views/
-鈹斺攢鈹� system/
-    鈹斺攢鈹� user/
-        鈹溾攢鈹� index.vue        # 鍒楄〃椤�
-        鈹溾攢鈹� data.ts          # 鏁版嵁瀹氫箟锛堣〃鏍煎垪銆佽〃鍗� Schema锛�
-        鈹斺攢鈹� modules/
-            鈹溾攢鈹� form.vue     # 琛ㄥ崟寮圭獥
-            鈹斺攢鈹� detail.vue   # 璇︽儏寮圭獥锛堝彲閫夛級
-```
-
-### 瀵煎叆璺緞灞傜骇
-
-| 鏂囦欢浣嶇疆 | 瀵煎叆灞傜骇 |
-|---------|---------|
-| `index.vue` | 4 灞� `../..` |
-| `modules/form.vue` | 5 灞� `../../..` |
-
-```typescript
-// index.vue 涓殑瀵煎叆
-import { useFormSchema } from '../data';
-
-// modules/form.vue 涓殑瀵煎叆
-import { useFormSchema } from '../../data';
-```
-
-## 缁勪欢鍛藉悕瑙勮寖
-
-| 绫诲瀷 | 鍛藉悕瑙勫垯 | 绀轰緥 |
-|-----|---------|-----|
-| 椤甸潰缁勪欢 | 涓庣洰褰曞悕涓�鑷� | `UserList.vue` |
-| 涓氬姟缁勪欢 | 鍔熻兘鍚� + 绫诲瀷 | `UserSelect.vue` |
-| 鍩虹缁勪欢 | 鍔熻兘鍚� | `Button.vue` |
-| 寮圭獥缁勪欢 | 鍔熻兘 + Form/Detail | `UserForm.vue` |
-
-## 鏍峰紡瑙勮寖
-
-```vue
-<template>
-  <!-- 浼樺厛浣跨敤 Tailwind CSS -->
-  <div class="flex items-center p-4 bg-white rounded-lg">
-    <span class="text-base font-medium text-gray-900">鏍囬</span>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-/* 缁勪欢鏍峰紡浣跨敤 scoped */
-.component-name {
-  /* 棰滆壊浣跨敤 CSS 鍙橀噺 */
-  background-color: var(--component-background);
-
-  /* 瑕嗙洊缁勪欢搴撴牱寮忎娇鐢� :deep */
-  :deep(.ant-table) {
-    border-radius: 8px;
-  }
-}
-</style>
-```
-
-## 娉ㄦ剰浜嬮」
-
-1. **蹇呴』浣跨敤 `defineOptions` 瀹氫箟缁勪欢鍚�**
-2. **绂佹浣跨敤 `any` 绫诲瀷**
-3. **Props 浣跨敤 `withDefaults` + `defineProps<T>()`**
-4. **璺緞鍒悕 `#/*` 鎸囧悜 `./src/*`**
\ No newline at end of file
diff --git a/.claude/skills/vue3-development/SKILL.md b/.claude/skills/vue3-development/SKILL.md
deleted file mode 100644
index 06bf8ce..0000000
--- a/.claude/skills/vue3-development/SKILL.md
+++ /dev/null
@@ -1,155 +0,0 @@
----
-name: vue3-development
-description: Vue 3 + TypeScript + Composition API 寮�鍙戣鑼冨拰鏈�浣冲疄璺�
----
-
-# Vue 3 寮�鍙戞妧鑳�
-
-## 浣曟椂浣跨敤
-
-鍦ㄤ互涓嬪満鏅縺娲绘鎶�鑳斤細
-- 浣跨敤 Composition API 寮�鍙� Vue 3 缁勪欢
-- 涓� Vue 搴旂敤缂栧啓 TypeScript 浠g爜
-- 璁剧疆 Pinia 鐘舵�佸瓨鍌ㄦ垨 Vue Router
-- 浣跨敤缁勫悎寮忓嚱鏁板拰鍝嶅簲寮忕姸鎬�
-- 浼樺寲 Vue 缁勪欢鎬ц兘
-
-## 宸ヤ綔鍘熺悊
-
-姝ゆ妧鑳戒负 Vue 3 寮�鍙戞ā寮忔彁渚涙寚瀵笺��
-
-## 鎶�鏈爤
-
-- **Vue**: 3.5.x 浣跨敤 Composition API
-- **TypeScript**: 瀹屾暣绫诲瀷瀹夊叏
-- **鐘舵�佺鐞�**: Pinia + persistedstate
-- **璺敱**: Vue Router 5.x
-- **琛ㄥ崟楠岃瘉**: VeeValidate + Zod
-- **HTTP 瀹㈡埛绔�**: Axios
-
-## 浠g爜椋庢牸
-
-### 缁勪欢缁撴瀯
-
-```vue
-<script setup lang="ts">
-import { ref, computed, onMounted } from 'vue';
-import type { PropType } from 'vue';
-
-// 浣跨敤 TypeScript 瀹氫箟 Props
-interface Props {
-  title: string;
-  items?: string[];
-}
-
-const props = withDefaults(defineProps<Props>(), {
-  items: () => [],
-});
-
-// 浣跨敤 TypeScript 瀹氫箟 Emits
-interface Emits {
-  (e: 'update', value: string): void;
-  (e: 'delete', id: number): void;
-}
-
-const emit = defineEmits<Emits>();
-
-// 鍝嶅簲寮忕姸鎬�
-const isLoading = ref(false);
-const localData = ref<string | null>(null);
-
-// 璁$畻灞炴��
-const formattedTitle = computed(() => props.title.toUpperCase());
-
-// 鏂规硶
-const handleSubmit = async () => {
-  isLoading.value = true;
-  try {
-    // ...
-  } finally {
-    isLoading.value = false;
-  }
-};
-
-// 鐢熷懡鍛ㄦ湡
-onMounted(() => {
-  // 鍒濆鍖�
-});
-</script>
-
-<template>
-  <div class="component-wrapper">
-    <h1>{{ formattedTitle }}</h1>
-    <slot />
-  </div>
-</template>
-
-<style scoped>
-.component-wrapper {
-  /* scoped 鏍峰紡 */
-}
-</style>
-```
-
-### 缁勫悎寮忓嚱鏁版ā寮�
-
-```typescript
-// composables/useUser.ts
-import { ref, computed } from 'vue';
-import { defineStore } from 'pinia';
-
-export const useUserStore = defineStore('user', () => {
-  const user = ref<User | null>(null);
-  const isLoggedIn = computed(() => !!user.value);
-
-  const login = async (credentials: LoginCredentials) => {
-    // 瀹炵幇
-  };
-
-  const logout = () => {
-    user.value = null;
-  };
-
-  return { user, isLoggedIn, login, logout };
-});
-```
-
-### API 闆嗘垚
-
-```typescript
-// api/user.ts
-import { request } from '#/utils/request';
-
-export const userApi = {
-  getList: (params: UserQuery) => request.get<UserList>('/users', { params }),
-  getById: (id: number) => request.get<User>(`/users/${id}`),
-  create: (data: CreateUserDTO) => request.post<User>('/users', data),
-  update: (id: number, data: UpdateUserDTO) => request.put<User>(`/users/${id}`, data),
-  delete: (id: number) => request.delete(`/users/${id}`),
-};
-```
-
-## 鏈�浣冲疄璺�
-
-### 鎺ㄨ崘
-
-- 鎵�鏈夌粍浠朵娇鐢� `<script setup>` 璇硶
-- 浣跨敤 TypeScript 鎺ュ彛瀹氫箟 props 鍜� emits
-- 浣跨敤缁勫悎寮忓嚱鏁板鐢ㄩ�昏緫
-- 灏藉彲鑳戒娇鐢� `computed` 鑰岄潪 `watch`
-- 璺敱绾х粍浠朵娇鐢� `defineAsyncComponent` 鎳掑姞杞�
-- 淇濇寔缁勪欢鑱岃矗鍗曚竴
-
-### 閬垮厤
-
-- 涓嶈浣跨敤 Options API锛堟帹鑽� Composition API锛�
-- 涓嶈鐩存帴淇敼 props
-- 涓嶈浣跨敤 `any` 绫诲瀷 - 瀹氫箟姝g‘鐨勬帴鍙�
-- 涓嶈蹇樿鍦� `onUnmounted` 涓竻鐞嗗壇浣滅敤
-
-## 鎬ц兘浼樺寲寤鸿
-
-1. 瀵逛簬涓嶉渶瑕佹繁搴﹀搷搴旂殑澶у瀷瀵硅薄浣跨敤 `shallowRef`
-2. 瀵逛簬鏄傝吹鐨勫垪琛ㄦ覆鏌撲娇鐢� `v-memo`
-3. 浣跨敤 `defineAsyncComponent` 鎳掑姞杞界粍浠�
-4. 瀵逛簬闈欐�佸唴瀹逛娇鐢� `v-once`
diff --git a/.claude/vue-component.md b/.claude/vue-component.md
deleted file mode 100644
index 13fa224..0000000
--- a/.claude/vue-component.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-name: vue-component
-description: 鍒涘缓鏂扮殑 Vue 3 缁勪欢锛屽寘鍚� TypeScript 绫诲瀷瀹氫箟鍜屾渶浣冲疄璺�
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /vue-component
-
-鍒涘缓鏂扮殑 Vue 3 缁勪欢鏃朵娇鐢ㄦ宸ヤ綔娴併��
-
-## 鐩爣
-
-鍒涘缓涓�涓粨鏋勮壇濂界殑 Vue 3 缁勪欢锛屽寘鍚� TypeScript 绫诲瀷銆佹纭殑 props/emit 瀹氫箟锛屽苟閬靛惊椤圭洰瑙勮寖銆�
-
-## 甯哥敤鏂囦欢
-
-- `src/components/**/*.vue`
-- `src/views/**/*.vue`
-- `src/**/components/*.vue`
-
-## 寤鸿姝ラ
-
-1. 鏍规嵁浣滅敤鍩熺‘瀹氱粍浠朵綅缃紙鍏ㄥ眬缁勪欢 vs 鍔熻兘缁勪欢锛�
-2. 鍒涘缓 `.vue` 鏂囦欢锛屼娇鐢� `<script setup lang="ts">`
-3. 瀹氫箟 Props 鍜� Emits 鐨� TypeScript 鎺ュ彛
-4. 浣跨敤 Composition API 瀹炵幇缁勪欢閫昏緫
-5. 娣诲姞妯℃澘鍜屾纭殑缁戝畾
-6. 濡傞渶瑕侊紝娣诲姞 scoped 鏍峰紡
-7. 瀵煎嚭缁勪欢渚涗娇鐢�
-
-## 缁勪欢妯℃澘
-
-```vue
-<script setup lang="ts">
-import { ref, computed } from 'vue';
-
-// Props 瀹氫箟
-interface Props {
-  title: string;
-  disabled?: boolean;
-}
-
-const props = withDefaults(defineProps<Props>(), {
-  disabled: false,
-});
-
-// Emits 瀹氫箟
-interface Emits {
-  (e: 'click', value: string): void;
-}
-
-const emit = defineEmits<Emits>();
-
-// 鍝嶅簲寮忕姸鎬�
-const isActive = ref(false);
-
-// 鏂规硶
-const handleClick = () => {
-  if (!props.disabled) {
-    isActive.value = !isActive.value;
-    emit('click', props.title);
-  }
-};
-</script>
-
-<template>
-  <div
-    class="component-name"
-    :class="{ 'is-active': isActive, 'is-disabled': disabled }"
-    @click="handleClick"
-  >
-    <span>{{ title }}</span>
-    <slot />
-  </div>
-</template>
-
-<style scoped>
-.component-name {
-  /* 鏍峰紡 */
-}
-</style>
-```
-
-## 鍏稿瀷鎻愪氦淇℃伅
-
-- feat: add [缁勪欢鍚峕 component
-- feat: implement [缁勪欢鍚峕 for [鍔熻兘鍚峕
\ No newline at end of file
diff --git a/.claude/vue-page.md b/.claude/vue-page.md
deleted file mode 100644
index 95c78f2..0000000
--- a/.claude/vue-page.md
+++ /dev/null
@@ -1,95 +0,0 @@
----
-name: vue-page
-description: 鍒涘缓鏂扮殑椤甸潰/瑙嗗浘锛屽寘鍚� Vue Router 璺敱閰嶇疆
-allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
----
-
-# /vue-page
-
-鍒涘缓鏂扮殑椤甸潰/瑙嗗浘鏃朵娇鐢ㄦ宸ヤ綔娴併��
-
-## 鐩爣
-
-鍒涘缓鏂扮殑椤甸潰缁勪欢骞跺湪 Vue Router 涓敞鍐岃矾鐢便��
-
-## 甯哥敤鏂囦欢
-
-- `src/views/**/*.vue`
-- `src/router/routes/**/*.ts`
-
-## 寤鸿姝ラ
-
-1. 鍦� `src/views/` 涓嬪垱寤洪〉闈㈢粍浠�
-2. 瀹氫箟璺敱閰嶇疆
-3. 灏嗚矾鐢辨坊鍔犲埌璺敱鍣�
-4. 濡傞渶瑕侊紝娣诲姞椤甸潰鏍囬鍜� meta 淇℃伅
-
-## 椤甸潰妯℃澘
-
-```vue
-<script setup lang="ts">
-import { ref, onMounted } from 'vue';
-import { useRoute } from 'vue-router';
-
-defineOptions({
-  name: 'PageName',
-});
-
-const route = useRoute();
-const loading = ref(false);
-
-onMounted(() => {
-  // 鍒濆鍖栭〉闈㈡暟鎹�
-});
-</script>
-
-<template>
-  <div class="page-container">
-    <a-spin :spinning="loading">
-      <!-- 椤甸潰鍐呭 -->
-      <h1>椤甸潰鏍囬</h1>
-    </a-spin>
-  </div>
-</template>
-
-<style scoped>
-.page-container {
-  padding: 16px;
-}
-</style>
-```
-
-## 璺敱閰嶇疆
-
-```typescript
-// router/routes/module.ts
-import type { RouteRecordRaw } from 'vue-router';
-
-const routes: RouteRecordRaw[] = [
-  {
-    path: '/module',
-    name: 'ModuleList',
-    component: () => import('#/views/module/index.vue'),
-    meta: {
-      title: '妯″潡鍒楄〃',
-      icon: 'mdi:list',
-    },
-  },
-  {
-    path: '/module/:id',
-    name: 'ModuleDetail',
-    component: () => import('#/views/module/detail.vue'),
-    meta: {
-      title: '妯″潡璇︽儏',
-      hideMenu: true,
-    },
-  },
-];
-
-export default routes;
-```
-
-## 鍏稿瀷鎻愪氦淇℃伅
-
-- feat: add [椤甸潰鍚峕 page
-- feat: implement [椤甸潰鍚峕 view
\ No newline at end of file
diff --git a/.codex/hooks.json b/.codex/hooks.json
new file mode 100644
index 0000000..ac6b573
--- /dev/null
+++ b/.codex/hooks.json
@@ -0,0 +1,29 @@
+{
+  "hooks": {
+    "PostToolUse": [
+      {
+        "matcher": "Edit|Write|apply_patch",
+        "hooks": [
+          {
+            "type": "command",
+            "command": "[ ! -f \".agents/skills/impeccable/scripts/hook.mjs\" ] || node \".agents/skills/impeccable/scripts/hook.mjs\"",
+            "timeout": 5,
+            "statusMessage": "Checking UI changes"
+          }
+        ]
+      }
+    ],
+    "Stop": [
+      {
+        "hooks": [
+          {
+            "type": "command",
+            "command": "[ ! -f \".agents/skills/impeccable/scripts/hook.mjs\" ] || node \".agents/skills/impeccable/scripts/hook.mjs\"",
+            "timeout": 30,
+            "statusMessage": "Design deep pass"
+          }
+        ]
+      }
+    ]
+  }
+}
diff --git a/.gitignore b/.gitignore
index 7b0e5f8..33d4363 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,10 @@
 *.swp
 *.swo
 
+# AI tools
+.agents/
+.claude/
+
 # OS files
 .DS_Store
 Thumbs.db
diff --git a/skills-lock.json b/skills-lock.json
new file mode 100644
index 0000000..3ee19b1
--- /dev/null
+++ b/skills-lock.json
@@ -0,0 +1,83 @@
+{
+  "version": 1,
+  "skills": {
+    "brandkit": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/brandkit/SKILL.md",
+      "computedHash": "735007879f5110aeae1e981a53fe74a12afde70347f9773dacd50e4697a091bf"
+    },
+    "design-taste-frontend": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/taste-skill/SKILL.md",
+      "computedHash": "899b84384f74f540ea5284d9b2e9234e050998b42eacc805410b518d4226c0b3"
+    },
+    "design-taste-frontend-v1": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/taste-skill-v1/SKILL.md",
+      "computedHash": "0a226c13d69639553cf8a7c40aa5527b026820f8ddaf7a6b263988e32ab44a27"
+    },
+    "full-output-enforcement": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/output-skill/SKILL.md",
+      "computedHash": "524f7c7950c3fde726101613f630140411c7d080e63be718687f4b38f919be81"
+    },
+    "gpt-taste": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/gpt-tasteskill/SKILL.md",
+      "computedHash": "7bd1bfdda0e51016ca222693401a65fc0dd9bf9487e0bd5b1740ba510f6f963a"
+    },
+    "high-end-visual-design": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/soft-skill/SKILL.md",
+      "computedHash": "f730e4132775f13eea19e3dc39afc6bb453cfc0498872b127ad8f0d47cfd802d"
+    },
+    "image-to-code": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/image-to-code-skill/SKILL.md",
+      "computedHash": "3d2ac14d956fdafc5500d2108b90895e134d847f9f199e7f1d18bf1f814cf7c8"
+    },
+    "imagegen-frontend-mobile": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/imagegen-frontend-mobile/SKILL.md",
+      "computedHash": "7c1d1dc59cd0df4063b8621af543bf5dea1d576b261507e17b0323c69680b048"
+    },
+    "imagegen-frontend-web": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/imagegen-frontend-web/SKILL.md",
+      "computedHash": "27255c7c50181e58add156b2aa2bd5325285b85f04027e4c8b73742d98d7be0a"
+    },
+    "industrial-brutalist-ui": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/brutalist-skill/SKILL.md",
+      "computedHash": "e66e5a2a8b73cef79ab6546459c665e8b983645689c5f3772f7eed8b9f1e8e0e"
+    },
+    "minimalist-ui": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/minimalist-skill/SKILL.md",
+      "computedHash": "7e88897e0371184e97a82b8d9ef080323c13f21eb067b58ef71eb05173a08ac2"
+    },
+    "redesign-existing-projects": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/redesign-skill/SKILL.md",
+      "computedHash": "47eced3e960a2c961d3cbee11fa1216264f589344b586a5cbd03967cd6b9c54b"
+    },
+    "stitch-design-taste": {
+      "source": "Leonxlnx/taste-skill",
+      "sourceType": "github",
+      "skillPath": "skills/stitch-skill/SKILL.md",
+      "computedHash": "c96b580192b34167efa01f460bbc669ff4315cf97f3cf6ff85ded8029aa720b8"
+    }
+  }
+}

--
Gitblit v1.9.3