@agile-team/wl-skills-kit 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -1
- package/README.md +104 -39
- package/bin/wl-skills.js +344 -44
- package/docs/ai/345/205/250/346/231/257/345/210/206/346/236/220.md +3 -3
- package/files/.github/copilot-instructions.md +361 -322
- package/files/.github/guides/architecture.md +6 -3
- package/files/.github/guides/usage.md +48 -13
- package/files/.github/skills/_compat/README.md +4 -2
- package/files/.github/skills/_registry.md +18 -16
- package/files/.github/skills/core/page-codegen/SKILL.md +149 -74
- package/files/.github/skills/core/page-codegen/USAGE.md +33 -12
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +80 -48
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +183 -55
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +110 -21
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +29 -9
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +93 -48
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +49 -29
- package/files/.github/skills/sync/menu-sync/SKILL.md +27 -13
- package/mcp/server.js +279 -195
- package/mcp/tools/menuSync.js +416 -96
- package/mcp/tools/projectTools.js +336 -124
- package/package.json +31 -2
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **读者**:团队技术负责人 / wl-skills-kit 维护者 / 对体系设计感兴趣的团队成员
|
|
4
4
|
> **更新方式**:重大架构变更后追加对应章节,旧章节原文保留(历史可溯)
|
|
5
|
-
> **当前版本**:v2.
|
|
5
|
+
> **当前版本**:v2.5.0(2026-05-07)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -58,7 +58,7 @@ AI 编辑器(Copilot / Cursor / Windsurf 等)知道通用编程知识,但
|
|
|
58
58
|
1. 规范分层、按任务类型懒加载(token 高效利用)
|
|
59
59
|
2. Skill 触发词驱动(开发者用自然语言,AI 读结构化 SKILL.md)
|
|
60
60
|
3. Pre-flight 约定式声明(消除 AI "假执行"黑盒问题)
|
|
61
|
-
4. 多 AI 编辑器适配(一套内容,自动生成
|
|
61
|
+
4. 多 AI 编辑器适配(一套内容,自动生成 Copilot/Claude/Cursor/Windsurf/Cline/Kiro/Trae/Qoder/Agents 配置,解耦可扩展)
|
|
62
62
|
5. 报告层追加不覆盖(累积团队知识,不丢失审计历史)
|
|
63
63
|
|
|
64
64
|
---
|
|
@@ -102,7 +102,9 @@ wl-skills.js init/update
|
|
|
102
102
|
│ - reports/*.md 已存在则跳过(保护团队累积数据)
|
|
103
103
|
│ - 其他文件:覆盖写入
|
|
104
104
|
│
|
|
105
|
-
|
|
105
|
+
├─ 5. 写入/更新 .wl-skills-manifest.json(文件哈希快照)
|
|
106
|
+
│
|
|
107
|
+
└─ 6. 输出 wk-skills-ui 可选桥接提醒与 git-standards 规范插件建议
|
|
106
108
|
```
|
|
107
109
|
|
|
108
110
|
---
|
|
@@ -124,6 +126,7 @@ AI 编辑器(Copilot / Cursor / Windsurf / Claude Code / Cline / Kiro / Trae
|
|
|
124
126
|
│ Cline → .clinerules
|
|
125
127
|
│ Kiro → .kiro/steering/conventions.md
|
|
126
128
|
│ Trae → .trae/rules/conventions.md
|
|
129
|
+
│ Qoder → .qoder/rules/conventions.md
|
|
127
130
|
│ 通用 → AGENTS.md
|
|
128
131
|
│
|
|
129
132
|
│ 根配置包含:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# wl-skills-kit 使用指南
|
|
2
2
|
|
|
3
3
|
> **目标读者**:使用 `@agile-team/wl-skills-kit` 的 Vue 3 业务项目团队成员。
|
|
4
|
-
> **适用版本**:v2.
|
|
4
|
+
> **适用版本**:v2.4.x
|
|
5
5
|
> **维护者**:CHENY(工号 409322)
|
|
6
6
|
|
|
7
7
|
---
|
|
@@ -34,7 +34,7 @@ npx @agile-team/wl-skills-kit
|
|
|
34
34
|
- Trae
|
|
35
35
|
- Qoder
|
|
36
36
|
|
|
37
|
-
打开项目后,AI
|
|
37
|
+
打开项目后,AI 会按编辑器自动加载对应规则文件:Copilot 读 `.github/copilot-instructions.md`,Claude Code 读 `CLAUDE.md`,Cline 读 `.clinerules`,通用 Agent 读 `AGENTS.md`,Qoder 读 `.qoder/rules/conventions.md`。
|
|
38
38
|
|
|
39
39
|
### 第 3 步:开始使用
|
|
40
40
|
|
|
@@ -46,6 +46,7 @@ npx @agile-team/wl-skills-kit
|
|
|
46
46
|
"审计 src/views/sale 这个目录的代码规范"
|
|
47
47
|
"提取 mmwr-rolling-management 这个页面作为模板"
|
|
48
48
|
"同步菜单到后端"
|
|
49
|
+
"帮我做个台账页面,后端没好先 mock,菜单也加上"
|
|
49
50
|
```
|
|
50
51
|
|
|
51
52
|
AI 会自动识别意图,触发对应的 Skill。
|
|
@@ -54,17 +55,17 @@ AI 会自动识别意图,触发对应的 Skill。
|
|
|
54
55
|
|
|
55
56
|
## 9 个 Skill 速览
|
|
56
57
|
|
|
57
|
-
| Skill | 触发关键词 | 用途
|
|
58
|
-
| ------------------ | ------------------------------ |
|
|
59
|
-
| `prototype-scan` | 扫描原型 / 解析原型 / 口述需求 | 原型 / 详设 → page-spec JSON
|
|
60
|
-
| `api-contract` | 接口约定 / api.md / 字段定义 | 生成接口约定文档
|
|
61
|
-
| `page-codegen` | 生成页面 / 帮我生成 | 生成页面骨架 + 菜单注册
|
|
58
|
+
| Skill | 触发关键词 | 用途 |
|
|
59
|
+
| ------------------ | ------------------------------ | ---------------------------------------------------- |
|
|
60
|
+
| `prototype-scan` | 扫描原型 / 解析原型 / 口述需求 | 原型 / 详设 → page-spec JSON |
|
|
61
|
+
| `api-contract` | 接口约定 / api.md / 字段定义 | 生成接口约定文档 |
|
|
62
|
+
| `page-codegen` | 生成页面 / 帮我生成 | 生成页面骨架 + 菜单注册 |
|
|
62
63
|
| `menu-sync` | 创建菜单 / 同步菜单 | 菜单数据同步到后端(MCP 自动 / prompt 手动两种模式) |
|
|
63
|
-
| `dict-sync` | 同步字典 / 创建字典 / 字典审计
|
|
64
|
-
| `convention-audit` | 规范审计 / 代码审计 | 13 条规范扫描 + 偏差报告
|
|
65
|
-
| `template-extract` | 提取模板 / 抄取模板 | 从现有页面沉淠领域专属模板
|
|
66
|
-
| `permission-sync` | 创建角色 / 角色授权 / 同步权限
|
|
67
|
-
| `code-fix` | 自动修复 / 整改偏差 / 规范整改
|
|
64
|
+
| `dict-sync` | 同步字典 / 创建字典 / 字典审计 | 字典基线同步到后端(MCP 自动 / prompt 手动两种模式) |
|
|
65
|
+
| `convention-audit` | 规范审计 / 代码审计 | 13 条规范扫描 + 偏差报告 |
|
|
66
|
+
| `template-extract` | 提取模板 / 抄取模板 | 从现有页面沉淠领域专属模板 |
|
|
67
|
+
| `permission-sync` | 创建角色 / 角色授权 / 同步权限 | 角色+授权+动作权限同步(MCP) |
|
|
68
|
+
| `code-fix` | 自动修复 / 整改偏差 / 规范整改 | 受控自动修复审计报告中的偏差 |
|
|
68
69
|
|
|
69
70
|
完整调度规则见 `.github/skills/_registry.md`。
|
|
70
71
|
|
|
@@ -79,7 +80,7 @@ AI 会自动识别意图,触发对应的 Skill。
|
|
|
79
80
|
├── .github/
|
|
80
81
|
│ ├── copilot-instructions.md AI 主入口
|
|
81
82
|
│ ├── standards/ 13 条模块化规范
|
|
82
|
-
│ ├── skills/
|
|
83
|
+
│ ├── skills/ 9 个启用 Skill + 多编辑器适配
|
|
83
84
|
│ ├── guides/ 使用指南 + 架构设计
|
|
84
85
|
│ └── reports/ AI 生成报告(SYS_MENU_INFO 等)
|
|
85
86
|
├── docs/ 12 个组件 API 文档(jh-* / request 等)
|
|
@@ -105,9 +106,28 @@ AI 会自动识别意图,触发对应的 Skill。
|
|
|
105
106
|
```
|
|
106
107
|
|
|
107
108
|
> **说明**:每一步都可以单独触发,也可以按用户意图自动接续。
|
|
109
|
+
>
|
|
108
110
|
> - `dict-sync`:首次使用先跑 **pull 模式**(「刷新字典基线」)建立本地基线,再跑 push 模式同步差异。
|
|
109
111
|
> - `code-fix`:只修复 🟡/🟢 偏差;🔴 严重偏差必须人工或 page-codegen 处理。每条修复前强制 diff 预览确认。
|
|
110
112
|
|
|
113
|
+
### 页面生成最终标准
|
|
114
|
+
|
|
115
|
+
`page-codegen` 生成的业务列表/台账/主从/树表页面必须满足:
|
|
116
|
+
|
|
117
|
+
- `AbstractPageQueryHook + BaseQuery + BaseToolbar + BaseTable + jh-pagination`
|
|
118
|
+
- `BaseTable` 必须 `render-type="agGrid"`
|
|
119
|
+
- 每个 `BaseTable` 必须有全局唯一 `cid`
|
|
120
|
+
- 列定义必须使用 `@agile-team/wk-skills-ui/runtime` 的 `defineColumns()`
|
|
121
|
+
- 操作列必须使用 `renderOps()`,禁止旧式 `operations: []`
|
|
122
|
+
- mock-first:后端未就绪时生成 `mock/*.ts`,关闭 mock 后业务代码不需要改
|
|
123
|
+
|
|
124
|
+
生成后建议运行:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
wl-skills validate-page src/views/<页面目录>
|
|
128
|
+
wl-skills doctor-ui
|
|
129
|
+
```
|
|
130
|
+
|
|
111
131
|
---
|
|
112
132
|
|
|
113
133
|
## 常见问题
|
|
@@ -131,6 +151,9 @@ Windsurf、Cline、Trae、Qoder 仅支持全局配置,需手动操作一次,
|
|
|
131
151
|
|
|
132
152
|
配置完成后在 `.github/skills/sync/env.local.json` 中填好 `token`、`gatewayPath`、`menu.domainId`,重启编辑器,对 AI 说「扩展菜单」或「加字典」,AI 会自动调用 MCP 工具完成同步,无需手动粘贴接口响应。
|
|
133
153
|
|
|
154
|
+
**Q: 如何和 wk-skills-ui 一起用?**
|
|
155
|
+
A: 两个包不互相依赖。先用 `wl-skills-kit` 做页面生成、规范审计、菜单字典权限同步;如需统一 UI 风格或老系统化妆层,再单独安装 `@agile-team/wk-skills-ui` 并执行 `wk-ui init/update`。
|
|
156
|
+
|
|
134
157
|
**Q: 部署到生产环境前如何清理 AI 文件?**
|
|
135
158
|
A: 执行 `npx @agile-team/wl-skills-kit clean`。会移除所有 AI 辅助文件,保留 `src/components/` 和 `src/types/`。
|
|
136
159
|
|
|
@@ -138,6 +161,18 @@ A: 执行 `npx @agile-team/wl-skills-kit clean`。会移除所有 AI 辅助文
|
|
|
138
161
|
|
|
139
162
|
## 升级与维护
|
|
140
163
|
|
|
164
|
+
### 生命周期命令
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
npx @agile-team/wl-skills-kit check # 环境/MCP/manifest 体检
|
|
168
|
+
npx @agile-team/wl-skills-kit diff # 查看与当前包版本差异
|
|
169
|
+
npx @agile-team/wl-skills-kit validate-page src/views/xxx # 单页/目录强校验
|
|
170
|
+
npx @agile-team/wl-skills-kit doctor-ui # wk-skills-ui 接入体检
|
|
171
|
+
npx @agile-team/wl-skills-kit update # 增量更新
|
|
172
|
+
npx @agile-team/wl-skills-kit clean # 清理 AI 文件,保留 src/components + src/types
|
|
173
|
+
npx @agile-team/wl-skills-kit export # 导出菜单/字典/权限基线 xlsx
|
|
174
|
+
```
|
|
175
|
+
|
|
141
176
|
### 增量更新
|
|
142
177
|
|
|
143
178
|
```bash
|
|
@@ -29,7 +29,8 @@ _compat/
|
|
|
29
29
|
├── cline.txt
|
|
30
30
|
├── kiro.txt (.kiro/steering/conventions.md,含 frontmatter)
|
|
31
31
|
├── trae.txt (.trae/rules/conventions.md,含 frontmatter)
|
|
32
|
-
|
|
32
|
+
├── agents.txt (AGENTS.md 通用代理)
|
|
33
|
+
└── qoder.txt (.qoder/rules/conventions.md)
|
|
33
34
|
```
|
|
34
35
|
|
|
35
36
|
---
|
|
@@ -57,7 +58,7 @@ bin/wl-skills.js (init/update)
|
|
|
57
58
|
| ------------------------------------- | ----------------------------- | --------------------------- |
|
|
58
59
|
| 团队不用 Cursor,从 editors.json 删除 | `.cursorrules`、`.cursor/` | `.github/`、CLAUDE.md、其他 |
|
|
59
60
|
| 团队新增某 AI 编辑器(如 Augment) | 加 headers/augment.txt + 注册 | 其他文件不动 |
|
|
60
|
-
| `copilot-instructions.md` 内容更新 |
|
|
61
|
+
| `copilot-instructions.md` 内容更新 | 全部编辑器根配置同步更新 | headers/ 不变(只是模板) |
|
|
61
62
|
|
|
62
63
|
---
|
|
63
64
|
|
|
@@ -104,5 +105,6 @@ bin/wl-skills.js (init/update)
|
|
|
104
105
|
| Kiro | `.kiro/steering/*.md` | ✅ | 需 inclusion 字段 |
|
|
105
106
|
| Trae | `.trae/rules/*.md` | ✅ | 需 description 字段 |
|
|
106
107
|
| 通用 Agent | `AGENTS.md` (root) | ❌ | 新兴跨平台规范 |
|
|
108
|
+
| Qoder | `.qoder/rules/conventions.md` | ✅ | 项目规则文件 |
|
|
107
109
|
|
|
108
110
|
> 所有这些编辑器在加载完根配置后,**都支持按指令读取项目内任意文件**(含 `.github/standards/`、`.github/skills/`、`.github/guides/`),所以本架构的"懒加载门控 + 子目录规范"对所有编辑器**有效**。
|
|
@@ -38,17 +38,17 @@ skills/
|
|
|
38
38
|
|
|
39
39
|
## 启用 Skill 路由表
|
|
40
40
|
|
|
41
|
-
| Skill 名 | 状态
|
|
42
|
-
| ---------------- |
|
|
43
|
-
| prototype-scan | ✅ 启用
|
|
44
|
-
| api-contract | ✅ 启用
|
|
45
|
-
| page-codegen | ✅ 启用
|
|
46
|
-
| convention-audit | ✅ 启用
|
|
47
|
-
| template-extract | ✅ 启用
|
|
48
|
-
| menu-sync | ✅ 启用
|
|
49
|
-
| dict-sync | ✅ 启用
|
|
50
|
-
| permission-sync | ✅ 启用
|
|
51
|
-
| code-fix | ✅ 启用
|
|
41
|
+
| Skill 名 | 状态 | 路径 | 触发关键词 |
|
|
42
|
+
| ---------------- | ------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
43
|
+
| prototype-scan | ✅ 启用 | `skills/core/prototype-scan/SKILL.md` | 扫描原型 / 解析原型 / 页面清单 / 详设文档 / 口述需求 / 建个页面 / 写个页面 / 根据截图 / 根据原型 |
|
|
44
|
+
| api-contract | ✅ 启用 | `skills/core/api-contract/SKILL.md` | 接口约定 / api.md / 字段定义 / 前后端对齐 / 接口设计 |
|
|
45
|
+
| page-codegen | ✅ 启用 | `skills/core/page-codegen/SKILL.md` | 生成页面 / 创建页面 / 代码生成 / vue页面 / 按原型生成 / 帮我生成 / 列表页 / 管理页 / 台账 / mock / 假数据 / 先能跑 / AGGrid / skills-ui |
|
|
46
|
+
| convention-audit | ✅ 启用 | `skills/core/convention-audit/SKILL.md` | 规范审计 / 代码审计 / 规范检查 / 对齐规范 / 规范偏差 / 接手新项目 / 存量代码分析 / 项目体检 |
|
|
47
|
+
| template-extract | ✅ 启用 | `skills/core/template-extract/SKILL.md` | 提取模板 / 抽取模板 / 沉淀模板 / 模板贡献 |
|
|
48
|
+
| menu-sync | ✅ 启用 | `skills/sync/menu-sync/SKILL.md` | 创建菜单 / 注册菜单 / 同步菜单 / 补菜单 / 页面点击进不来 / 菜单打不开 |
|
|
49
|
+
| dict-sync | ✅ 启用 | `skills/sync/dict-sync/SKILL.md` | 同步字典 / 创建字典 / 刷新字典基线 / 字典对比 / 字典审计 |
|
|
50
|
+
| permission-sync | ✅ 启用 | `skills/sync/permission-sync/SKILL.md` | 创建角色 / 角色管理 / 角色授权 / 给角色分配菜单 / 挂动作 / 添加动作按钮 / 同步权限 / 权限码注册 |
|
|
51
|
+
| code-fix | ✅ 启用 | `skills/ops/code-fix/SKILL.md` | 自动修复 / 整改偏差 / 修复报告 / 规范整改 / 修复偏差 / code fix |
|
|
52
52
|
|
|
53
53
|
---
|
|
54
54
|
|
|
@@ -58,6 +58,8 @@ skills/
|
|
|
58
58
|
2. SKILL.md 中标注的 `必读 standards` 按 `standards/index.md` 任务类型映射加载
|
|
59
59
|
3. 如用户表达连续交付/智能体/全流程意图,同时读取 `_pipeline.md` 获取 Skill I/O 与 `next_suggest`
|
|
60
60
|
4. 在 SKILL.md 指示下输出 **Pre-flight 声明**(强制约定式输出)
|
|
61
|
+
5. 页面生成任务必须额外读取 `standards/12-base-table.md`,并执行 `BaseTable + render-type="agGrid" + cid + defineColumns + renderOps` 硬约束
|
|
62
|
+
6. 若消息包含“风格 / skills-ui / 状态标签 / 操作列 / AGGrid”,同时建议运行 `wl-skills doctor-ui`
|
|
61
63
|
|
|
62
64
|
---
|
|
63
65
|
|
|
@@ -75,9 +77,9 @@ skills/
|
|
|
75
77
|
|
|
76
78
|
每个启用 Skill 同目录下都有 `USAGE.md`:
|
|
77
79
|
|
|
78
|
-
| 文件 | 读者
|
|
79
|
-
| --------------- |
|
|
80
|
-
| `SKILL.md` | AI 编辑器/模型
|
|
81
|
-
| `USAGE.md` | 团队成员
|
|
80
|
+
| 文件 | 读者 | 用途 |
|
|
81
|
+
| --------------- | ------------------------- | -------------------------------------------------------- |
|
|
82
|
+
| `SKILL.md` | AI 编辑器/模型 | 触发规则、流程步骤、Pre-flight 声明 |
|
|
83
|
+
| `USAGE.md` | 团队成员 | 示例对话、踩坑、FAQ、快速上手 |
|
|
82
84
|
| `_pipeline.md` | AI 编辑器/模型 + 团队成员 | Skill 间 I/O 契约、next_suggest、Agent Pipeline 调度协议 |
|
|
83
|
-
| `*.MAINTAIN.md` | kit 维护者
|
|
85
|
+
| `*.MAINTAIN.md` | kit 维护者 | 维护要点(在 `kit-internal/skills/` 目录) |
|
|
@@ -119,6 +119,15 @@ src/views/[域]/[模块]/[子模块]/[kebab-case-目录名]/
|
|
|
119
119
|
18. **按钮必须可交互**:所有按钮的 `onClick` 必须有真实处理逻辑,禁止空函数 `() => {}`。通用交互实现见下方 §按钮交互实现规则
|
|
120
120
|
19. **未知交互兜底**:当原型未提供交互细节、且无法从通用模式推断时,`onClick` 中使用 `ElMessage.info("需业务确认交互逻辑")` 作为占位
|
|
121
121
|
20. **生成后依赖自检**:代码生成完成后,检查 `package.json` 是否已安装生成代码所需的依赖(`mockjs`、`vite-plugin-mock`、`lodash-es`、`xlsx` 等),若缺失则提示用户执行安装命令。同时检查 `vite.config.ts` 是否已注册 `viteMockServe`、`mock/` 目录是否存在
|
|
122
|
+
21. **默认 Mock First**:新生成页面默认必须走 `vite-plugin-mock`。必须生成 `mock/[页面kebab-name].ts`,并确保 `API_CONFIG` 中每个 URL 都有对应 mock 端点;只有当用户明确要求关闭 mock 或 `.env.dev` 中 `ENV_MOCK=false` 时,才允许直接联调真实接口。
|
|
123
|
+
22. **Mock URL 必须匹配真实请求**:`API_CONFIG` 保持真实接口路径(如 `/mdata/mdataModel/list`),mock 文件端点必须带 Vite 代理前缀(如 `/dev-api/mdata/mdataModel/list`),这样关闭 mock 后无需修改业务代码。
|
|
124
|
+
23. **页面初始数据必须由 mock 提供**:列表页 `onMounted(() => select())` 后必须能显示模拟数据,不允许生成空白页等待后端接口;`list` 端点返回 `{ code: 2000, data: { records, total, size, current } }`。
|
|
125
|
+
24. **必须使用 wk-skills-ui runtime 风格**:当项目安装了 `@agile-team/wk-skills-ui` 时,列表列定义必须使用 `defineColumns()`,操作列必须使用 `renderOps()`,状态/字典列优先使用 runtime 渲染器或 `logicType=dict` 自动映射;不可退回默认纯文本/空函数风格。
|
|
126
|
+
25. **wk-skills-ui 接入自检**:生成页面前检查项目是否已接入 `@agile-team/wk-skills-ui` 样式与 runtime。若未接入,先提示并补齐:`@use '@agile-team/wk-skills-ui/styles' as *;`、`installCommonPreset()`、必要的 design tokens 引入;否则页面风格不会自动生效。
|
|
127
|
+
26. **pages.ts 分组注册**:多页面模块必须按当前业务目录分组写入 `vite/plugins/shared/pages.ts`,使用 `gProd(module, { subModule: [[page, label]] })` 结构,不允许把所有页面扁平追加到一个数组。
|
|
128
|
+
27. **BaseTable 强制 AGGrid**:所有业务主列表/台账/主从表/树表/详情子表的 `BaseTable` 必须显式写 `render-type="agGrid"`,并绑定全局唯一 `cid`。弹窗小表格可豁免,但必须在生成摘要中说明理由。
|
|
129
|
+
28. **cid 必须可追踪**:每个页面导出 `TABLE_CID = "{pageAbbr}-{base36Timestamp}"`;多表页面使用 `BOTTOM_TABLE_CID` / `ITEM_TABLE_CID`,列级 `cid` 必须使用 `${TABLE_CID}-fieldName` 前缀。
|
|
130
|
+
29. **skills-ui 只能融合,不可生搬硬套**:不得照搬 `wk-skills-ui/templates/list-page` 中的原生 `el-form/usePageHook/el-pagination` 通用写法;本项目必须保留 `AbstractPageQueryHook + BaseQuery + BaseToolbar + BaseTable + jh-pagination` 平台骨架,只融合 `defineColumns/renderOps/tokens/preset`。
|
|
122
131
|
|
|
123
132
|
### 禁止事项(严格遵守)
|
|
124
133
|
|
|
@@ -135,6 +144,11 @@ src/views/[域]/[模块]/[子模块]/[kebab-case-目录名]/
|
|
|
135
144
|
11. **❌ 禁止表单控件宽度不统一**:`jh-select`、`jh-date`、`el-input-number`、`jh-file-upload` 默认宽度可能与 `el-input` 不一致,必须在 scoped style 中用 `:deep()` 统一设为 `width: 100%`(详见 §表单页 UI 细节规范)
|
|
136
145
|
12. **❌ 禁止表单页无滚动**:独立路由表单页内容超出视口时必须可滚动,`.app-page-container` 须设 `overflow-y: auto`(**不要加 `height: 100%`,全局已有 `height: calc(100vh - 100px)`,叠加会导致双滚动条**)
|
|
137
146
|
13. **❌ 禁止内联 style 散落**:所有页面/组件样式统一写在 `index.scss` 中(便于复用和移动),不可在 template 中大量使用内联 `style="..."`
|
|
147
|
+
14. **❌ 禁止生成无 mock 的页面**:只写 `API_CONFIG` 但不写 `mock/*.ts` 属于生成失败。
|
|
148
|
+
15. **❌ 禁止生成空 onClick**:`onClick: () => {}` 属于生成失败;未知逻辑也必须用 `ElMessage.info(...)` 明示。
|
|
149
|
+
16. **❌ 禁止忽略 wk-skills-ui**:项目已安装 `@agile-team/wk-skills-ui` 时,不使用 `defineColumns/renderOps` 属于生成失败。
|
|
150
|
+
17. **❌ 禁止 BaseTable 非 AGGrid**:业务列表中 `<BaseTable>` 未写 `render-type="agGrid"` 或缺少 `cid/:cid` 属于生成失败。
|
|
151
|
+
18. **❌ 禁止列缺 cid**:AGGrid 表格的数据列/操作列缺少列级 `cid` 属于生成失败。
|
|
138
152
|
|
|
139
153
|
### c_formModal 使用规范
|
|
140
154
|
|
|
@@ -294,18 +308,20 @@ export function createPage() {
|
|
|
294
308
|
];
|
|
295
309
|
}
|
|
296
310
|
columnsDef(): TableColumnDesc<any>[] {
|
|
297
|
-
return [
|
|
311
|
+
return defineColumns([
|
|
298
312
|
// ...
|
|
299
313
|
{
|
|
300
314
|
label: "操作",
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
315
|
+
name: "_action",
|
|
316
|
+
cid: `${TABLE_CID}-action`,
|
|
317
|
+
fixed: "right",
|
|
318
|
+
align: "center",
|
|
319
|
+
defaultSlot: ({ row }: any) =>
|
|
320
|
+
renderOps([
|
|
321
|
+
{ type: "edit", onClick: () => navigateToForm({ id: row.id }) } // 带 id:编辑
|
|
322
|
+
])
|
|
307
323
|
}
|
|
308
|
-
];
|
|
324
|
+
] as any) as TableColumnDesc<any>[];
|
|
309
325
|
}
|
|
310
326
|
})();
|
|
311
327
|
return Page.create() as any;
|
|
@@ -401,34 +417,38 @@ const ids = rows.map((r: any) => r.id);
|
|
|
401
417
|
```typescript
|
|
402
418
|
{
|
|
403
419
|
label: "操作",
|
|
420
|
+
name: "_action",
|
|
421
|
+
cid: `${TABLE_CID}-action`,
|
|
404
422
|
width: 140,
|
|
405
423
|
fixed: "right",
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
424
|
+
align: "center",
|
|
425
|
+
defaultSlot: ({ row }: any) =>
|
|
426
|
+
renderOps([
|
|
427
|
+
{
|
|
428
|
+
type: "edit",
|
|
429
|
+
label: "修改",
|
|
430
|
+
show: () => row.verifyStatus === "已核实",
|
|
431
|
+
onClick: () => _editModalRef?.value?.edit(row.id)
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
type: "danger",
|
|
435
|
+
label: "作废",
|
|
436
|
+
show: () => row.verifyStatus === "已核实",
|
|
437
|
+
onClick: () => handleCancel(row)
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
type: "edit",
|
|
441
|
+
label: "编辑",
|
|
442
|
+
show: () => row.verifyStatus !== "已核实",
|
|
443
|
+
onClick: () => _editModalRef?.value?.edit(row.id)
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
type: "del",
|
|
447
|
+
label: "删除",
|
|
448
|
+
show: () => row.verifyStatus !== "已核实",
|
|
449
|
+
onClick: () => Page?.remove(row.id)
|
|
450
|
+
}
|
|
451
|
+
])
|
|
432
452
|
}
|
|
433
453
|
```
|
|
434
454
|
|
|
@@ -497,15 +517,24 @@ function renderStatusTag(row: any, field: string) {
|
|
|
497
517
|
let Page: any = null;
|
|
498
518
|
|
|
499
519
|
export function managementColumns(): TableColumnDesc<any>[] {
|
|
500
|
-
return [
|
|
520
|
+
return defineColumns([
|
|
501
521
|
// ...
|
|
502
|
-
{
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
522
|
+
{
|
|
523
|
+
label: "操作",
|
|
524
|
+
name: "_action",
|
|
525
|
+
cid: `${TABLE_CID}-management-action`,
|
|
526
|
+
fixed: "right",
|
|
527
|
+
width: 100,
|
|
528
|
+
align: "center",
|
|
529
|
+
defaultSlot: ({ row }: any) =>
|
|
530
|
+
renderOps([
|
|
531
|
+
{ type: "del", label: "删除", onClick: () => Page?.remove(row.id) }
|
|
532
|
+
])
|
|
533
|
+
}
|
|
534
|
+
] as any) as TableColumnDesc<any>[];
|
|
506
535
|
}
|
|
507
536
|
export function usageColumns(): TableColumnDesc<any>[] {
|
|
508
|
-
return [ /* 使用视角列... */ ];
|
|
537
|
+
return defineColumns([ /* 使用视角列... */ ] as any) as TableColumnDesc<any>[];
|
|
509
538
|
}
|
|
510
539
|
|
|
511
540
|
export function createPage(editModalRef?: any) {
|
|
@@ -866,6 +895,50 @@ import { BaseQueryItemDesc } from "@jhlc/common-core/src/components/form/base-qu
|
|
|
866
895
|
|
|
867
896
|
page-codegen 生成页面代码后,**必须追加写入菜单配置信息到 `reports/SYS_MENU_INFO.md`**。
|
|
868
897
|
|
|
898
|
+
## pages.ts 分组注册规则(Module Federation 子应用)
|
|
899
|
+
|
|
900
|
+
多页面子应用必须使用与 `wl-mdata` 验证一致的分组模式,禁止扁平追加:
|
|
901
|
+
|
|
902
|
+
```typescript
|
|
903
|
+
import type { SharedPageItem } from "./utils";
|
|
904
|
+
|
|
905
|
+
type PageTuple = [string, string];
|
|
906
|
+
type SubModuleMap = Record<string, PageTuple[]>;
|
|
907
|
+
|
|
908
|
+
const gProd = (module: string, subModules: SubModuleMap): SharedPageItem[] =>
|
|
909
|
+
Object.entries(subModules).flatMap(([subModule, pages]) =>
|
|
910
|
+
pages.map(([page, label]) => ({
|
|
911
|
+
name: `${module}/${subModule}/${page}/index.vue`,
|
|
912
|
+
label
|
|
913
|
+
}))
|
|
914
|
+
);
|
|
915
|
+
|
|
916
|
+
const mdataModule = gProd("mdata", {
|
|
917
|
+
model: [
|
|
918
|
+
["mdata-model-config", "主数据模型配置"],
|
|
919
|
+
["mdata-attr-mapping", "属性映射管理"]
|
|
920
|
+
],
|
|
921
|
+
integration: [
|
|
922
|
+
["mdata-integ-system", "集成系统管理"]
|
|
923
|
+
]
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
export const list: SharedPageItem[] = mdataModule;
|
|
927
|
+
export default list;
|
|
928
|
+
```
|
|
929
|
+
|
|
930
|
+
生成规则:
|
|
931
|
+
|
|
932
|
+
| 字段 | 规则 |
|
|
933
|
+
| --- | --- |
|
|
934
|
+
| `module` | 来自项目启动参数 `--module=xxx`,如 `mdata` |
|
|
935
|
+
| `subModule` | 来自页面目录第二级,如 `src/views/mdata/model/...` → `model` |
|
|
936
|
+
| `page` | 页面 kebab 目录名,如 `mdata-model-config` |
|
|
937
|
+
| `name` | `${module}/${subModule}/${page}/index.vue` |
|
|
938
|
+
| `label` | 页面中文名 |
|
|
939
|
+
|
|
940
|
+
> menu-sync 的 `component` 必须与 `pages.ts` 生成的 `name` 完全一致,否则菜单能创建但点击无法加载页面。
|
|
941
|
+
|
|
869
942
|
### 写入策略(默认追加,不覆盖)
|
|
870
943
|
|
|
871
944
|
- **默认为追加模式**:保留已有内容,在末尾追加本次生成的菜单。避免覆盖团队之前累积的菜单记录。
|
|
@@ -875,24 +948,27 @@ page-codegen 生成页面代码后,**必须追加写入菜单配置信息到 `
|
|
|
875
948
|
|
|
876
949
|
### 生成模板
|
|
877
950
|
|
|
878
|
-
|
|
951
|
+
多级菜单必须先写目录(`type=M`),再在目录下写页面菜单(`type=C`)。格式如下:
|
|
879
952
|
|
|
880
953
|
```markdown
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
|
889
|
-
|
|
|
890
|
-
|
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
954
|
+
# 系统菜单配置 — [项目名] [业务模块]
|
|
955
|
+
|
|
956
|
+
> **module 命名**:`[module]`
|
|
957
|
+
> **父级菜单**:来自 `.github/skills/sync/env.local.json` 的 `menu.parentMenuId`
|
|
958
|
+
|
|
959
|
+
## 一级目录(type=M)
|
|
960
|
+
|
|
961
|
+
| # | 菜单名 | path | orderNum | 备注 |
|
|
962
|
+
| - | ------ | ---- | -------- | ---- |
|
|
963
|
+
| 1 | [目录中文名] | `[目录pathCamel]` | 1 | 含 N 个子菜单 |
|
|
964
|
+
|
|
965
|
+
## 二级菜单(type=C)
|
|
966
|
+
|
|
967
|
+
### 1. [目录中文名] 子菜单
|
|
968
|
+
|
|
969
|
+
| 菜单名 | path | component | permission |
|
|
970
|
+
| ------ | ---- | --------- | ---------- |
|
|
971
|
+
| [页面中文名] | `[pageCamel]` | `[module]/[subModule]/[pageKebab]/index.vue` | `[module]:[pageCamel]:list` |
|
|
896
972
|
```
|
|
897
973
|
|
|
898
974
|
### 字段生成规则
|
|
@@ -901,8 +977,8 @@ page-codegen 生成页面代码后,**必须追加写入菜单配置信息到 `
|
|
|
901
977
|
|------|------|------|
|
|
902
978
|
| 菜单路径 | page-spec.kebabName | kebab-case → camelCase(`mmwr-customer-archive` → `mmwrCustomerArchive`) |
|
|
903
979
|
| 菜单名称 | page-spec.pageName | 直接使用中文名 |
|
|
904
|
-
| 组件路径 | pages.ts 注册路径 | `[
|
|
905
|
-
| 权限标识 |
|
|
980
|
+
| 组件路径 | pages.ts 注册路径 | `[module]/[subModule]/[kebab-目录名]/index.vue` |
|
|
981
|
+
| 权限标识 | module + 菜单路径 | `[module]:[pageCamel]:list` |
|
|
906
982
|
| 是否隐藏 | page-spec.features.hiddenMenu | `true` → 是,`false` → 否 |
|
|
907
983
|
| 上级目录 | 用户指定 / page-spec 推断 | 如果用户在原型扫描阶段指定了上级目录,使用该值 |
|
|
908
984
|
| 应用选择 | pages.ts 域名 | `produce` → 生产,`sale` → 销售 |
|
|
@@ -919,29 +995,27 @@ page-codegen 生成页面代码后,**必须追加写入菜单配置信息到 `
|
|
|
919
995
|
### SYS_MENU_INFO.md 文件结构
|
|
920
996
|
|
|
921
997
|
```markdown
|
|
922
|
-
# 系统菜单配置 — [
|
|
998
|
+
# 系统菜单配置 — [项目名] [模块名]
|
|
923
999
|
|
|
924
|
-
>
|
|
925
|
-
>
|
|
926
|
-
>
|
|
927
|
-
> **pages.ts 注册位置**:`vite/plugins/shared/pages.ts` → `[模块变量名]` → `[子模块key]`
|
|
1000
|
+
> **父级菜单**:`[parentMenuId]`
|
|
1001
|
+
> **应用编码**:`[sysAppNo]`
|
|
1002
|
+
> **module 命名**:`[module]`
|
|
928
1003
|
|
|
929
|
-
##
|
|
1004
|
+
## 一级目录(type=M)
|
|
930
1005
|
|
|
931
|
-
|
|
|
932
|
-
| -------- |
|
|
933
|
-
|
|
|
934
|
-
| 菜单名称 | `[目录名]` |
|
|
935
|
-
| 显示排序 | `[序号]` |
|
|
1006
|
+
| # | 菜单名 | path | orderNum | 备注 |
|
|
1007
|
+
| - | ------ | ---- | -------- | ---- |
|
|
1008
|
+
| 1 | [目录名] | `[目录pathCamel]` | 1 | 含 N 个子菜单 |
|
|
936
1009
|
|
|
937
|
-
##
|
|
1010
|
+
## 二级菜单(type=C)
|
|
938
1011
|
|
|
939
|
-
[
|
|
1012
|
+
### 1. [目录名] 子菜单
|
|
940
1013
|
|
|
941
|
-
|
|
1014
|
+
| 菜单名 | path | component | permission |
|
|
1015
|
+
| ------ | ---- | --------- | ---------- |
|
|
1016
|
+
| [页面名称] | `[pageCamel]` | `[module]/[subModule]/[pageKebab]/index.vue` | `[module]:[pageCamel]:list` |
|
|
942
1017
|
|
|
943
|
-
|
|
944
|
-
...
|
|
1018
|
+
> pages.ts 对应:`gProd("[module]", { [subModule]: [["[pageKebab]", "[页面名称]"]] })`
|
|
945
1019
|
```
|
|
946
1020
|
|
|
947
1021
|
### 与 menu-sync 的衔接
|
|
@@ -950,6 +1024,7 @@ SYS_MENU_INFO.md 是 menu-sync Skill 的输入数据源:
|
|
|
950
1024
|
- **自动创建**:用户说"帮我创建菜单" → menu-sync 读取 SYS_MENU_INFO.md → 调 API 逐条创建
|
|
951
1025
|
- **手动创建**:用户也可直接按 SYS_MENU_INFO.md 的表格在系统管理后台手动创建菜单
|
|
952
1026
|
- 两种方式等价,菜单创建后通过 `组件路径` 字段与 pages.ts 注册的文件路径关联
|
|
1027
|
+
- **自动创建顺序**:必须先调用 `wls_menu_query` 获取当前 domain 菜单树,再 `wls_menu_upsert` 创建/更新一级目录(type=M),拿到目录 id 后再创建二级菜单(type=C)。不得把二级页面全部直接挂到根 `parentMenuId`。
|
|
953
1028
|
|
|
954
1029
|
---
|
|
955
1030
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## 这个 Skill 解决什么问题
|
|
9
9
|
|
|
10
|
-
基于《页面清单》+ `api.md`,**自动生成符合项目规范的 Vue 页面**(标准页面骨架:index.vue / data.ts / index.scss + api.md 按需),并跑一遍内部规范自检(Pre-flight + 完成摘要)。
|
|
10
|
+
基于《页面清单》+ `api.md`,**自动生成符合项目规范的 Vue 页面**(标准页面骨架:index.vue / data.ts / index.scss + api.md + mock 按需),并跑一遍内部规范自检(Pre-flight + 完成摘要)。
|
|
11
11
|
|
|
12
12
|
生成出来的代码**满足 13 条 standards**,无需手工改语法/命名。
|
|
13
13
|
|
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
|
|
24
24
|
## 触发关键词
|
|
25
25
|
|
|
26
|
-
`生成页面` / `创建页面` / `代码生成` / `vue 页面` / `按原型生成` / `帮我生成`
|
|
26
|
+
`生成页面` / `创建页面` / `代码生成` / `vue 页面` / `按原型生成` / `帮我生成` / `列表页` / `管理页` / `台账` / `mock` / `先能跑` / `AGGrid` / `skills-ui`
|
|
27
|
+
|
|
28
|
+
用户不需要精确说出 Skill 名。只要表达“做个页面”“根据截图生成”“先用假数据”“菜单也加上”“风格没生效”,AI 应自动进入 Intent Router,读取 `page-codegen/SKILL.md`、模板索引、匹配模板和 `standards/12-base-table.md`。
|
|
27
29
|
|
|
28
30
|
---
|
|
29
31
|
|
|
@@ -37,8 +39,9 @@ AI:[Pre-flight]
|
|
|
37
39
|
模板基线:templates/domains/produce/customer/
|
|
38
40
|
13 条 standards 自检通过项预估:
|
|
39
41
|
✓ AbstractPageQueryHook 正确继承
|
|
40
|
-
✓
|
|
41
|
-
✓
|
|
42
|
+
✓ BaseTable render-type="agGrid"
|
|
43
|
+
✓ TABLE_CID / 列级 cid 完整
|
|
44
|
+
✓ defineColumns / renderOps 已使用
|
|
42
45
|
✓ scoped scss
|
|
43
46
|
⚠ 待确认:customerStatus 字典 logicValue 名
|
|
44
47
|
[生成中... 8 分钟]
|
|
@@ -56,10 +59,11 @@ AI:[Pre-flight]
|
|
|
56
59
|
|
|
57
60
|
```
|
|
58
61
|
src/views/<域>/<模块>/<子模块>/<page-name>/
|
|
59
|
-
├── data.ts
|
|
62
|
+
├── data.ts API_CONFIG、Hook 类、TABLE_CID、defineColumns/renderOps
|
|
60
63
|
├── index.vue template + script + import data.ts
|
|
61
64
|
├── index.scss 页面专属样式(已 :deep / scoped 包好)
|
|
62
|
-
|
|
65
|
+
├── api.md (由 api-contract 生成,codegen 不覆盖)
|
|
66
|
+
└── mock/*.ts mock-first 场景下生成,端点与 API_CONFIG 对齐
|
|
63
67
|
```
|
|
64
68
|
|
|
65
69
|
外加生成报告:`.github/reports/PAGE_CODEGEN_<模块>_<YYYYMMDD>.md`
|
|
@@ -81,12 +85,29 @@ src/views/<域>/<模块>/<子模块>/<page-name>/
|
|
|
81
85
|
|
|
82
86
|
## 常见踩坑
|
|
83
87
|
|
|
84
|
-
| 现象 | 原因 | 解法
|
|
85
|
-
| ----------------------------------- | -------------------------------------- |
|
|
86
|
-
| 生成出来的页面 console 报字典查不到 | 字典还没在 reports/SYS_DICT_INFO.md 中 | 先跑 `dict-sync` 拉取,或手动补 dict
|
|
87
|
-
| 表单弹窗未加 v-loading | api.md 没标记 save/update 为耗时操作 | 在 api.md 接口清单中加 `**预计耗时:> 2s**` 标记
|
|
88
|
-
| `EColumn` 字段缺 `width` | 模板默认不指定 width | 模板里手动加,或选用 `templates/domains/` 下的成品
|
|
89
|
-
| AGGrid cid 重复 |
|
|
88
|
+
| 现象 | 原因 | 解法 |
|
|
89
|
+
| ----------------------------------- | -------------------------------------- | ----------------------------------------------------------------------------- |
|
|
90
|
+
| 生成出来的页面 console 报字典查不到 | 字典还没在 reports/SYS_DICT_INFO.md 中 | 先跑 `dict-sync` 拉取,或手动补 dict |
|
|
91
|
+
| 表单弹窗未加 v-loading | api.md 没标记 save/update 为耗时操作 | 在 api.md 接口清单中加 `**预计耗时:> 2s**` 标记 |
|
|
92
|
+
| `EColumn` 字段缺 `width` | 模板默认不指定 width | 模板里手动加,或选用 `templates/domains/` 下的成品 |
|
|
93
|
+
| AGGrid cid 重复 | cid 生成不规范 | 使用 `{页面目录首字母缩写}-{Date.now().toString(36)}`,多表追加 `-sub1/-sub2` |
|
|
94
|
+
| 表格不是 AGGrid | 模板未写 `render-type="agGrid"` | 使用最新模板,或运行 `wl-skills validate-page <页面目录>` |
|
|
95
|
+
| 操作列还是旧按钮 | 生成了 `operations: []` | 改成 `defaultSlot + renderOps()` |
|
|
96
|
+
| skills-ui 安装但风格没生效 | tokens/styles/preset/runtime 未接入 | 运行 `wl-skills doctor-ui` 查看缺项 |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 生成后建议命令
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
wl-skills validate-page src/views/<module>/<subModule>/<page>
|
|
104
|
+
wl-skills doctor-ui
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
若 AI 可调用 MCP,优先使用:
|
|
108
|
+
|
|
109
|
+
- `wls_validate_page`
|
|
110
|
+
- `wls_doctor_ui`
|
|
90
111
|
|
|
91
112
|
---
|
|
92
113
|
|