cdspec 0.1.0 → 0.1.3
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/README.md +86 -33
- package/dist/cli.js +1 -93
- package/dist/config/default.js +1 -48
- package/dist/config/loader.js +1 -30
- package/dist/config/path.js +1 -11
- package/dist/config/types.js +1 -1
- package/dist/skill-core/adapters/claudecode-adapter.js +1 -35
- package/dist/skill-core/adapters/codex-adapter.js +1 -28
- package/dist/skill-core/adapters/iflow-adapter.js +1 -39
- package/dist/skill-core/adapters/index.js +1 -34
- package/dist/skill-core/adapters/shared.js +1 -36
- package/dist/skill-core/manifest-loader.js +1 -63
- package/dist/skill-core/scaffold.js +1 -169
- package/dist/skill-core/service.js +1 -156
- package/dist/skill-core/tool-interactions.js +1 -70
- package/dist/skill-core/types.js +1 -1
- package/dist/skill-core/validator.js +1 -25
- package/dist/utils/frontmatter.js +1 -40
- package/dist/utils/fs.js +1 -37
- package/package.json +12 -2
- package/templates/{standards-backend → backend-standard}/SKILL.md +55 -55
- package/templates/backend-standard/agents/openai.yaml +4 -0
- package/templates/{standards-backend → backend-standard}/references/DDD/346/236/266/346/236/204/347/272/246/346/235/237.md +103 -103
- package/templates/{standards-backend → backend-standard}/references/JUC/345/271/266/345/217/221/350/247/204/350/214/203.md +232 -232
- package/templates/{standards-backend → backend-standard}/references//344/274/240/347/273/237/344/270/211/345/261/202/346/236/266/346/236/204/347/272/246/346/235/237.md +35 -35
- package/templates/{standards-backend → backend-standard}/references//345/220/216/347/253/257/345/274/200/345/217/221/350/247/204/350/214/203.md +49 -49
- package/templates/{standards-backend → backend-standard}/references//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +116 -116
- package/templates/{standards-backend → backend-standard}/references//350/256/276/350/256/241/346/250/241/345/274/217/350/220/275/345/234/260/346/211/213/345/206/214.md +395 -395
- package/templates/{frontend-develop-standard → frontend-standard}/SKILL.md +63 -63
- package/templates/frontend-standard/agents/openai.yaml +4 -0
- package/templates/{frontend-develop-standard/references/frontend_develop_standard.md → frontend-standard/references/frontend_standard.md} +28 -321
- package/AGENTS.md +0 -14
- package/CLAUDE.md +0 -10
- package/dist/skill-core/agent-config.js +0 -40
- package/dist/task-core/parser.js +0 -70
- package/dist/task-core/service.js +0 -28
- package/dist/task-core/storage.js +0 -159
- package/dist/task-core/types.js +0 -1
- package/src/cli.ts +0 -105
- package/src/config/default.ts +0 -51
- package/src/config/loader.ts +0 -37
- package/src/config/path.ts +0 -13
- package/src/config/types.ts +0 -22
- package/src/skill-core/adapters/claudecode-adapter.ts +0 -45
- package/src/skill-core/adapters/codex-adapter.ts +0 -36
- package/src/skill-core/adapters/iflow-adapter.ts +0 -49
- package/src/skill-core/adapters/index.ts +0 -39
- package/src/skill-core/adapters/shared.ts +0 -45
- package/src/skill-core/manifest-loader.ts +0 -79
- package/src/skill-core/scaffold.ts +0 -192
- package/src/skill-core/service.ts +0 -199
- package/src/skill-core/tool-interactions.ts +0 -95
- package/src/skill-core/types.ts +0 -22
- package/src/skill-core/validator.ts +0 -28
- package/src/task-core/parser.ts +0 -89
- package/src/task-core/service.ts +0 -49
- package/src/task-core/storage.ts +0 -177
- package/src/task-core/types.ts +0 -15
- package/src/types/yaml.d.ts +0 -4
- package/src/utils/frontmatter.ts +0 -55
- package/src/utils/fs.ts +0 -41
- package/templates/frontend-develop-standard/agents/openai.yaml +0 -4
- package/templates/standards-backend/agents/openai.yaml +0 -4
- package/tests/skill.test.ts +0 -191
- package/tests/task.test.ts +0 -55
- package/tsconfig.json +0 -16
- package/vitest.config.ts +0 -9
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: frontend-
|
|
3
|
-
description: 部门级前端开发规范执行技能,覆盖 Vue3 编码规范、工程配置规范、Git 提交规范与前端最佳实践。用于前端需求开发、重构、代码评审、工程初始化与联调前自检;当任务涉及 Vue3/TypeScript 页面与组件实现、样式规范、ESLint/Prettier/Husky/Commitlint 配置时触发。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 部门前端开发规范技能
|
|
7
|
-
|
|
8
|
-
## 总体目标
|
|
9
|
-
|
|
10
|
-
在实现前端需求时,优先保证可维护性、一致性与可扩展性,避免临时方案累积技术债务。先明确需求边界与页面职责,再按规范完成编码、样式、工程配置与提交自检。
|
|
11
|
-
|
|
12
|
-
## 增量开发优先级
|
|
13
|
-
|
|
14
|
-
针对系统开发中的增量工作,按以下优先级执行:
|
|
15
|
-
|
|
16
|
-
1. 业务需求与用户明确指令(最高优先级)。
|
|
17
|
-
2. 项目既有规范与代码风格(默认优先遵循)。
|
|
18
|
-
3. 本技能与通用前端规范(用于补充与兜底)。
|
|
19
|
-
|
|
20
|
-
冲突处理原则:
|
|
21
|
-
|
|
22
|
-
- 不冲突时:遵循项目现有风格,本技能作为检查清单。
|
|
23
|
-
- 存在冲突时:以项目既有风格为准,避免在本次需求中做大范围风格迁移。
|
|
24
|
-
- 涉及安全、严重缺陷或团队已达成统一升级决策时,可在说明影响范围后做规范升级。
|
|
25
|
-
|
|
26
|
-
## 执行流程
|
|
27
|
-
|
|
28
|
-
1. 识别任务类型与范围。
|
|
29
|
-
|
|
30
|
-
- 若为页面/组件开发,重点执行 Vue3 组件规范、命名规范、样式作用域规范。
|
|
31
|
-
- 若为工程治理任务,重点执行 EditorConfig、Prettier、ESLint、Husky、Commitlint 配置规范。
|
|
32
|
-
- 若用户已指定现有项目约束,以用户约束优先,在不冲突前提下遵循本技能。
|
|
33
|
-
|
|
34
|
-
2. 加载参考规范并制定实现方案。
|
|
35
|
-
|
|
36
|
-
- 始终加载 `references/
|
|
37
|
-
- 若任务仅涉及局部改动,只应用与改动相关的条目,避免过度改造。
|
|
38
|
-
|
|
39
|
-
3. 编码与配置时强制执行。
|
|
40
|
-
|
|
41
|
-
- 命名语义化:组件、变量、常量、类型命名遵循规范。
|
|
42
|
-
- 统一代码风格:模板双引号、脚本单引号、多属性换行。
|
|
43
|
-
- 样式默认使用作用域(`scoped`),穿透样式使用 `:deep()`。
|
|
44
|
-
- 禁止保留 `console.log`、`debugger` 和无效注释代码。
|
|
45
|
-
- 事件与处理函数命名保持一致(如 `on-*`、`handle*`)。
|
|
46
|
-
|
|
47
|
-
4. 交付前执行自检。
|
|
48
|
-
|
|
49
|
-
- 检查格式化与 lint 规则是否一致。
|
|
50
|
-
- 检查组件职责是否清晰、是否存在可复用代码未抽离。
|
|
51
|
-
- 检查性能与安全风险(如不必要渲染、`v-html`、输入校验缺失)。
|
|
52
|
-
- 检查提交信息是否符合约定式提交规范。
|
|
53
|
-
|
|
54
|
-
## 交付要求
|
|
55
|
-
|
|
56
|
-
1. 明确说明本次改动遵循的前端规范条目(至少包含命名、样式、质量自检中的关键项)。
|
|
57
|
-
2. 若涉及工程配置,列出新增或调整的配置文件与关键配置项。
|
|
58
|
-
3. 若涉及组件开发,说明组件职责、事件约定与样式边界处理方式。
|
|
59
|
-
4. 输出遗留风险与后续建议,避免把隐患留给后续维护者。
|
|
60
|
-
|
|
61
|
-
## 参考资料
|
|
62
|
-
|
|
63
|
-
- `references/
|
|
1
|
+
---
|
|
2
|
+
name: frontend-standard
|
|
3
|
+
description: 部门级前端开发规范执行技能,覆盖 Vue3 编码规范、工程配置规范、Git 提交规范与前端最佳实践。用于前端需求开发、重构、代码评审、工程初始化与联调前自检;当任务涉及 Vue3/TypeScript 页面与组件实现、样式规范、ESLint/Prettier/Husky/Commitlint 配置时触发。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 部门前端开发规范技能
|
|
7
|
+
|
|
8
|
+
## 总体目标
|
|
9
|
+
|
|
10
|
+
在实现前端需求时,优先保证可维护性、一致性与可扩展性,避免临时方案累积技术债务。先明确需求边界与页面职责,再按规范完成编码、样式、工程配置与提交自检。
|
|
11
|
+
|
|
12
|
+
## 增量开发优先级
|
|
13
|
+
|
|
14
|
+
针对系统开发中的增量工作,按以下优先级执行:
|
|
15
|
+
|
|
16
|
+
1. 业务需求与用户明确指令(最高优先级)。
|
|
17
|
+
2. 项目既有规范与代码风格(默认优先遵循)。
|
|
18
|
+
3. 本技能与通用前端规范(用于补充与兜底)。
|
|
19
|
+
|
|
20
|
+
冲突处理原则:
|
|
21
|
+
|
|
22
|
+
- 不冲突时:遵循项目现有风格,本技能作为检查清单。
|
|
23
|
+
- 存在冲突时:以项目既有风格为准,避免在本次需求中做大范围风格迁移。
|
|
24
|
+
- 涉及安全、严重缺陷或团队已达成统一升级决策时,可在说明影响范围后做规范升级。
|
|
25
|
+
|
|
26
|
+
## 执行流程
|
|
27
|
+
|
|
28
|
+
1. 识别任务类型与范围。
|
|
29
|
+
|
|
30
|
+
- 若为页面/组件开发,重点执行 Vue3 组件规范、命名规范、样式作用域规范。
|
|
31
|
+
- 若为工程治理任务,重点执行 EditorConfig、Prettier、ESLint、Husky、Commitlint 配置规范。
|
|
32
|
+
- 若用户已指定现有项目约束,以用户约束优先,在不冲突前提下遵循本技能。
|
|
33
|
+
|
|
34
|
+
2. 加载参考规范并制定实现方案。
|
|
35
|
+
|
|
36
|
+
- 始终加载 `references/frontend_standard.md`。
|
|
37
|
+
- 若任务仅涉及局部改动,只应用与改动相关的条目,避免过度改造。
|
|
38
|
+
|
|
39
|
+
3. 编码与配置时强制执行。
|
|
40
|
+
|
|
41
|
+
- 命名语义化:组件、变量、常量、类型命名遵循规范。
|
|
42
|
+
- 统一代码风格:模板双引号、脚本单引号、多属性换行。
|
|
43
|
+
- 样式默认使用作用域(`scoped`),穿透样式使用 `:deep()`。
|
|
44
|
+
- 禁止保留 `console.log`、`debugger` 和无效注释代码。
|
|
45
|
+
- 事件与处理函数命名保持一致(如 `on-*`、`handle*`)。
|
|
46
|
+
|
|
47
|
+
4. 交付前执行自检。
|
|
48
|
+
|
|
49
|
+
- 检查格式化与 lint 规则是否一致。
|
|
50
|
+
- 检查组件职责是否清晰、是否存在可复用代码未抽离。
|
|
51
|
+
- 检查性能与安全风险(如不必要渲染、`v-html`、输入校验缺失)。
|
|
52
|
+
- 检查提交信息是否符合约定式提交规范。
|
|
53
|
+
|
|
54
|
+
## 交付要求
|
|
55
|
+
|
|
56
|
+
1. 明确说明本次改动遵循的前端规范条目(至少包含命名、样式、质量自检中的关键项)。
|
|
57
|
+
2. 若涉及工程配置,列出新增或调整的配置文件与关键配置项。
|
|
58
|
+
3. 若涉及组件开发,说明组件职责、事件约定与样式边界处理方式。
|
|
59
|
+
4. 输出遗留风险与后续建议,避免把隐患留给后续维护者。
|
|
60
|
+
|
|
61
|
+
## 参考资料
|
|
62
|
+
|
|
63
|
+
- `references/frontend_standard.md`
|
|
@@ -7,19 +7,19 @@
|
|
|
7
7
|
#### 1.1.1 组件命名
|
|
8
8
|
|
|
9
9
|
**文件夹和文件名**
|
|
10
|
+
|
|
10
11
|
- 使用小驼峰命名法(camelCase)
|
|
11
12
|
- 示例:`testList/testList.vue`
|
|
12
13
|
|
|
13
14
|
**组件引用**
|
|
15
|
+
|
|
14
16
|
```vue
|
|
15
17
|
<template>
|
|
16
18
|
<!-- 自闭合组件 -->
|
|
17
19
|
<test-component />
|
|
18
20
|
|
|
19
21
|
<!-- 包含内容的组件 -->
|
|
20
|
-
<container-component>
|
|
21
|
-
This is content
|
|
22
|
-
</container-component>
|
|
22
|
+
<container-component> This is content </container-component>
|
|
23
23
|
</template>
|
|
24
24
|
|
|
25
25
|
<script setup>
|
|
@@ -31,10 +31,11 @@ import ContainerComponent from './components/ContainerComponent.vue'
|
|
|
31
31
|
#### 1.1.2 变量和常量命名
|
|
32
32
|
|
|
33
33
|
**变量命名**
|
|
34
|
+
|
|
34
35
|
- 使用小驼峰命名法(camelCase)
|
|
35
36
|
- 语义化,见名知意
|
|
36
37
|
|
|
37
|
-
```
|
|
38
|
+
```vue
|
|
38
39
|
// 推荐
|
|
39
40
|
let userInfo = {}
|
|
40
41
|
let infoList = []
|
|
@@ -46,10 +47,11 @@ let data = []
|
|
|
46
47
|
```
|
|
47
48
|
|
|
48
49
|
**常量命名**
|
|
50
|
+
|
|
49
51
|
- 使用全大写字母,单词间用下划线分隔
|
|
50
52
|
- 语义化,见名知意
|
|
51
53
|
|
|
52
|
-
```
|
|
54
|
+
```vue
|
|
53
55
|
// 推荐
|
|
54
56
|
const MAX_NUMBER = 10
|
|
55
57
|
const API_BASE_URL = 'https://api.example.com'
|
|
@@ -87,7 +89,7 @@ export interface CStateParams extends CState {
|
|
|
87
89
|
#### 1.2.1 引号使用规范
|
|
88
90
|
|
|
89
91
|
- HTML 属性使用双引号 `""`
|
|
90
|
-
-
|
|
92
|
+
- vue 代码使用单引号 `''`
|
|
91
93
|
|
|
92
94
|
```vue
|
|
93
95
|
<template>
|
|
@@ -106,20 +108,9 @@ const message = 'This is a message'
|
|
|
106
108
|
|
|
107
109
|
```vue
|
|
108
110
|
<template>
|
|
109
|
-
<a-table-column
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
:width="180"
|
|
113
|
-
align="center"
|
|
114
|
-
:sorter="true"
|
|
115
|
-
/>
|
|
116
|
-
|
|
117
|
-
<li
|
|
118
|
-
v-for="(item, index) in testList"
|
|
119
|
-
:key="index"
|
|
120
|
-
:span="4"
|
|
121
|
-
style="margin-bottom: 10px"
|
|
122
|
-
>
|
|
111
|
+
<a-table-column data-index="name" title="名称" :width="180" align="center" :sorter="true" />
|
|
112
|
+
|
|
113
|
+
<li v-for="(item, index) in testList" :key="index" :span="4" style="margin-bottom: 10px">
|
|
123
114
|
{{ item.name }}
|
|
124
115
|
</li>
|
|
125
116
|
</template>
|
|
@@ -213,11 +204,11 @@ onUnmounted(() => {
|
|
|
213
204
|
</template>
|
|
214
205
|
|
|
215
206
|
<script setup>
|
|
216
|
-
const handleChange =
|
|
207
|
+
const handleChange = value => {
|
|
217
208
|
console.log('value changed:', value)
|
|
218
209
|
}
|
|
219
210
|
|
|
220
|
-
const handleSubmit =
|
|
211
|
+
const handleSubmit = data => {
|
|
221
212
|
console.log('form submitted:', data)
|
|
222
213
|
}
|
|
223
214
|
</script>
|
|
@@ -261,14 +252,14 @@ const onSubmit = () => {
|
|
|
261
252
|
|
|
262
253
|
#### 1.4.2 脚本注释
|
|
263
254
|
|
|
264
|
-
```
|
|
255
|
+
```vue
|
|
265
256
|
// 删除用户
|
|
266
|
-
const deleteUser =
|
|
257
|
+
const deleteUser = id => {
|
|
267
258
|
// 实现逻辑
|
|
268
259
|
}
|
|
269
260
|
|
|
270
261
|
// 新增用户
|
|
271
|
-
const addUser =
|
|
262
|
+
const addUser = userData => {
|
|
272
263
|
// 实现逻辑
|
|
273
264
|
}
|
|
274
265
|
|
|
@@ -288,11 +279,12 @@ const updateUser = async (id, userData) => {
|
|
|
288
279
|
#### 1.5.1 移除调试代码
|
|
289
280
|
|
|
290
281
|
提交代码前必须移除:
|
|
282
|
+
|
|
291
283
|
- `console.log()`
|
|
292
284
|
- `debugger`
|
|
293
285
|
- 注释掉的无用代码
|
|
294
286
|
|
|
295
|
-
```
|
|
287
|
+
```vue
|
|
296
288
|
// ❌ 不推荐
|
|
297
289
|
const fetchData = () => {
|
|
298
290
|
console.log('fetching data...')
|
|
@@ -313,13 +305,7 @@ const fetchData = () => {
|
|
|
313
305
|
<template>
|
|
314
306
|
<div class="user-form">
|
|
315
307
|
<a-card>
|
|
316
|
-
<a-form
|
|
317
|
-
ref="formRef"
|
|
318
|
-
:model="formState"
|
|
319
|
-
:rules="rules"
|
|
320
|
-
:label-col="{ span: 4 }"
|
|
321
|
-
:wrapper-col="{ span: 20 }"
|
|
322
|
-
>
|
|
308
|
+
<a-form ref="formRef" :model="formState" :rules="rules" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
|
|
323
309
|
<!-- 名称 -->
|
|
324
310
|
<a-form-item label="名称" name="name">
|
|
325
311
|
<a-input v-model:value="formState.name" placeholder="请输入名称" />
|
|
@@ -327,27 +313,19 @@ const fetchData = () => {
|
|
|
327
313
|
|
|
328
314
|
<!-- 标签 -->
|
|
329
315
|
<a-form-item label="标签" name="label">
|
|
330
|
-
<a-button type="link" @click="addLabel">
|
|
331
|
-
+添加一行
|
|
332
|
-
</a-button>
|
|
316
|
+
<a-button type="link" @click="addLabel"> +添加一行 </a-button>
|
|
333
317
|
<span>(最多 20 个标签)</span>
|
|
334
318
|
</a-form-item>
|
|
335
319
|
|
|
336
320
|
<!-- 描述 -->
|
|
337
321
|
<a-form-item label="描述" name="describe">
|
|
338
|
-
<a-textarea
|
|
339
|
-
v-model:value="formState.describe"
|
|
340
|
-
:rows="2"
|
|
341
|
-
placeholder="请输入描述"
|
|
342
|
-
/>
|
|
322
|
+
<a-textarea v-model:value="formState.describe" :rows="2" placeholder="请输入描述" />
|
|
343
323
|
</a-form-item>
|
|
344
324
|
|
|
345
325
|
<!-- 操作按钮 -->
|
|
346
326
|
<a-form-item :wrapper-col="{ offset: 4, span: 20 }">
|
|
347
327
|
<a-button @click="handleCancel">取消</a-button>
|
|
348
|
-
<a-button type="primary" @click="handleSubmit" style="margin-left: 10px">
|
|
349
|
-
确认
|
|
350
|
-
</a-button>
|
|
328
|
+
<a-button type="primary" @click="handleSubmit" style="margin-left: 10px"> 确认 </a-button>
|
|
351
329
|
</a-form-item>
|
|
352
330
|
</a-form>
|
|
353
331
|
</a-card>
|
|
@@ -378,9 +356,7 @@ const formState = reactive({
|
|
|
378
356
|
|
|
379
357
|
// 表单验证规则
|
|
380
358
|
const rules: Record<string, Rule[]> = {
|
|
381
|
-
name: [
|
|
382
|
-
{ required: true, message: '请输入设备名称', trigger: 'blur' }
|
|
383
|
-
]
|
|
359
|
+
name: [{ required: true, message: '请输入设备名称', trigger: 'blur' }]
|
|
384
360
|
}
|
|
385
361
|
|
|
386
362
|
// 新增标签
|
|
@@ -447,285 +423,16 @@ const handleSubmit = async () => {
|
|
|
447
423
|
</style>
|
|
448
424
|
```
|
|
449
425
|
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
## 二、项目配置规范
|
|
453
|
-
|
|
454
|
-
### 2.1 EditorConfig 配置
|
|
455
|
-
|
|
456
|
-
EditorConfig 帮助团队维护一致的编码风格。
|
|
457
|
-
|
|
458
|
-
在项目根目录创建 `.editorconfig` 文件:
|
|
459
|
-
|
|
460
|
-
```ini
|
|
461
|
-
# http://editorconfig.org
|
|
462
|
-
|
|
463
|
-
root = true
|
|
464
|
-
|
|
465
|
-
[*]
|
|
466
|
-
charset = utf-8
|
|
467
|
-
indent_style = space
|
|
468
|
-
indent_size = 2
|
|
469
|
-
end_of_line = lf
|
|
470
|
-
trim_trailing_whitespace = true
|
|
471
|
-
insert_final_newline = true
|
|
472
|
-
|
|
473
|
-
[*.md]
|
|
474
|
-
max_line_length = off
|
|
475
|
-
trim_trailing_whitespace = false
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
**配置说明:**
|
|
479
|
-
- `charset`: 文件字符集为 UTF-8
|
|
480
|
-
- `indent_style`: 缩进风格(space 或 tab)
|
|
481
|
-
- `indent_size`: 缩进大小为 2 个空格
|
|
482
|
-
- `end_of_line`: 换行符类型(lf、cr 或 crlf)
|
|
483
|
-
- `trim_trailing_whitespace`: 去除行尾空白字符
|
|
484
|
-
- `insert_final_newline`: 文件末尾插入新行
|
|
485
|
-
|
|
486
|
-
**VSCode 插件:** 需安装 `EditorConfig for VS Code`
|
|
487
|
-
|
|
488
|
-
### 2.2 Prettier 配置
|
|
489
|
-
|
|
490
|
-
Prettier 是强大的代码格式化工具,支持多种前端语言。
|
|
491
|
-
|
|
492
|
-
在项目根目录创建 `.prettierrc` 文件:
|
|
493
|
-
|
|
494
|
-
```json
|
|
495
|
-
{
|
|
496
|
-
"useTabs": false,
|
|
497
|
-
"tabWidth": 2,
|
|
498
|
-
"printWidth": 80,
|
|
499
|
-
"singleQuote": true,
|
|
500
|
-
"trailingComma": "none",
|
|
501
|
-
"semi": false
|
|
502
|
-
}
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
**配置说明:**
|
|
506
|
-
|
|
507
|
-
| 属性 | 说明 |
|
|
508
|
-
|------|------|
|
|
509
|
-
| useTabs | false: 使用空格缩进,true: 使用 tab 缩进 |
|
|
510
|
-
| tabWidth | 缩进空格数,设置为 2 |
|
|
511
|
-
| printWidth | 单行最大字符数,推荐 80 或 100 |
|
|
512
|
-
| singleQuote | true: 使用单引号,false: 使用双引号 |
|
|
513
|
-
| trailingComma | 多行输入尾逗号,设置为 none |
|
|
514
|
-
| semi | false: 不加分号,true: 加分号 |
|
|
515
|
-
|
|
516
|
-
**VSCode 插件:** 需安装 `Prettier - Code formatter`
|
|
517
|
-
|
|
518
|
-
**常见问题:**
|
|
519
|
-
|
|
520
|
-
1. **保存代码无法格式化**
|
|
521
|
-
- 原因:未设置默认格式化插件
|
|
522
|
-
- 解决:右键 → 格式化文档 → 选择 Prettier
|
|
523
|
-
|
|
524
|
-
2. **保存无法自动格式化**
|
|
525
|
-
- 原因:未开启保存时格式化
|
|
526
|
-
- 解决:文件 → 设置 → 搜索 "Format On Save" → 勾选
|
|
527
|
-
|
|
528
|
-
**快速格式化所有文件:**
|
|
529
|
-
|
|
530
|
-
在 `package.json` 添加脚本:
|
|
531
|
-
|
|
532
|
-
```json
|
|
533
|
-
{
|
|
534
|
-
"scripts": {
|
|
535
|
-
"prettier": "prettier --write ."
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
```
|
|
539
|
-
|
|
540
|
-
运行命令:
|
|
541
|
-
|
|
542
|
-
```bash
|
|
543
|
-
npm run prettier
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
### 2.3 Prettier 忽略配置
|
|
547
|
-
|
|
548
|
-
在项目根目录创建 `.prettierignore` 文件:
|
|
549
|
-
|
|
550
|
-
```
|
|
551
|
-
/dist/*
|
|
552
|
-
.local
|
|
553
|
-
.output.js
|
|
554
|
-
/node_modules/**
|
|
555
|
-
**/*.svg
|
|
556
|
-
**/*.sh
|
|
557
|
-
/public/*
|
|
558
|
-
```
|
|
559
|
-
|
|
560
|
-
### 2.4 ESLint 配置
|
|
561
|
-
|
|
562
|
-
Vue 项目创建时会自动配置 ESLint。
|
|
563
|
-
|
|
564
|
-
**VSCode 插件:** 需安装 `ESLint`
|
|
565
|
-
|
|
566
|
-
**解决 ESLint 和 Prettier 冲突:**
|
|
567
|
-
|
|
568
|
-
安装插件(Vue 创建项目时选择 Prettier 会自动安装):
|
|
569
|
-
|
|
570
|
-
```bash
|
|
571
|
-
npm install eslint-plugin-prettier eslint-config-prettier -D
|
|
572
|
-
```
|
|
573
|
-
|
|
574
|
-
在 `.eslintrc.js` 文件的 `extends` 中添加:
|
|
575
|
-
|
|
576
|
-
```javascript
|
|
577
|
-
module.exports = {
|
|
578
|
-
extends: [
|
|
579
|
-
// ... 其他配置
|
|
580
|
-
'plugin:prettier/recommended'
|
|
581
|
-
]
|
|
582
|
-
}
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
**注意:** `plugin:` 和 `prettier` 之间没有空格
|
|
586
|
-
|
|
587
|
-
---
|
|
588
|
-
|
|
589
|
-
## 三、Git 提交规范
|
|
590
|
-
|
|
591
|
-
### 3.1 Husky 配置
|
|
592
|
-
|
|
593
|
-
Husky 用于在 Git 操作时触发钩子。
|
|
594
|
-
|
|
595
|
-
**安装 Husky:**
|
|
596
|
-
|
|
597
|
-
```bash
|
|
598
|
-
npm install husky -D
|
|
599
|
-
```
|
|
600
|
-
|
|
601
|
-
**配置 prepare 脚本:**
|
|
602
|
-
|
|
603
|
-
```bash
|
|
604
|
-
npm set-script prepare "husky install"
|
|
605
|
-
npm run prepare
|
|
606
|
-
```
|
|
607
|
-
|
|
608
|
-
**添加 pre-commit 钩子:**
|
|
609
|
-
|
|
610
|
-
```bash
|
|
611
|
-
npx husky add .husky/pre-commit "npx eslint ./"
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
如果自动生成失败,手动创建 `.husky/pre-commit` 文件:
|
|
615
|
-
|
|
616
|
-
```bash
|
|
617
|
-
#!/bin/sh
|
|
618
|
-
. "$(dirname "$0")/_/husky.sh"
|
|
619
|
-
|
|
620
|
-
npx eslint ./
|
|
621
|
-
```
|
|
622
|
-
|
|
623
|
-
### 3.2 Commitlint 配置
|
|
624
|
-
|
|
625
|
-
**安装 Commitlint:**
|
|
626
|
-
|
|
627
|
-
```bash
|
|
628
|
-
npm install --save-dev @commitlint/config-conventional @commitlint/cli
|
|
629
|
-
```
|
|
630
|
-
|
|
631
|
-
**创建配置文件:**
|
|
632
|
-
|
|
633
|
-
```bash
|
|
634
|
-
echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
**注意:** 确保文件编码为 UTF-8
|
|
638
|
-
|
|
639
|
-
**添加 commit-msg 钩子:**
|
|
640
|
-
|
|
641
|
-
```bash
|
|
642
|
-
npx husky add .husky/commit-msg "npx --no -- commitlint --edit ${1}"
|
|
643
|
-
```
|
|
644
|
-
|
|
645
|
-
如果自动生成失败,手动创建 `.husky/commit-msg` 文件:
|
|
646
|
-
|
|
647
|
-
```bash
|
|
648
|
-
#!/bin/sh
|
|
649
|
-
. "$(dirname "$0")/_/husky.sh"
|
|
650
|
-
|
|
651
|
-
npx --no-install commitlint --edit $1
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
**禁用 Husky(如需要):**
|
|
655
|
-
|
|
656
|
-
在 `.git/config` 文件中注释掉:
|
|
657
|
-
|
|
658
|
-
```
|
|
659
|
-
# hooksPath = .husky
|
|
660
|
-
```
|
|
661
|
-
|
|
662
|
-
### 3.3 Commit 提交规范
|
|
663
|
-
|
|
664
|
-
**提交类型说明:**
|
|
665
|
-
|
|
666
|
-
| 类型 | 说明 |
|
|
667
|
-
|------|------|
|
|
668
|
-
| feat | 新增功能 |
|
|
669
|
-
| fix | 修复 Bug |
|
|
670
|
-
| docs | 文档更新 |
|
|
671
|
-
| style | 代码格式调整(不影响功能) |
|
|
672
|
-
| refactor | 代码重构 |
|
|
673
|
-
| perf | 性能优化 |
|
|
674
|
-
| test | 测试相关 |
|
|
675
|
-
| chore | 构建过程或辅助工具的变动 |
|
|
676
|
-
| revert | 回滚提交 |
|
|
677
|
-
| build | 影响构建系统或外部依赖 |
|
|
678
|
-
| ci | CI 配置文件和脚本的变动 |
|
|
679
|
-
| types | 类型定义文件更改 |
|
|
680
|
-
| wip | 开发中(work in progress) |
|
|
681
|
-
|
|
682
|
-
**提交格式:**
|
|
683
|
-
|
|
684
|
-
```bash
|
|
685
|
-
git commit -m "type: description"
|
|
686
|
-
```
|
|
687
|
-
|
|
688
|
-
**示例:**
|
|
689
|
-
|
|
690
|
-
```bash
|
|
691
|
-
# 新增功能
|
|
692
|
-
git commit -m "feat: 添加用户登录功能"
|
|
693
|
-
|
|
694
|
-
# 修复 Bug
|
|
695
|
-
git commit -m "fix: 修复用户列表分页问题"
|
|
696
|
-
|
|
697
|
-
# 文档更新
|
|
698
|
-
git commit -m "docs: 更新 API 文档"
|
|
699
|
-
|
|
700
|
-
# 代码重构
|
|
701
|
-
git commit -m "refactor: 重构用户模块代码结构"
|
|
702
|
-
|
|
703
|
-
# 性能优化
|
|
704
|
-
git commit -m "perf: 优化列表渲染性能"
|
|
705
|
-
```
|
|
706
|
-
|
|
707
|
-
**完整格式(可选):**
|
|
708
|
-
|
|
709
|
-
```bash
|
|
710
|
-
git commit -m "feat: 添加用户登录功能
|
|
711
|
-
|
|
712
|
-
- 实现用户名密码登录
|
|
713
|
-
- 添加记住密码功能
|
|
714
|
-
- 集成第三方登录"
|
|
715
|
-
```
|
|
716
|
-
|
|
717
|
-
---
|
|
718
|
-
|
|
719
|
-
## 四、最佳实践建议
|
|
426
|
+
## 二、最佳实践建议
|
|
720
427
|
|
|
721
|
-
###
|
|
428
|
+
### 2.1 代码组织
|
|
722
429
|
|
|
723
430
|
- 按功能模块组织代码,而非按文件类型
|
|
724
431
|
- 保持组件单一职责
|
|
725
432
|
- 合理拆分大型组件
|
|
726
433
|
- 复用性高的代码抽取为公共组件或工具函数
|
|
727
434
|
|
|
728
|
-
###
|
|
435
|
+
### 2.2 性能优化
|
|
729
436
|
|
|
730
437
|
- 合理使用 `v-if` 和 `v-show`
|
|
731
438
|
- 列表渲染使用唯一 `key`
|
|
@@ -733,14 +440,14 @@ git commit -m "feat: 添加用户登录功能
|
|
|
733
440
|
- 使用 `computed` 缓存计算结果
|
|
734
441
|
- 大型列表使用虚拟滚动
|
|
735
442
|
|
|
736
|
-
###
|
|
443
|
+
### 2.3 安全规范
|
|
737
444
|
|
|
738
445
|
- 避免使用 `v-html`,防止 XSS 攻击
|
|
739
446
|
- 敏感信息不要硬编码在前端
|
|
740
447
|
- API 请求添加适当的权限验证
|
|
741
448
|
- 用户输入进行验证和过滤
|
|
742
449
|
|
|
743
|
-
###
|
|
450
|
+
### 2.4 可维护性
|
|
744
451
|
|
|
745
452
|
- 编写清晰的注释
|
|
746
453
|
- 保持代码简洁易读
|
package/AGENTS.md
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# AGENTS instructions
|
|
2
|
-
|
|
3
|
-
<INSTRUCTIONS>
|
|
4
|
-
## OpenSpec Setup
|
|
5
|
-
Enabled targets: codex
|
|
6
|
-
### Skills
|
|
7
|
-
- design-doc: 管理业务详细设计文档的全生命周期:首次基线、增量 feature 文档、归档合并。适用于首次开发与迭代改造,避免小改动频繁新建基线版本文件,同时保留 feature 变更历史。
|
|
8
|
-
- frontend-standards: 部门级前端开发规范执行技能,覆盖 Vue3 编码规范、工程配置规范、Git 提交规范与前端最佳实践。用于前端需求开发、重构、代码评审、工程初始化与联调前自检;当任务涉及 Vue3/TypeScript 页面与组件实现、样式规范、ESLint/Prettier/Husky/Commitlint 配置时触发。
|
|
9
|
-
- standards-backend: 部门级后端开发规范执行技能,覆盖后端编码规范、数据库设计规范、传统三层架构约束、DDD架构约束、常用设计模式落地与JUC并发编排规范,并内置数据表基线字段与关联表例外规则。用于需求开发、重构、代码评审、建表SQL设计、接口设计、并发优化与联调前自检等场景;当任务涉及 Java 后端实现、SQL/表结构、分层落位、架构选型(三层或DDD)、可扩展性设计(策略/工厂/责任链/适配器/模板/单例)或线程池/CompletableFuture/CountDownLatch/Semaphore/ReentrantLock/Atomic* 等并发处理时触发。
|
|
10
|
-
### Command Bindings
|
|
11
|
-
- cd-design-doc -> design-doc
|
|
12
|
-
- cd-frontend-standards -> frontend-standards
|
|
13
|
-
- cd-standards-backend -> standards-backend
|
|
14
|
-
</INSTRUCTIONS>
|
package/CLAUDE.md
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# claudecode OpenSpec-style setup
|
|
2
|
-
|
|
3
|
-
## Installed skills
|
|
4
|
-
- frontend-develop-standard: Generated from templates/frontend_develop_standard.md
|
|
5
|
-
|
|
6
|
-
## Commands
|
|
7
|
-
- /opsx:propose -> frontend-develop-standard
|
|
8
|
-
- /opsx:explore -> frontend-develop-standard
|
|
9
|
-
- /opsx:apply -> frontend-develop-standard
|
|
10
|
-
- /opsx:archive -> frontend-develop-standard
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { basename, join } from "node:path";
|
|
2
|
-
import { writeFile } from "node:fs/promises";
|
|
3
|
-
import { ensureDir } from "../utils/fs.js";
|
|
4
|
-
const CONFIG_FILE_BY_TARGET = {
|
|
5
|
-
codex: "AGENTS.md",
|
|
6
|
-
claudecode: "CLAUDE.md",
|
|
7
|
-
iflow: "IFLOW.md"
|
|
8
|
-
};
|
|
9
|
-
export async function writeAgentConfig(cwd, target, skills) {
|
|
10
|
-
await ensureDir(cwd);
|
|
11
|
-
const filename = CONFIG_FILE_BY_TARGET[target];
|
|
12
|
-
const filePath = join(cwd, filename);
|
|
13
|
-
const content = renderConfig(target, skills);
|
|
14
|
-
await writeFile(filePath, content, "utf8");
|
|
15
|
-
return filePath;
|
|
16
|
-
}
|
|
17
|
-
function renderConfig(target, skills) {
|
|
18
|
-
const title = `# ${filenameForTarget(target)} instructions`;
|
|
19
|
-
const lines = [title, "", "<INSTRUCTIONS>", "## Skills"];
|
|
20
|
-
lines.push("A skill is a local capability package. The list below is generated by `cdspec init`.");
|
|
21
|
-
lines.push("### Available skills");
|
|
22
|
-
if (skills.length === 0) {
|
|
23
|
-
lines.push("- (none)");
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
for (const skill of skills) {
|
|
27
|
-
const desc = skill.description || "No description.";
|
|
28
|
-
lines.push(`- ${skill.name}: ${desc} (file: skills/${target}/${skill.name}/SKILL.md)`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
lines.push("### How to use");
|
|
32
|
-
lines.push("- Mention the skill name in your request, or use `/use <skill-name>`.");
|
|
33
|
-
lines.push("- In Codex, `$<skill-name>` is also supported.");
|
|
34
|
-
lines.push("- Skills are project-local and loaded from the generated `skills/` folder.");
|
|
35
|
-
lines.push("</INSTRUCTIONS>", "");
|
|
36
|
-
return lines.join("\n");
|
|
37
|
-
}
|
|
38
|
-
function filenameForTarget(target) {
|
|
39
|
-
return basename(CONFIG_FILE_BY_TARGET[target], ".md").toUpperCase();
|
|
40
|
-
}
|