@agile-team/wl-skills-kit 1.1.1 → 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,28 @@
|
|
|
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
|
+
|
|
14
|
+
## [1.1.2] - 2026-04-09
|
|
15
|
+
|
|
16
|
+
### 新增:Skills 自动调度注册表
|
|
17
|
+
|
|
18
|
+
- `copilot-instructions.md` 末尾新增 **Skills 自动调度** 章节,包含:
|
|
19
|
+
- Skill 注册表(触发关键词 → 必须读取的 SKILL.md 文件映射)
|
|
20
|
+
- 完整流水线(prototype-scan → api-contract → page-codegen → menu-sync)
|
|
21
|
+
- 单独使用模式(只触发单个 Skill)
|
|
22
|
+
- 组件文档按需查阅表 + 领域样例参考表
|
|
23
|
+
- 所有编辑器配置文件(8 个)均继承此注册表,实现 **全编辑器 Skill 自动调度**
|
|
24
|
+
- README 更新:Skill 识别列从 "⚠️ 需手动引用" → "✅ 通过注册表自动 read_file"
|
|
25
|
+
|
|
3
26
|
## [1.1.1] - 2026-04-09
|
|
4
27
|
|
|
5
28
|
### 修复
|
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
|
|
|
@@ -212,44 +212,29 @@ npx @agile-team/wl-skills-kit
|
|
|
212
212
|
|
|
213
213
|
### 各工具配置一览
|
|
214
214
|
|
|
215
|
-
| AI 工具 | 配置文件路径 | 规范加载 | Skill
|
|
216
|
-
|
|
217
|
-
| **GitHub Copilot** (VS Code) | `.github/copilot-instructions.md` | ✅ 自动 | ✅
|
|
218
|
-
| **Cursor** | `.cursorrules` + `.cursor/rules/conventions.mdc` | ✅ 自动 |
|
|
219
|
-
| **Windsurf (Cascade)** | `.windsurfrules` | ✅ 自动 |
|
|
220
|
-
| **Kiro** | `.kiro/steering/conventions.md` | ✅ 自动 |
|
|
221
|
-
| **Trae** | `.trae/rules/conventions.md` | ✅ 自动 |
|
|
222
|
-
| **Claude Code / CLI** | `CLAUDE.md` | ✅ 自动 |
|
|
223
|
-
| **Roo Code / Cline** | `.clinerules` | ✅ 自动 |
|
|
224
|
-
| **AGENTS.md 兼容** | `AGENTS.md` | ✅ 自动 |
|
|
225
|
-
|
|
226
|
-
###
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
**Windsurf** — 规范自动加载,Skill 需 `@context`:
|
|
239
|
-
- 规范 → `.windsurfrules` 自动加载
|
|
240
|
-
- Skill → 对话中用 `@context` 添加 SKILL.md 文件
|
|
241
|
-
- Windsurf Cascade 可读取项目文件,但不主动扫描 `.github/skills/`
|
|
242
|
-
|
|
243
|
-
**Claude Code / CLI** — 规范自动加载,Skill 推荐 `@import`:
|
|
244
|
-
- 规范 → `CLAUDE.md` 自动加载
|
|
245
|
-
- Skill → 在 `CLAUDE.md` 末尾追加 `@import .github/skills/page-codegen/SKILL.md`
|
|
246
|
-
- 或对话中 `/read .github/skills/page-codegen/SKILL.md`
|
|
247
|
-
|
|
248
|
-
**Kiro / Trae / Roo(Cline)** — 规范自动加载,Skill 需对话中引用:
|
|
249
|
-
- 规范 → 各自的 steering/rules/.clinerules 默认加载
|
|
250
|
-
- Skill → 需要在对话中让 AI 读取对应 SKILL.md
|
|
251
|
-
|
|
252
|
-
> **总结**:所有工具的**编码规范**均自动加载(零配置)。差异仅在 **Skill 触发方式**上 — 只有 GitHub Copilot 完全自动识别 Skill,其他工具需在对话中手动引用 SKILL.md 文件。
|
|
215
|
+
| AI 工具 | 配置文件路径 | 规范加载 | Skill 自动调度 | 备注 |
|
|
216
|
+
|---------|-------------|---------|---------------|------|
|
|
217
|
+
| **GitHub Copilot** (VS Code) | `.github/copilot-instructions.md` | ✅ 自动 | ✅ 原生 Skill 识别 + 注册表双保险 | **主力工具,体验最完整** |
|
|
218
|
+
| **Cursor** | `.cursorrules` + `.cursor/rules/conventions.mdc` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | `.mdc` 带 `alwaysApply: true` 前缀 |
|
|
219
|
+
| **Windsurf (Cascade)** | `.windsurfrules` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | 规范内嵌调度指令 |
|
|
220
|
+
| **Kiro** | `.kiro/steering/conventions.md` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | steering/ 下的 md 自动加载 |
|
|
221
|
+
| **Trae** | `.trae/rules/conventions.md` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | rules/ 下的 md 自动加载 |
|
|
222
|
+
| **Claude Code / CLI** | `CLAUDE.md` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | 也支持 `@import` 语法 |
|
|
223
|
+
| **Roo Code / Cline** | `.clinerules` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | 支持 tool_use 读文件 |
|
|
224
|
+
| **AGENTS.md 兼容** | `AGENTS.md` | ✅ 自动 | ✅ 通过注册表自动 `read_file` | Linux Foundation 通用标准,兜底 |
|
|
225
|
+
|
|
226
|
+
### Skill 自动调度机制(v1.1.2+)
|
|
227
|
+
|
|
228
|
+
所有编辑器配置文件均由 `copilot-instructions.md` 生成,其中内嵌了 **Skills 自动调度注册表**。
|
|
229
|
+
该注册表以强制指令形式告知 AI:
|
|
230
|
+
|
|
231
|
+
1. **触发关键词匹配** — 用户说"生成页面"/"扫描原型"/"接口约定"等关键词时,AI 必须先 `read_file` 对应的 `SKILL.md`
|
|
232
|
+
2. **完整流水线** — 用户提供原型/详设并要求批量生成时,按 prototype-scan → api-contract → page-codegen → menu-sync 顺序依次执行
|
|
233
|
+
3. **单独使用** — 用户只说"帮我生成客户档案页面"时,只读取 page-codegen 的 SKILL.md,不必跑完整流水线
|
|
234
|
+
|
|
235
|
+
这意味着 **所有支持 `read_file` / tool_use 的 AI 工具都能自动调度 Skill**,无需手动引用。
|
|
236
|
+
|
|
237
|
+
> **总结**:v1.1.2 起,**编码规范 + Skill 调度** 均为全编辑器自动加载(零配置)。各工具唯一的区别仅在于原生 Skill 识别(Copilot 独有) vs 注册表驱动的 `read_file` 调度(通用)。
|
|
253
238
|
|
|
254
239
|
---
|
|
255
240
|
|
|
@@ -198,14 +198,59 @@ onMounted(() => select());
|
|
|
198
198
|
- ❌ 手写查询表单/工具栏/分页(用 BaseQuery/BaseToolbar/jh-pagination)
|
|
199
199
|
- ❌ 每个页面重复写弹窗组件(优先用 `c_modal` 等局部公共组件)
|
|
200
200
|
|
|
201
|
-
##
|
|
201
|
+
## AI Skills 自动调度(强制执行 — 所有 AI 编辑器/模型通用)
|
|
202
202
|
|
|
203
|
-
|
|
203
|
+
本项目内置 5 个 Skill 文件,覆盖「原型/详设 → 可运行页面 → 菜单注册」完整流程。
|
|
204
|
+
**执行以下任何任务前,必须先用工具读取(read_file)对应的 SKILL.md,读取完成前禁止生成任何代码或输出。**
|
|
204
205
|
|
|
205
|
-
|
|
206
|
-
2. **convention-extract** — 项目规范提炼(已固化,新项目时使用)
|
|
207
|
-
3. **api-contract** — 页面清单 → api.md 接口约定
|
|
208
|
-
4. **page-codegen** — 生成 index.vue + data.ts + index.scss + api.md
|
|
209
|
-
5. **menu-sync** — 将 pages.ts 页面同步到后端菜单表(Phase 1:AI 调 `/system/menu/save`;Phase 2:`pnpm run menu:push`)
|
|
206
|
+
### Skill 注册表
|
|
210
207
|
|
|
211
|
-
|
|
208
|
+
| 触发场景(用户意图关键词) | 必须读取的文件 | Skill 名称 |
|
|
209
|
+
|---|---|---|
|
|
210
|
+
| 扫描原型、解析原型、页面清单、原型分析、详设文档 | `.github/skills/prototype-scan/SKILL.md` | prototype-scan |
|
|
211
|
+
| 接口约定、api.md、字段定义、前后端对齐、接口设计 | `.github/skills/api-contract/SKILL.md` | api-contract |
|
|
212
|
+
| 生成页面、创建页面、代码生成、vue页面、按原型生成 | `.github/skills/page-codegen/SKILL.md`(主文件会指示继续读取对应的 `TPL-*.md` 模板) | page-codegen |
|
|
213
|
+
| 创建菜单、注册菜单、同步菜单、补菜单 | `.github/skills/menu-sync/SKILL.md` | menu-sync |
|
|
214
|
+
| 规范审计、代码审计、规范检查、对齐规范、规范偏差 | `.github/skills/convention-extract/SKILL.md` | convention-audit |
|
|
215
|
+
|
|
216
|
+
### 完整流水线(原型/详设 → 页面 → 菜单)
|
|
217
|
+
|
|
218
|
+
当用户提供原型文件或详设文档并要求批量生成页面时,按以下顺序依次执行:
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
Step 1 → 读取 prototype-scan/SKILL.md → 执行原型扫描 → 输出 page-spec
|
|
222
|
+
Step 2 → 读取 api-contract/SKILL.md → 生成 api.md 接口约定
|
|
223
|
+
Step 3 → 读取 page-codegen/SKILL.md → 逐页生成代码(每页读取对应 TPL-*.md)
|
|
224
|
+
Step 4 → 读取 menu-sync/SKILL.md → 注册菜单到后端
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
每个 Step 开始前读取对应 SKILL.md,**前一个 Step 完成后再进入下一个**。
|
|
228
|
+
上一步的输出(如 page-spec)直接作为下一步的输入,无需用户中间干预。
|
|
229
|
+
|
|
230
|
+
### 单独使用
|
|
231
|
+
|
|
232
|
+
用户也可以只执行单个 Skill(如只说"帮我生成客户档案页面"),此时只需读取对应的 SKILL.md,不必执行完整流水线。
|
|
233
|
+
|
|
234
|
+
### 组件文档按需查阅
|
|
235
|
+
|
|
236
|
+
生成代码过程中如需了解组件用法,读取 `docs/` 下对应文档:
|
|
237
|
+
|
|
238
|
+
| 组件 | 文档路径 |
|
|
239
|
+
|------|---------|
|
|
240
|
+
| BaseQuery / BaseTable / BaseToolbar | `src/components/remote/BaseQuery/README.md` 等 |
|
|
241
|
+
| jh-select / jh-date / jh-pagination 等 | `docs/jh-select.md` / `docs/jh-date.md` 等 |
|
|
242
|
+
| c_formModal / c_formSections / c_listModal | `src/components/local/c_formModal/README.md` 等 |
|
|
243
|
+
| AbstractPageQueryHook 最佳实践 | `docs/page-query-hook-best-practices.md` |
|
|
244
|
+
| HTTP 请求工具 | `docs/request.md` |
|
|
245
|
+
|
|
246
|
+
### 领域样例参考
|
|
247
|
+
|
|
248
|
+
首次生成某类页面时,可读取 `demo/` 下的对应样例学习实际写法:
|
|
249
|
+
|
|
250
|
+
| 模板类型 | 样例路径 |
|
|
251
|
+
|---------|---------|
|
|
252
|
+
| LIST(标准列表) | `demo/produce/aiflow/mmwr-customer-archive/` |
|
|
253
|
+
| FORM_ROUTE(复杂表单) | `demo/produce/aiflow/mmwr-customer-apply-add-form/` |
|
|
254
|
+
| CHANGE_HISTORY(变更历史) | `demo/produce/aiflow/mmwr-customer-apply-change-history/` |
|
|
255
|
+
| DETAIL_TABS(详情Tab) | `demo/produce/aiflow/mmwr-customer-detail/` |
|
|
256
|
+
| MASTER_DETAIL(上下分栏) | `demo/sale/demo/metallurgical-spec/` |
|
|
@@ -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