@agile-team/wl-skills-kit 1.1.2 → 1.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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.1.3] - 2026-04-09
|
|
4
|
+
|
|
5
|
+
### 重构:convention-extract → convention-audit(规范审计)
|
|
6
|
+
|
|
7
|
+
- **定位翻转**:从"扫描代码提炼规范"改为"用规范审计代码"
|
|
8
|
+
- 旧:项目代码 → 提炼 → 规范文档(代码乱则规范乱)
|
|
9
|
+
- 新:copilot-instructions.md(标准) → 审计 → 偏差报告 + 整改建议
|
|
10
|
+
- SKILL.md 完全重写:10 项审计维度、偏差严重度定义、报告模板、执行步骤
|
|
11
|
+
- copilot-instructions.md 注册表触发关键词更新:提炼规范 → 规范审计/代码审计/规范检查
|
|
12
|
+
- use-skill.md、wl-skills-kit.md 相关描述同步更新
|
|
13
|
+
|
|
3
14
|
## [1.1.2] - 2026-04-09
|
|
4
15
|
|
|
5
16
|
### 新增:Skills 自动调度注册表
|
package/README.md
CHANGED
|
@@ -46,7 +46,7 @@ npx @agile-team/wl-skills-kit@latest
|
|
|
46
46
|
│ │ │ ├── TPL-OPERATION-STATION.md← 工序操作站模板
|
|
47
47
|
│ │ │ └── TPL-DRIVEN.md ← 配置驱动模板识别参考
|
|
48
48
|
│ │ ├── menu-sync/SKILL.md ← ④ 菜单同步(pages.ts → 后端菜单表)
|
|
49
|
-
│ │ └── convention-extract/SKILL.md ← ⑤
|
|
49
|
+
│ │ └── convention-extract/SKILL.md ← ⑤ 规范审计(用规范审计代码,输出偏差报告)
|
|
50
50
|
│ └── docs/ ← 设计文档
|
|
51
51
|
│ ├── use-skill.md ← Skill 使用 + 移植一站式指南
|
|
52
52
|
│ ├── menu-sync-design.md ← 菜单同步方案设计
|
|
@@ -129,7 +129,7 @@ npx @agile-team/wl-skills-kit@latest
|
|
|
129
129
|
▼
|
|
130
130
|
④ menu-sync ──────── 同步 → 后端菜单表(AI 自动调 API 创建菜单)
|
|
131
131
|
|
|
132
|
-
⑤ convention-
|
|
132
|
+
⑤ convention-audit 按需:用规范审计代码 → 偏差报告 + 整改建议
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
### 支持 9 种页面模板
|
|
@@ -185,7 +185,7 @@ AI 自动执行 5 步:扫描 → 生成接口约定 → 生成页面代码 →
|
|
|
185
185
|
| 给页面生成接口文档 | "生成 api.md" | api-contract |
|
|
186
186
|
| 只生成单个页面代码 | "帮我生成客户档案页面" | page-codegen |
|
|
187
187
|
| 把 pages.ts 同步到菜单表 | "帮我创建菜单" | menu-sync |
|
|
188
|
-
|
|
|
188
|
+
| 审计项目代码是否合规 | "审计项目规范" / "规范检查" | convention-audit |
|
|
189
189
|
| 查看组件怎么用 | "jh-select 怎么用" | AI 读取 docs/jh-select.md |
|
|
190
190
|
| 参考样例写代码 | "参考 demo 里的客户档案" | AI 读取 demo/ 下的代码 |
|
|
191
191
|
|
|
@@ -211,7 +211,7 @@ onMounted(() => select());
|
|
|
211
211
|
| 接口约定、api.md、字段定义、前后端对齐、接口设计 | `.github/skills/api-contract/SKILL.md` | api-contract |
|
|
212
212
|
| 生成页面、创建页面、代码生成、vue页面、按原型生成 | `.github/skills/page-codegen/SKILL.md`(主文件会指示继续读取对应的 `TPL-*.md` 模板) | page-codegen |
|
|
213
213
|
| 创建菜单、注册菜单、同步菜单、补菜单 | `.github/skills/menu-sync/SKILL.md` | menu-sync |
|
|
214
|
-
|
|
|
214
|
+
| 规范审计、代码审计、规范检查、对齐规范、规范偏差 | `.github/skills/convention-extract/SKILL.md` | convention-audit |
|
|
215
215
|
|
|
216
216
|
### 完整流水线(原型/详设 → 页面 → 菜单)
|
|
217
217
|
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
| api-contract | page-spec JSON | api.md | ✅ 推荐 | 微调 URL 命名规范 |
|
|
26
26
|
| page-codegen | page-spec JSON + api.md | index.vue + data.ts + index.scss + menu-config.md | ✅ 必须 | **必须改**,代码模板绑项目(含 9 个 TPL-*.md 模板文件,按模式名命名) |
|
|
27
27
|
| menu-sync | SYS_MENU_INFO.md + env.local.json | 后端菜单表记录(AI 调 `/system/menu/save`) | ✅ 推荐 | 不用改,配置 env.local.json 即可(Phase 2 script 待接口就绪) |
|
|
28
|
-
| convention-
|
|
28
|
+
| convention-audit | 项目源码 + copilot-instructions.md | 偏差报告 + 整改建议 | ❌ 按需 | 不用改,规范基线来自 copilot-instructions.md |
|
|
29
29
|
|
|
30
|
-
**核心结论:prototype-scan 直接复制,page-codegen 必须适配新项目的代码模板,convention-
|
|
30
|
+
**核心结论:prototype-scan 直接复制,page-codegen 必须适配新项目的代码模板,convention-audit 用于审计项目代码是否符合规范。**
|
|
31
31
|
|
|
32
32
|
---
|
|
33
33
|
|
|
@@ -178,18 +178,19 @@ page-spec 有误 → 改一行 JSON → 重新生成代码(秒级)
|
|
|
178
178
|
│ ├── prototype-scan/SKILL.md ← 直接复制,不改
|
|
179
179
|
│ ├── api-contract/SKILL.md ← 直接复制,微调命名规范
|
|
180
180
|
│ ├── page-codegen/SKILL.md ← 需要重写代码模板
|
|
181
|
-
│ └── convention-extract/SKILL.md ←
|
|
181
|
+
│ └── convention-extract/SKILL.md ← 直接复制,用于审计代码合规性
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
### 第 2
|
|
184
|
+
### 第 2 步:建立编码规范
|
|
185
185
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
**情况 B:新项目空白** → 复制 `.github/copilot-instructions.md` 作为基础模板,修改:
|
|
186
|
+
复制 `.github/copilot-instructions.md` 作为基础模板,按新项目实际情况修改:
|
|
189
187
|
- 路由注册方式(`gSale`/`gProd` → 新项目的函数名)
|
|
190
188
|
- 组件库(如果仍是 Element Plus + @jhlc/jh-ui 则不改)
|
|
191
189
|
- 页面目录层级、服务缩写前缀
|
|
192
190
|
|
|
191
|
+
> **copilot-instructions.md 是唯一编码规范源头**,团队统一维护此文件。
|
|
192
|
+
> 项目引入后,执行 convention-audit Skill 审计已有代码,输出偏差报告和整改清单。
|
|
193
|
+
|
|
193
194
|
**前置条件清单**:
|
|
194
195
|
|
|
195
196
|
```
|
|
@@ -369,11 +370,11 @@ export default defineConfig(({ command }) => ({
|
|
|
369
370
|
│ ├── TPL-OPERATION-STATION.md ← OPERATION_STATION:工序操作站
|
|
370
371
|
│ └── TPL-DRIVEN.md ← TEMPLATE_DRIVEN:配置驱动识别参考
|
|
371
372
|
├── menu-sync/SKILL.md ← pages.ts → 后端菜单表
|
|
372
|
-
└── convention-extract/SKILL.md ←
|
|
373
|
+
└── convention-extract/SKILL.md ← 规范审计(审计代码是否符合规范)
|
|
373
374
|
docs/
|
|
374
375
|
├── page-query-hook-best-practices.md
|
|
375
376
|
├── request.md
|
|
376
377
|
└── jh-*.md ← 平台组件使用文档
|
|
377
378
|
```
|
|
378
379
|
|
|
379
|
-
> **一句话总结**:prototype-scan 通用可直接复制,page-codegen 需按目标项目改写代码模板,convention-
|
|
380
|
+
> **一句话总结**:prototype-scan 通用可直接复制,page-codegen 需按目标项目改写代码模板,convention-audit 用于审计项目代码合规性。copilot-instructions.md 是唯一规范源头。
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
│ │ ├── menu-sync/
|
|
45
45
|
│ │ │ ├── SKILL.md ← 菜单同步
|
|
46
46
|
│ │ │ └── env/guide.md ← env.local.json 配置说明(json 本身不分发)
|
|
47
|
-
│ │ └── convention-extract/SKILL.md ←
|
|
47
|
+
│ │ └── convention-extract/SKILL.md ← 规范审计
|
|
48
48
|
│ └── docs/
|
|
49
49
|
│ ├── use-skill.md ← 使用 + 移植一站式指南
|
|
50
50
|
│ ├── menu-sync-design.md ← 菜单同步方案设计
|
|
@@ -215,7 +215,7 @@ v1.1 实现:CLI 安装时自动从 `.github/copilot-instructions.md` **动态
|
|
|
215
215
|
详见 [use-skill.md](use-skill.md)「第四章:移植到新项目」。核心步骤:
|
|
216
216
|
|
|
217
217
|
1. `npx @agile-team/wl-skills-kit` → 导入全部文件
|
|
218
|
-
2. 执行 convention-
|
|
218
|
+
2. 执行 convention-audit Skill → 审计项目已有代码,输出偏差报告和整改建议
|
|
219
219
|
3. 改写 page-codegen 代码模板(替换基类、组件、API 调用方式)
|
|
220
220
|
4. 验证:拿一个页面走完整 Skill 流程
|
|
221
221
|
|
|
@@ -1,355 +1,236 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: convention-
|
|
3
|
-
description: "Use when:
|
|
2
|
+
name: convention-audit
|
|
3
|
+
description: "Use when: auditing project source code against the established coding conventions in copilot-instructions.md. Scans files and outputs a deviation report with remediation suggestions. Triggers on: audit code, check conventions, 规范审计, 规范检查, 代码审计, 对齐规范, 规范偏差."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Skill:
|
|
6
|
+
# Skill: 规范审计(convention-audit)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
以 `copilot-instructions.md` 为唯一规范源头,扫描项目源码,找出不符合规范的文件和写法,输出偏差报告及整改建议。
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
以下是完整规范详情,新项目接入时参考「扫描步骤」重新执行。
|
|
10
|
+
> **核心理念**:规范是"标准",代码要对齐标准。不从代码提炼规范,而是用规范审计代码。
|
|
12
11
|
|
|
13
12
|
---
|
|
14
13
|
|
|
15
|
-
##
|
|
14
|
+
## 适用场景
|
|
16
15
|
|
|
17
|
-
|
|
16
|
+
| 场景 | 说明 |
|
|
17
|
+
|------|------|
|
|
18
|
+
| 新项目导入 wl-skills-kit 后 | 扫描旧代码,输出整改清单,逐步迁移到标准模式 |
|
|
19
|
+
| 日常 Code Review 辅助 | AI 比对单文件或目录,快速发现偏差 |
|
|
20
|
+
| 项目迁移/升级 | 老项目引入新架构,批量评估改造量 |
|
|
21
|
+
| 团队培训 | 新成员提交代码前,用审计验证是否符合规范 |
|
|
18
22
|
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 审计维度(10 项)
|
|
26
|
+
|
|
27
|
+
### 1. 页面结构审计
|
|
28
|
+
|
|
29
|
+
**标准**:每个页面目录必须包含 4 个文件:
|
|
19
30
|
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Module Federation(@originjs/vite-plugin-federation,子应用架构)
|
|
31
|
+
[kebab-case目录]/
|
|
32
|
+
├── index.vue ← 纯模板+解构
|
|
33
|
+
├── data.ts ← AbstractPageQueryHook 类 + API_CONFIG
|
|
34
|
+
├── index.scss ← 样式
|
|
35
|
+
└── api.md ← 接口约定
|
|
26
36
|
```
|
|
27
37
|
|
|
28
|
-
|
|
38
|
+
**检查项**:
|
|
39
|
+
- [ ] 目录名是否 kebab-case
|
|
40
|
+
- [ ] 是否缺少 data.ts(逻辑写在 index.vue 里)
|
|
41
|
+
- [ ] 是否缺少 api.md
|
|
42
|
+
- [ ] 是否存在多余文件(如独立的 api.ts)
|
|
29
43
|
|
|
30
|
-
|
|
31
|
-
- 路由、权限、布局、Store 均从主应用 `main` 远程加载
|
|
32
|
-
- 子应用只负责 `src/views/` 下的业务页面
|
|
33
|
-
- 页面在 `vite/plugins/shared/pages.ts` 注册,构建后通过 `exposes` 暴露给主应用
|
|
34
|
-
- 共享依赖:vue, pinia, vue-router, element-plus, @jhlc/common-core
|
|
44
|
+
### 2. data.ts 模式审计
|
|
35
45
|
|
|
36
|
-
|
|
46
|
+
**标准**:使用 `class extends AbstractPageQueryHook` 配置化开发。
|
|
37
47
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
48
|
+
**检查项**:
|
|
49
|
+
- [ ] 是否有 `API_CONFIG` 常量(URL 配置集中管理)
|
|
50
|
+
- [ ] 是否继承 `AbstractPageQueryHook`
|
|
51
|
+
- [ ] 是否通过 `createPage()` 工厂函数导出
|
|
52
|
+
- [ ] `queryDef()` / `toolbarDef()` / `columnsDef()` 是否齐全
|
|
53
|
+
- [ ] 字典字段是否使用 `logicType: BusLogicDataType.dict`
|
|
54
|
+
- [ ] 操作列是否使用 `operations` 配置而非手写 slot
|
|
45
55
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
### 4. data.ts 编码模式(核心)
|
|
52
|
-
|
|
53
|
-
所有页面使用 `class extends AbstractPageQueryHook` 配置化开发:
|
|
54
|
-
|
|
55
|
-
```typescript
|
|
56
|
-
import {
|
|
57
|
-
AbstractPageQueryHook,
|
|
58
|
-
BaseQueryItemDesc,
|
|
59
|
-
ActionButtonDesc,
|
|
60
|
-
TableColumnDesc
|
|
61
|
-
} from "@/types/page";
|
|
62
|
-
import { getAction, postAction } from "@jhlc/common-core/src/api/action";
|
|
63
|
-
import { ElMessage, ElMessageBox } from "element-plus";
|
|
64
|
-
|
|
65
|
-
// ✅ API 配置:URL 格式为 /[服务缩写]/[资源名CamelCase]/[操作]
|
|
66
|
-
export const API_CONFIG = {
|
|
67
|
-
list: "/pm/omptMillPlanOrder/list",
|
|
68
|
-
export: "/pm/omptMillPlanOrder/export",
|
|
69
|
-
remove: "/pm/omptMillPlanOrder/remove",
|
|
70
|
-
getById: "/pm/omptMillPlanOrder/getById",
|
|
71
|
-
save: "/pm/omptMillPlanOrder/save",
|
|
72
|
-
update: "/pm/omptMillPlanOrder/update"
|
|
73
|
-
} as const;
|
|
74
|
-
|
|
75
|
-
// ✅ createPage 工厂:接收弹窗 ref,返回 Page.create()
|
|
76
|
-
export function createPage(addModalRef?: any) {
|
|
77
|
-
let Page = new (class extends AbstractPageQueryHook {
|
|
78
|
-
constructor() {
|
|
79
|
-
// super 传入 list 和 remove 的 URL,基类自动处理分页查询和删除
|
|
80
|
-
super({ url: { list: API_CONFIG.list, remove: API_CONFIG.remove } });
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// ✅ 查询条件(BaseQuery 组件数据源)
|
|
84
|
-
queryDef(): BaseQueryItemDesc<any>[] {
|
|
85
|
-
return [
|
|
86
|
-
// 普通输入框(默认)
|
|
87
|
-
{ name: "orderNo", label: "订单号", placeholder: "请输入订单号" },
|
|
88
|
-
// 字典下拉(自动加载字典数据)
|
|
89
|
-
{
|
|
90
|
-
name: "planStatus",
|
|
91
|
-
label: "计划状态",
|
|
92
|
-
placeholder: "请选择",
|
|
93
|
-
logicType: BusLogicDataType.dict,
|
|
94
|
-
logicValue: "planStatus"
|
|
95
|
-
},
|
|
96
|
-
// 月份选择器
|
|
97
|
-
{
|
|
98
|
-
name: "orderMonth",
|
|
99
|
-
label: "订单月",
|
|
100
|
-
placeholder: "请选择",
|
|
101
|
-
component: () => ({
|
|
102
|
-
tag: "jh-date",
|
|
103
|
-
type: "month",
|
|
104
|
-
showFormat: "YYYY-MM",
|
|
105
|
-
format: "YYYYMM"
|
|
106
|
-
})
|
|
107
|
-
},
|
|
108
|
-
// 日期范围选择器
|
|
109
|
-
{
|
|
110
|
-
name: "planDate",
|
|
111
|
-
startName: "planStartDate",
|
|
112
|
-
endName: "planEndDate",
|
|
113
|
-
label: "计划时间",
|
|
114
|
-
placeholder: "请选择",
|
|
115
|
-
component: () => ({
|
|
116
|
-
tag: "jh-date",
|
|
117
|
-
type: "daterange",
|
|
118
|
-
rangeSeparator: "至",
|
|
119
|
-
showFormat: "YYYY-MM-DD",
|
|
120
|
-
valueFormat: "YYYY-MM-DD"
|
|
121
|
-
})
|
|
122
|
-
}
|
|
123
|
-
];
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// ✅ 工具栏按钮(BaseToolbar 组件数据源)
|
|
127
|
-
toolbarDef(): ActionButtonDesc[] {
|
|
128
|
-
return [
|
|
129
|
-
{
|
|
130
|
-
name: "primary",
|
|
131
|
-
label: "新增",
|
|
132
|
-
plain: true,
|
|
133
|
-
onClick: () => addModalRef?.value?.open()
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
name: "danger",
|
|
137
|
-
label: "删除",
|
|
138
|
-
plain: true,
|
|
139
|
-
onClick: () => {
|
|
140
|
-
this.actionBatch(
|
|
141
|
-
this.postAction,
|
|
142
|
-
API_CONFIG.remove,
|
|
143
|
-
"确定删除选中数据吗?",
|
|
144
|
-
this.getSelection().map((item) => item.id)
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
];
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// ✅ 表格列(BaseTable 组件数据源)
|
|
152
|
-
columnsDef(): TableColumnDesc<any>[] {
|
|
153
|
-
return [
|
|
154
|
-
{ type: "selection" },
|
|
155
|
-
{ type: "index" },
|
|
156
|
-
{
|
|
157
|
-
label: "订单号",
|
|
158
|
-
name: "orderNo",
|
|
159
|
-
minWidth: 120,
|
|
160
|
-
sortable: true,
|
|
161
|
-
filterable: true
|
|
162
|
-
},
|
|
163
|
-
// 字典列(自动翻译 value → label)
|
|
164
|
-
{
|
|
165
|
-
label: "计划状态",
|
|
166
|
-
name: "planStatus",
|
|
167
|
-
minWidth: 120,
|
|
168
|
-
logicType: BusLogicDataType.dict,
|
|
169
|
-
logicValue: "planStatus",
|
|
170
|
-
sortable: true,
|
|
171
|
-
filterable: true
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
label: "计划重量",
|
|
175
|
-
name: "planWeight",
|
|
176
|
-
minWidth: 120,
|
|
177
|
-
sortable: true,
|
|
178
|
-
filterable: true
|
|
179
|
-
},
|
|
180
|
-
// 操作列
|
|
181
|
-
{
|
|
182
|
-
label: "操作",
|
|
183
|
-
operations: [
|
|
184
|
-
{
|
|
185
|
-
name: "edit",
|
|
186
|
-
label: "编辑",
|
|
187
|
-
onClick: (row) => addModalRef?.value?.open(row.id)
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
name: "remove",
|
|
191
|
-
label: "删除",
|
|
192
|
-
onClick: (row) => this.remove(row.id)
|
|
193
|
-
}
|
|
194
|
-
]
|
|
195
|
-
}
|
|
196
|
-
];
|
|
197
|
-
}
|
|
198
|
-
})();
|
|
199
|
-
|
|
200
|
-
return Page.create() as any;
|
|
201
|
-
}
|
|
202
|
-
```
|
|
56
|
+
**严重偏差(红灯)**:
|
|
57
|
+
- ❌ 直接在 `<script setup>` 中写 `ref()` + `onMounted()` + 手动 fetch
|
|
58
|
+
- ❌ 独立 api.ts 文件包含 axios 调用
|
|
59
|
+
- ❌ 手动拼装表格列而不用 `columnsDef()`
|
|
203
60
|
|
|
204
|
-
###
|
|
205
|
-
|
|
206
|
-
```vue
|
|
207
|
-
<template>
|
|
208
|
-
<div class="app-container app-page-container">
|
|
209
|
-
<BaseQuery
|
|
210
|
-
:form="queryParam"
|
|
211
|
-
:items="queryItems"
|
|
212
|
-
@select="select"
|
|
213
|
-
@reset="select"
|
|
214
|
-
/>
|
|
215
|
-
<BaseToolbar :items="toolbars" />
|
|
216
|
-
<BaseTable ref="tableRef" :data="list" :columns="columns" showToolbar />
|
|
217
|
-
<jh-pagination
|
|
218
|
-
v-show="page.total && page.total > 0"
|
|
219
|
-
:total="page.total || 0"
|
|
220
|
-
v-model:currentPage="page.current"
|
|
221
|
-
v-model:pageSize="page.size"
|
|
222
|
-
@current-change="select"
|
|
223
|
-
@size-change="select"
|
|
224
|
-
/>
|
|
225
|
-
</div>
|
|
226
|
-
</template>
|
|
227
|
-
|
|
228
|
-
<script setup lang="ts">
|
|
229
|
-
import { createPage } from "./data";
|
|
230
|
-
|
|
231
|
-
const Page = createPage();
|
|
232
|
-
const {
|
|
233
|
-
tableRef,
|
|
234
|
-
page,
|
|
235
|
-
queryParam,
|
|
236
|
-
list,
|
|
237
|
-
queryItems,
|
|
238
|
-
columns,
|
|
239
|
-
toolbars,
|
|
240
|
-
select
|
|
241
|
-
} = Page;
|
|
242
|
-
|
|
243
|
-
onMounted(() => select());
|
|
244
|
-
</script>
|
|
245
|
-
|
|
246
|
-
<style scoped lang="scss">
|
|
247
|
-
@import "./index.scss";
|
|
248
|
-
</style>
|
|
249
|
-
```
|
|
61
|
+
### 3. index.vue 模式审计
|
|
250
62
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
256
|
-
-
|
|
257
|
-
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
63
|
+
**标准**:纯模板 + createPage 解构,不写业务逻辑。
|
|
64
|
+
|
|
65
|
+
**检查项**:
|
|
66
|
+
- [ ] `<script setup lang="ts">` 是否只有 import + createPage 解构 + onMounted
|
|
67
|
+
- [ ] 是否引用了 BaseQuery / BaseToolbar / BaseTable / jh-pagination 四件套
|
|
68
|
+
- [ ] 最外层 class 是否为 `app-container app-page-container`
|
|
69
|
+
- [ ] 是否有内联业务逻辑(computed、watch、methods 等)
|
|
70
|
+
|
|
71
|
+
**严重偏差(红灯)**:
|
|
72
|
+
- ❌ `<script setup>` 超过 30 行(大概率混入了业务逻辑)
|
|
73
|
+
- ❌ 手写 `<el-form>` + `<el-table>` 而非平台组件
|
|
74
|
+
- ❌ 直接调用 axios / fetch
|
|
75
|
+
|
|
76
|
+
### 4. 命名规范审计
|
|
77
|
+
|
|
78
|
+
| 位置 | 标准 | 检查方式 |
|
|
79
|
+
|------|------|---------|
|
|
80
|
+
| 路由/目录 | kebab-case | 目录名含大写或下划线 → 偏差 |
|
|
81
|
+
| 字段名 | camelCase | data.ts 中 name 属性含下划线 → 偏差 |
|
|
82
|
+
| 全局组件 | `C_PascalCase/` | src/components/global/ 下非此格式 → 偏差 |
|
|
83
|
+
| 局部组件 | `c_camelCase/` | src/components/local/ 下非此格式 → 偏差 |
|
|
84
|
+
| API URL | `/服务缩写/资源名CamelCase/操作` | URL 含下划线或全小写资源名 → 偏差 |
|
|
85
|
+
|
|
86
|
+
### 5. 组件使用审计
|
|
87
|
+
|
|
88
|
+
**标准**:优先使用平台组件,禁止手写替代品。
|
|
89
|
+
|
|
90
|
+
**检查项**:
|
|
91
|
+
- [ ] 查询区域是否用 `<BaseQuery>` 而非手写 `<el-form>`
|
|
92
|
+
- [ ] 工具栏是否用 `<BaseToolbar>` 而非手写按钮行
|
|
93
|
+
- [ ] 表格是否用 `<BaseTable>` 而非裸 `<el-table>`
|
|
94
|
+
- [ ] 分页是否用 `<jh-pagination>` 而非 `<el-pagination>`
|
|
95
|
+
- [ ] 下拉选择是否用 `<jh-select>` 而非 `<el-select>`
|
|
96
|
+
- [ ] 日期选择是否用 `<jh-date>` / `<jh-date-range>` 而非 `<el-date-picker>`
|
|
97
|
+
- [ ] 弹窗是否优先使用 `c_formModal` 等公共组件
|
|
98
|
+
|
|
99
|
+
### 6. API 写法审计
|
|
100
|
+
|
|
101
|
+
**标准**:使用 `getAction` / `postAction`(@jhlc/common-core),禁止直接用 axios。
|
|
102
|
+
|
|
103
|
+
**检查项**:
|
|
104
|
+
- [ ] 是否 import 了 axios / 自封装的 request
|
|
105
|
+
- [ ] 是否使用 `getAction` / `postAction` / `putAction` / `deleteAction`
|
|
106
|
+
- [ ] URL 是否集中在 `API_CONFIG` 中(不散落在各处)
|
|
107
|
+
|
|
108
|
+
### 7. 样式规范审计
|
|
109
|
+
|
|
110
|
+
**检查项**:
|
|
111
|
+
- [ ] 是否使用 `:deep()` 而非 `::v-deep` / `/deep/`
|
|
112
|
+
- [ ] 页面样式是否写在 `index.scss` 中(非行内 style)
|
|
113
|
+
- [ ] 是否使用 Windi CSS 工具类优先
|
|
114
|
+
|
|
115
|
+
### 8. 状态管理审计
|
|
116
|
+
|
|
117
|
+
**检查项**:
|
|
118
|
+
- [ ] 是否使用 Pinia 而非 Vuex
|
|
119
|
+
- [ ] Store 是否从主应用远程加载(微前端场景)
|
|
120
|
+
|
|
121
|
+
### 9. 弹窗/组件提取审计
|
|
122
|
+
|
|
123
|
+
**检查项**:
|
|
124
|
+
- [ ] 2+ 页面复用的弹窗是否提取到 `src/components/local/c_xxxModal/`
|
|
125
|
+
- [ ] 页面私有弹窗是否只在 c_modal 无法满足时才内联
|
|
126
|
+
|
|
127
|
+
### 10. 路由导航审计(微前端)
|
|
128
|
+
|
|
129
|
+
**检查项**:
|
|
130
|
+
- [ ] 前进导航是否使用 `location.href`(而非 `router.push()`)
|
|
131
|
+
- [ ] 返回是否使用 `useRouter().back()`
|
|
132
|
+
|
|
133
|
+
---
|
|
279
134
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
###
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
|
312
|
-
|
|
313
|
-
|
|
|
314
|
-
|
|
|
315
|
-
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
135
|
+
## 执行步骤
|
|
136
|
+
|
|
137
|
+
### 第 1 步:确定审计范围
|
|
138
|
+
|
|
139
|
+
用户可指定:
|
|
140
|
+
- **全量审计**:"审计整个项目" → 扫描 `src/views/` 全部页面
|
|
141
|
+
- **模块审计**:"审计 produce/mmwr" → 只扫描该模块目录
|
|
142
|
+
- **单页审计**:"审计 mmwr-customer-archive 页面" → 只扫描该页面
|
|
143
|
+
|
|
144
|
+
### 第 2 步:读取规范基线
|
|
145
|
+
|
|
146
|
+
读取 `.github/copilot-instructions.md` 获取当前项目的编码规范(唯一源头)。
|
|
147
|
+
|
|
148
|
+
### 第 3 步:扫描源码
|
|
149
|
+
|
|
150
|
+
按页面目录逐个扫描:
|
|
151
|
+
1. 列出目录内所有文件 → 检查结构完整性
|
|
152
|
+
2. 读取 `data.ts` → 检查 AbstractPageQueryHook 模式、API_CONFIG、命名等
|
|
153
|
+
3. 读取 `index.vue` → 检查模板结构、是否混入业务逻辑
|
|
154
|
+
4. 读取 `index.scss` → 检查样式规范
|
|
155
|
+
5. 检查 `components/` 子目录 → 评估弹窗提取合理性
|
|
156
|
+
|
|
157
|
+
### 第 4 步:输出偏差报告
|
|
158
|
+
|
|
159
|
+
报告格式如下:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
# 规范审计报告
|
|
163
|
+
|
|
164
|
+
## 概要
|
|
165
|
+
|
|
166
|
+
| 指标 | 值 |
|
|
167
|
+
|------|----|
|
|
168
|
+
| 扫描范围 | src/views/produce/mmwr/ |
|
|
169
|
+
| 页面总数 | 12 |
|
|
170
|
+
| 合规页面 | 8 |
|
|
171
|
+
| 偏差页面 | 4 |
|
|
172
|
+
| 严重偏差数 | 3 |
|
|
173
|
+
| 轻微偏差数 | 7 |
|
|
174
|
+
|
|
175
|
+
## 严重偏差(必须整改)
|
|
176
|
+
|
|
177
|
+
### 🔴 [页面路径] — [偏差类型]
|
|
178
|
+
|
|
179
|
+
**现状**:[当前代码的写法]
|
|
180
|
+
**标准**:[规范要求的写法]
|
|
181
|
+
**整改建议**:[具体怎么改]
|
|
182
|
+
**影响范围**:[改动涉及哪些文件]
|
|
183
|
+
|
|
184
|
+
## 轻微偏差(建议整改)
|
|
185
|
+
|
|
186
|
+
### 🟡 [页面路径] — [偏差类型]
|
|
187
|
+
|
|
188
|
+
**现状**:...
|
|
189
|
+
**标准**:...
|
|
190
|
+
**整改建议**:...
|
|
191
|
+
|
|
192
|
+
## 合规页面(无需改动)
|
|
193
|
+
|
|
194
|
+
- ✅ mmwr-customer-archive/
|
|
195
|
+
- ✅ mmwr-customer-detail/
|
|
196
|
+
- ...
|
|
197
|
+
|
|
198
|
+
## 整改优先级建议
|
|
199
|
+
|
|
200
|
+
1. 先改严重偏差(结构性问题)
|
|
201
|
+
2. 再改轻微偏差(命名/样式等)
|
|
202
|
+
3. 新增页面一律使用 page-codegen Skill 自动生成,天然合规
|
|
335
203
|
```
|
|
336
204
|
|
|
205
|
+
### 第 5 步:按需生成整改代码
|
|
206
|
+
|
|
207
|
+
如果用户要求,可对偏差页面逐个生成整改后的代码。
|
|
208
|
+
整改时读取 `page-codegen/SKILL.md` 及对应模板,确保整改后代码完全合规。
|
|
209
|
+
|
|
337
210
|
---
|
|
338
211
|
|
|
339
|
-
##
|
|
212
|
+
## 偏差严重度定义
|
|
340
213
|
|
|
341
|
-
|
|
214
|
+
| 级别 | 标记 | 定义 | 示例 |
|
|
215
|
+
|------|------|------|------|
|
|
216
|
+
| 🔴 严重 | 必须整改 | 架构性违反,影响可维护性和团队协作 | 不用 AbstractPageQueryHook、直接用 axios、index.vue 混入业务逻辑 |
|
|
217
|
+
| 🟡 轻微 | 建议整改 | 风格/命名不统一,不影响功能 | 目录名用 camelCase 而非 kebab-case、缺少 api.md |
|
|
218
|
+
| ✅ 合规 | 无需改动 | 完全符合规范 | — |
|
|
219
|
+
|
|
220
|
+
---
|
|
342
221
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
222
|
+
## 与其他 Skill 的关系
|
|
223
|
+
|
|
224
|
+
| Skill | 关系 |
|
|
225
|
+
|-------|------|
|
|
226
|
+
| **page-codegen** | 审计发现偏差后,可调用 page-codegen 重新生成合规代码 |
|
|
227
|
+
| **prototype-scan** | 审计不涉及原型,仅检查已有代码 |
|
|
228
|
+
| **api-contract** | 审计可检查 api.md 是否存在但不检查其内容(内容由 api-contract 负责) |
|
|
229
|
+
|
|
230
|
+
---
|
|
352
231
|
|
|
353
|
-
|
|
232
|
+
## 注意事项
|
|
354
233
|
|
|
355
|
-
|
|
234
|
+
1. **规范是不可协商的** — 偏差报告中不会因为"旧代码一直这么写"就放行,旧代码不合规就是不合规
|
|
235
|
+
2. **AI 生成的代码必须合规** — 如果用 page-codegen 等 Skill 生成的代码出现偏差,那是 Skill 模板的 bug,需要反馈修复
|
|
236
|
+
3. **规范的演进** — 如果团队决定调整规范,更新 `copilot-instructions.md`(唯一源头),然后重新审计
|
package/package.json
CHANGED