@agile-team/wl-skills-kit 1.1.2 → 1.1.4

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,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.1.4] - 2026-04-09
4
+
5
+ ### 修复
6
+
7
+ - 补充遗漏的 `env.local.json` 模板文件到 `files/.github/skills/menu-sync/env/`
8
+ - 文件内容为占位符模板(非真实凭据),安装后用户按 `guide.md` 填写实际值
9
+
10
+ ## [1.1.3] - 2026-04-09
11
+
12
+ ### 重构:convention-extract → convention-audit(规范审计)
13
+
14
+ - **定位翻转**:从"扫描代码提炼规范"改为"用规范审计代码"
15
+ - 旧:项目代码 → 提炼 → 规范文档(代码乱则规范乱)
16
+ - 新:copilot-instructions.md(标准) → 审计 → 偏差报告 + 整改建议
17
+ - SKILL.md 完全重写:10 项审计维度、偏差严重度定义、报告模板、执行步骤
18
+ - copilot-instructions.md 注册表触发关键词更新:提炼规范 → 规范审计/代码审计/规范检查
19
+ - use-skill.md、wl-skills-kit.md 相关描述同步更新
20
+
3
21
  ## [1.1.2] - 2026-04-09
4
22
 
5
23
  ### 新增: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-extract 一次性:扫描项目源码生成编码规范文档
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
- | 扫描项目提炼编码规范 | "提炼项目规范" | convention-extract |
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
- | 提炼规范、项目规范、编码规范扫描 | `.github/skills/convention-extract/SKILL.md` | convention-extract |
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-extract | 项目源码 | copilot-instructions.md | 一次性 | 不用改,每个项目执行一次 |
28
+ | convention-audit | 项目源码 + copilot-instructions.md | 偏差报告 + 整改建议 | 按需 | 不用改,规范基线来自 copilot-instructions.md |
29
29
 
30
- **核心结论:prototype-scan 直接复制,page-codegen 必须适配新项目的代码模板,convention-extract 在新项目执行一次自动产出。**
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
- **情况 A:新项目已有页面代码** → 执行 convention-extract 自动扫描
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-extract 在每个新项目执行一次即可。三步完成 Skill 体系移植。
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-extract Skill → 生成适配新项目的 copilot-instructions.md
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-extract
3
- description: "Use when: scanning a Vue project to extract and document coding conventions, file structure rules, naming patterns, component usage patterns, and API writing standards into a reusable conventions document. Triggers on: extract conventions, project standards, coding rules, 提炼规范, 编码规范, 项目扫描规范."
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: 规范提炼(convention-extract
6
+ # Skill: 规范审计(convention-audit
7
7
 
8
- 扫描 Vue 项目源码,将隐含的编码规范显式化、固化,供 AI 在代码生成时精确还原项目风格。
8
+ `copilot-instructions.md` 为唯一规范源头,扫描项目源码,找出不符合规范的文件和写法,输出偏差报告及整改建议。
9
9
 
10
- **cx-ui-produce 项目的规范已提炼完成并固化在 `.github/copilot-instructions.md` 中。**
11
- 以下是完整规范详情,新项目接入时参考「扫描步骤」重新执行。
10
+ > **核心理念**:规范是"标准",代码要对齐标准。不从代码提炼规范,而是用规范审计代码。
12
11
 
13
12
  ---
14
13
 
15
- ## 已固化规范:cx-ui-produce
14
+ ## 适用场景
16
15
 
17
- ### 1. 技术栈
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
- Vue 3.2 + Vite + TypeScript(strict: false)
21
- Element Plus 2.x + @jhlc/jh-ui 3.x(自研组件库)
22
- @jhlc/common-core 3.x(查询/表格/工具栏/HTTP/页面Hook基类)
23
- Windi CSS + SCSS
24
- Pinia + pinia-plugin-persistedstate
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
- ### 2. 微前端架构
38
+ **检查项**:
39
+ - [ ] 目录名是否 kebab-case
40
+ - [ ] 是否缺少 data.ts(逻辑写在 index.vue 里)
41
+ - [ ] 是否缺少 api.md
42
+ - [ ] 是否存在多余文件(如独立的 api.ts)
29
43
 
30
- - 本项目是 Module Federation **子应用**(produce 域)
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
- ### 3. 目录结构
46
+ **标准**:使用 `class extends AbstractPageQueryHook` 配置化开发。
37
47
 
38
- ```
39
- src/views/[]/[模块]/[子模块分组]/[kebab-case-页面目录]/
40
- ├── index.vue ← 纯模板 + createPage 解构,不写业务逻辑
41
- ├── data.ts ← AbstractPageQueryHook + API_CONFIG
42
- ├── index.scss ← 页面样式(可为空)
43
- └── api.md ← 接口约定(前端预留 + 后端出接口依据)
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
- - **通用弹窗**(2+ 页面复用)→ `src/components/local/c_xxxModal/`(如 `c_modal/`)
49
- - **极个性弹窗**(仅单页面,c_modal 无法满足)→ 页面 `components/xxxModal.vue`
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
- ### 5. index.vue 模式
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
- - `<script setup lang="ts">` 必须
254
- - index.vue 里**不写业务逻辑**
255
- - 最外层 class 必须是 `app-container app-page-container`
256
- - 弹窗组件放在根 `</div>` 之后
257
- - 样式用 `@import "./index.scss"`
258
-
259
- ### 6. API 写法
260
-
261
- ```typescript
262
- // 使用 @jhlc/common-core 封装方法
263
- import { getAction, postAction } from "@jhlc/common-core/src/api/action";
264
-
265
- // URL 格式:/[服务缩写]/[资源名CamelCase]/[操作]
266
- // 服务缩写如:pm(生产管理)、mmwr(精整)、mmsm(炼钢)、sale(销售)、hrms(人力)
267
-
268
- // 分页查询(基类 super({ url }) 自动处理)
269
- // 单条查询
270
- getAction(API_CONFIG.getById, { id });
271
- // 新增 / 编辑
272
- postAction(API_CONFIG.save, formData);
273
- postAction(API_CONFIG.update, formData);
274
- // 删除(单条)
275
- this.remove(row.id); // 基类内置方法
276
- // 批量操作
277
- this.actionBatch(this.postAction, url, "确认提示", ids);
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
- 详细文档:`docs/request.md`、`docs/page-query-hook-best-practices.md`
281
-
282
- ### 7. 命名规范
283
-
284
- | 位置 | 规范 | 示例 |
285
- | ------------ | ----------------------- | ------------------------------------ |
286
- | 路由/目录 | kebab-case | `ompt-mill-plan/` |
287
- | pages.ts | `["kebab名", "中文名"]` | `["ompt-mill-plan", "轧钢计划编制"]` |
288
- | 字段名 | camelCase | `orderNo`, `planStatus` |
289
- | logicValue | camelCase | `planStatus`, `plineCode` |
290
- | 全局组件 | `C_PascalCase/` | `C_Tree/` |
291
- | 局部组件 | `c_camelCase/` | `c_modal/`、`c_detailPanel/` |
292
- | 页面私有组件 | camelCase | `addModal.vue`(仅极个性弹窗) |
293
- | API CONFIG | UPPER_SNAKE(变量名) | `API_CONFIG` |
294
- | 服务缩写 | 小写简写 | `pm`, `mmwr`, `mmsm`, `sale` |
295
-
296
- ### 8. 共享业务组件分类与命名
297
-
298
- | 分类 | 路径 | 命名 | 职责 | 示例 |
299
- |---|---|---|---|---|
300
- | **通用弹窗** | `src/components/local/c_xxxModal/` | `c_formModal`、`c_modal` | 配置驱动的表单弹窗,多页面复用 | `c_formModal`(CRUD 弹窗) |
301
- | **业务表单容器** | `src/components/local/c_xxxForm/` | `c_customerApplyForm` | 封装多 Tab 表单 + 数据契约(loadData/collectFormData/validate),多页面共享 | `c_customerTabs`(建议重命名为 `c_customerApplyForm`) |
302
- | **配置驱动模板** | `src/components/template/XxxTemplate/` | PascalCase | 布局完全相同的 3+ 页面共用的模板组件,页面仅传 config | `FinishingAchievementTemplate`(7 个精整实绩页共用) |
303
- | **页面私有组件** | `页面目录/components/` | camelCase | 仅单页面使用、c_modal 无法满足的极个性弹窗 | `addModal.vue` |
304
-
305
- **命名避坑**:
306
- - ❌ 不要用 `c_xxxTabs` 命名业务表单容器 → 容易与 `el-tabs` / `jh-tabs` 混淆
307
- - ✅ 用 `c_xxxForm` / `c_xxxPanel` 表达其"表单容器"本质
308
-
309
- ### 9. 路由导航规范(微前端子应用)
310
-
311
- | 场景 | 方式 | 原因 |
312
- |---|---|---|
313
- | **菜单页 → 隐藏页**(列表→表单) | `envConfig()?.router.resolve() + location.href` | 父壳需刷新菜单高亮 |
314
- | **隐藏页 → 隐藏页**(表单→变更历史) | `envConfig()?.router.resolve() + location.href` | `router.push()` 跳过 shell 的 `generateCurrentRoute`,导致 "Invalid route component" 报错 |
315
- | **返回上一页** | `useRouter().back()` | 任何页面均可用,无需加载组件 |
316
-
317
- > ⚠️ **所有前进导航(无论是否隐藏页)必须用 `location.href`**,`useRouter().push()` 仅用于 `.back()`。
318
-
319
- ### 10. 样式规范
320
-
321
- - Windi CSS 工具类优先
322
- - `:deep()` 替代 `::v-deep` / `/deep/`
323
- - jh-drag-row 必须:`.app-page-container .drager_row { height: 100%; }`
324
- - 所有页面/组件样式统一写在 `index.scss` 中,不可在 template 中大量使用内联 style
325
-
326
- ### 11. pages.ts 注册
327
-
328
- ```typescript
329
- // vite/plugins/shared/pages.ts
330
- const moduleName = gProd("base-path", {
331
- subModuleKey: [["kebab-目录名", "中文名"]]
332
- });
333
- // 导出到 list 数组
334
- export const list: SharedPageItem[] = [...moduleName, ...otherModule];
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
- 1. `package.json` 技术栈 + 依赖版本
344
- 2. `vite.config.ts` / `vite/plugins/` → 构建配置 + 微前端配置
345
- 3. 页面注册文件(如 `pages.ts`、`router/index.ts`)→ 路由注册规范
346
- 4. `src/views/` 选取 2-3 个典型页面 → 页面结构 + data.ts 模式
347
- 5. `src/components/` 全局/局部组件规范
348
- 6. `src/api/` API 写法规范
349
- 7. `src/types/` 类型规范
350
- 8. 组件文档(如 `docs/`)→ 自研组件用法
351
- 9. `.env*` / 环境配置文件 → 环境变量
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
- > **如果新项目是空白/刚初始化的**,跳过本步骤,直接复制 cx-ui-produce 的 `.github/copilot-instructions.md` 作为基础模板,按实际修改即可。
232
+ ## 注意事项
354
233
 
355
- 输出更新本文件的「已固化规范」部分。
234
+ 1. **规范是不可协商的** — 偏差报告中不会因为"旧代码一直这么写"就放行,旧代码不合规就是不合规
235
+ 2. **AI 生成的代码必须合规** — 如果用 page-codegen 等 Skill 生成的代码出现偏差,那是 Skill 模板的 bug,需要反馈修复
236
+ 3. **规范的演进** — 如果团队决定调整规范,更新 `copilot-instructions.md`(唯一源头),然后重新审计
@@ -0,0 +1,5 @@
1
+ {
2
+ "gatewayPath": "http://你的网关地址:端口",
3
+ "parentMenuId": "父级菜单ID",
4
+ "token": "你的Bearer Token(不含bearer前缀)"
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agile-team/wl-skills-kit",
3
- "version": "1.1.2",
3
+ "version": "1.1.4",
4
4
  "description": "AI Skill 模板包 — 一键导入 AI 指令 + 组件文档 + 通用组件 + 领域样例,覆盖 Copilot/Cursor/Windsurf/Kiro 等主流 AI 编辑器",
5
5
  "bin": {
6
6
  "wl-skills-kit": "./bin/wl-skills.js"