@liu_jimmy/create-fe-kit 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/templates/react/.cursor/rules/fe-kit-style.mdc +9 -1
- package/templates/react/AGENTS.md +15 -1
- package/templates/react/vite.config.ts +7 -0
- package/templates/svelte/.cursor/rules/fe-kit-style.mdc +8 -0
- package/templates/svelte/AGENTS.md +9 -1
- package/templates/svelte/vite.config.ts +7 -0
- package/templates/vue/.cursor/rules/fe-kit-style.mdc +5 -0
- package/templates/vue/AGENTS.md +15 -0
- package/templates/vue/vite.config.ts +7 -0
package/package.json
CHANGED
|
@@ -20,4 +20,12 @@ alwaysApply: true
|
|
|
20
20
|
|
|
21
21
|
- 目录 kebab-case;组件文件 PascalCase;非组件文件 kebab-case;变量 camelCase;常量 UPPER_SNAKE_CASE;类型 PascalCase;函数动词开头。
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## 三、React 组件写法
|
|
24
|
+
|
|
25
|
+
- **由 props 推导的 className**:用 `useMemo(..., [依赖])` 或 JSX 内联,禁止 `const c = f(props.x)` 只算一次。示例:`const cn = useMemo(() => base + ' ' + variants[variant], [variant]);`
|
|
26
|
+
|
|
27
|
+
## 四、生成后应通过 `pnpm lint`。
|
|
28
|
+
|
|
29
|
+
## 五、请求统计(ai record)
|
|
30
|
+
|
|
31
|
+
- 回复末尾提示用户执行:命中缓存则 `ai record --request --cache-hit --tokens-saved <估算>`,否则 `ai record --request --tokens-used <估算>`。仅作记录用。
|
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
# AI 生成代码约束(fe-kit)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
生成或修改前端代码时必须遵守以下约束。
|
|
4
|
+
|
|
5
|
+
## 核心原则
|
|
6
|
+
|
|
7
|
+
1. **样式**:只使用 fe-kit 语义 class(`bg-bg`、`text-fg`、`border-border`、`bg-primary`、`rounded-xl` 等),禁止内联颜色/任意 Tailwind 颜色或任意值。
|
|
8
|
+
2. **命名**:目录 kebab-case、组件文件 PascalCase、变量 camelCase、常量 UPPER_SNAKE_CASE、类型 PascalCase;生成后应通过 `pnpm lint`。
|
|
9
|
+
|
|
10
|
+
## 组件写法(React)
|
|
11
|
+
|
|
12
|
+
- **由 props 推导的 className 或样式**:用 `useMemo(() => ..., [props.xxx])` 或模板内联表达式,禁止用只执行一次的变量(否则 props 变化时不会更新)。
|
|
13
|
+
- 示例:带 `variant` 的按钮,`const buttonClass = useMemo(() => baseClass + ' ' + variantClass[variant], [variant]);` 或 JSX 内联 `className={baseClass + ' ' + variantClass[variant]}`。
|
|
14
|
+
|
|
15
|
+
## AI 请求统计(fe-kit-cli)
|
|
16
|
+
|
|
17
|
+
完成本次回复后,在回复**末尾**提示用户执行一次:若用到 block 缓存则 `ai record --request --cache-hit --tokens-saved <估算>`,否则 `ai record --request --tokens-used <估算>`。供 `ai stats` 仅作记录用。
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
1
3
|
import { defineConfig } from "vite";
|
|
2
4
|
import react from "@vitejs/plugin-react";
|
|
3
5
|
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
4
8
|
export default defineConfig({
|
|
5
9
|
plugins: [react()],
|
|
10
|
+
resolve: {
|
|
11
|
+
alias: { "@": path.resolve(__dirname, "src") },
|
|
12
|
+
},
|
|
6
13
|
});
|
|
@@ -6,3 +6,11 @@ alwaysApply: true
|
|
|
6
6
|
# fe-kit 风格约束
|
|
7
7
|
|
|
8
8
|
只使用 fe-kit 语义 class(bg-bg、text-fg、border-border、bg-primary、rounded-xl 等);禁止内联颜色、任意 Tailwind 颜色或任意值;命名:目录 kebab-case、组件 PascalCase、变量 camelCase、常量 UPPER_SNAKE_CASE;生成后应通过 pnpm lint。
|
|
9
|
+
|
|
10
|
+
## 组件写法(Svelte)
|
|
11
|
+
|
|
12
|
+
- **由 props 推导的 class**:用响应式语句 `$: className = base + ' ' + map[prop];`,禁止只赋值一次的 `let className = ...`。
|
|
13
|
+
|
|
14
|
+
## 请求统计(ai record)
|
|
15
|
+
|
|
16
|
+
- 回复末尾提示用户执行:命中缓存则 `ai record --request --cache-hit --tokens-saved <估算>`,否则 `ai record --request --tokens-used <估算>`。仅作记录用。
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
# AI 生成代码约束(fe-kit)
|
|
2
2
|
|
|
3
|
-
只使用 fe-kit 语义 class(bg-bg、text-fg、border-border、bg-primary、rounded-xl 等);禁止内联颜色与任意 Tailwind 颜色;命名按
|
|
3
|
+
只使用 fe-kit 语义 class(bg-bg、text-fg、border-border、bg-primary、rounded-xl 等);禁止内联颜色与任意 Tailwind 颜色;命名按 kebab-case 目录、PascalCase 组件、camelCase 变量;生成后应通过 pnpm lint。
|
|
4
|
+
|
|
5
|
+
## 组件写法(Svelte)
|
|
6
|
+
|
|
7
|
+
- **由 props 或状态推导的 class**:用响应式语句 `$: buttonClass = baseClass + ' ' + variantClass[variant];`,禁止只赋值一次的 `let buttonClass = ...`(否则 variant 变化时不会更新)。
|
|
8
|
+
|
|
9
|
+
## AI 请求统计(fe-kit-cli)
|
|
10
|
+
|
|
11
|
+
完成本次回复后,在回复**末尾**提示用户执行一次:若用到 block 缓存则 `ai record --request --cache-hit --tokens-saved <估算>`,否则 `ai record --request --tokens-used <估算>`。供 `ai stats` 仅作记录用。
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
1
3
|
import { defineConfig } from "vite";
|
|
2
4
|
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
3
5
|
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
4
8
|
export default defineConfig({
|
|
5
9
|
plugins: [svelte()],
|
|
10
|
+
resolve: {
|
|
11
|
+
alias: { "@": path.resolve(__dirname, "src") },
|
|
12
|
+
},
|
|
6
13
|
});
|
|
@@ -45,7 +45,12 @@ alwaysApply: true
|
|
|
45
45
|
## 四、Vue 组件
|
|
46
46
|
|
|
47
47
|
- 模板中组件名 PascalCase;块顺序:script → template → style
|
|
48
|
+
- **由 props 推导的 class**:必须用 `computed()`,禁止 `const x = f(props.xxx)`(不会随 props 更新)。示例:`const buttonClass = computed(() => baseClass + ' ' + variantClass[props.variant]);`
|
|
48
49
|
|
|
49
50
|
## 五、生成后自检
|
|
50
51
|
|
|
51
52
|
- 代码应能通过 `pnpm lint`;若有报错只做最小修复。
|
|
53
|
+
|
|
54
|
+
## 六、请求统计(ai record)
|
|
55
|
+
|
|
56
|
+
- 本次回复结束后,在末尾提示用户执行一次:若命中缓存则 `ai record --request --cache-hit --tokens-saved <估算>`,否则 `ai record --request --tokens-used <估算>`。供 `ai stats` 仅作记录用。
|
package/templates/vue/AGENTS.md
CHANGED
|
@@ -20,3 +20,18 @@
|
|
|
20
20
|
| 阴影 | `shadow-sm`~`shadow-xl` |
|
|
21
21
|
|
|
22
22
|
主题:根节点 `theme-blue` / `theme-purple` / `theme-green`;深色加 `dark`。
|
|
23
|
+
|
|
24
|
+
## 组件写法(Vue)
|
|
25
|
+
|
|
26
|
+
- **由 props 推导的 class 或样式**:必须用 `computed()`,禁止用一次性 `const`(否则 props 变化时不会更新)。
|
|
27
|
+
- 示例:带 `variant` 的按钮,class 应写为
|
|
28
|
+
`const buttonClass = computed(() => baseClass + ' ' + variantClass[props.variant]);`
|
|
29
|
+
模板中 `:class="buttonClass"`。
|
|
30
|
+
- 组件名用 `defineOptions({ name: "PascalName" })`;props 用 `defineProps` + `withDefaults`,类型用 TypeScript。
|
|
31
|
+
|
|
32
|
+
## AI 请求统计(fe-kit-cli)
|
|
33
|
+
|
|
34
|
+
完成本次回复后,在回复**末尾**提示用户执行一次统计记录(项目已安装 `@liu_jimmy/fe-kit-cli` 时):
|
|
35
|
+
- 若本次用到了 block 缓存或等价复用:提示运行 `ai record --request --cache-hit --tokens-saved <估算值>`。
|
|
36
|
+
- 若本次为普通生成/修改代码:提示运行 `ai record --request --tokens-used <估算值>`。
|
|
37
|
+
用户复制到终端执行即可,用于 `ai stats` 的统计与 Cost saved 仅作记录参考。
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
1
3
|
import { defineConfig } from "vite";
|
|
2
4
|
import vue from "@vitejs/plugin-vue";
|
|
3
5
|
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
|
|
4
8
|
export default defineConfig({
|
|
5
9
|
plugins: [vue()],
|
|
10
|
+
resolve: {
|
|
11
|
+
alias: { "@": path.resolve(__dirname, "src") },
|
|
12
|
+
},
|
|
6
13
|
});
|