@agile-team/wl-skills-kit 2.7.2 → 2.8.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 +37 -0
- package/README.md +40 -12
- package/bin/wl-skills.js +147 -3
- package/files/.github/copilot-instructions.md +18 -0
- package/files/.github/guides/architecture.md +6 -4
- package/files/.github/skills/_best-practices.md +230 -220
- package/files/.github/skills/core/page-codegen/SKILL.md +5 -5
- package/files/.github/skills/sync/_mcp-guardrail.md +109 -109
- package/files/.github/skills/sync/dict-sync/SKILL.md +208 -208
- package/files/.github/skills/sync/permission-sync/SKILL.md +240 -275
- package/files/docs/mock-architecture.md +321 -0
- package/files/mock/_utils.ts +35 -0
- package/mcp/api/client.js +83 -83
- package/mcp/tools/dictSync.js +178 -173
- package/mcp/tools/menuSync.js +11 -0
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.8.0] - 2026-05-16
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **`files/docs/mock-architecture.md`**(新文档):Mock 架构规范,涵盖目录约定(按业务域分目录 `mock/[域]/[模块].ts`)、`_utils.ts` 共享工具、`ENV_MOCK` 开关机制、STORE 可变数组持久化模式、端点覆盖检查、一键清理流程。
|
|
8
|
+
- **`files/mock/_utils.ts`**(种子文件):`init`/`update` 自动写入目标项目 `mock/_utils.ts`,提供 `pageResult`/`ok`/`paginate`/`nowStr`/`pick` 五个共享工具,消除各 mock 模块重复定义。
|
|
9
|
+
- **CLI `mock-clean` 命令**:`--domain <name>` 按域清理(如 `mock-clean --domain mdata`)、`--all` 全量清理(保留 `_utils.ts`)、支持 `--dry-run` 预览。清理后提示修改 `ENV_MOCK` 并运行 `validate`。
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **`copilot-instructions.md`** 新增 Mock 架构节:目录结构约定、开关机制、URL 对齐、STORE 模式、模块自治原则、`mock-clean` CLI 用法。
|
|
14
|
+
- **`page-codegen/SKILL.md`** 规则修正:规则 9 → `mock/[业务域]/[模块].ts` 按域分目录 + 强制 `import ../_utils`;规则 20 → 自检 `mock/_utils.ts` 存在;规则 21 → 路径格式对齐;禁止 14 → 引用 `docs/mock-architecture.md`。
|
|
15
|
+
- **`validate` 增强**:新增 3 项 mock 架构质量检查 —— `_utils.ts` 存在性(warn)、mock 文件是否按域分目录(info)、是否引用共享工具(info)。输出新增 `ℹ` info 级别图标。
|
|
16
|
+
- **`_best-practices.md`** 场景 6 扩展:从一句话描述 → 完整 mock 架构速览 + 目录树 + 开关/清理说明。
|
|
17
|
+
- **`--domain` / `--all` 加入 `KNOWN_FLAGS`**;flag 校验兼容 `--domain=xxx` 等号格式。
|
|
18
|
+
|
|
19
|
+
### Notes
|
|
20
|
+
|
|
21
|
+
- Mock 架构为前端最佳实践固化,已在 wl-mdata 项目验证。新项目 `init` 后即获得 `mock/_utils.ts`;已有项目 `update` 后自动补充。
|
|
22
|
+
|
|
23
|
+
## [2.7.3] - 2026-05-13
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **`tests/mcp-tools.test.js`**(30 个测试):覆盖 `menuSync` 8 个纯函数(cleanCell / splitMarkdownRow / isDividerRow / parseBoolean / normalizeTree / flattenMenus / findExisting / parseReport)、`dictSync.extractModules`、`handleDictUpsert` 参数校验、`handleRoleUpsert` / `handleRoleAssignMenus` 参数校验,填补最易出 Bug 的 MCP 工具层零覆盖空白。
|
|
28
|
+
- **`.gitattributes`**:统一 `eol=lf`,消除 Windows 开发者打开文件后 CRLF 行尾符变更噪音。
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- **`scripts/lint-skills.js`** 扩展 core/ops Skill 校验:有写操作的 5 个 Skill(page-codegen / convention-audit / business-doc-extract / template-extract / code-fix)必须包含 Pre-flight 声明 + standards 引用,防止关键约束被遗漏;同时清理旧版 AI-bypass 警告规则(误报率高,作用有限)。输出信息更新为"公共文件 N 个、sync Skill N 个、write Skill N 个全部合规"。
|
|
33
|
+
- **`mcp/tools/menuSync.js` / `dictSync.js`**:新增 `_internal` 导出,暴露纯工具函数供单测调用,不影响运行时行为。
|
|
34
|
+
- **`files/.github/skills/sync/permission-sync/SKILL.md`**:275 → 240 行(-13%),命名规范表从 9 行精简为 1 行覆盖范例、后端接口参考表删去冗余 Body 示例列、报告输出改为一句话描述。
|
|
35
|
+
|
|
36
|
+
### Notes
|
|
37
|
+
|
|
38
|
+
- 纯工程质量提升,无 Skill 行为变更、无 MCP API 变更,业务项目无需操作。
|
|
39
|
+
|
|
3
40
|
## [2.7.2] - 2026-05-13
|
|
4
41
|
|
|
5
42
|
### Added
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @agile-team/wl-skills-kit
|
|
2
2
|
|
|
3
|
-
**AI Skill 模板包 v2.
|
|
3
|
+
**AI Skill 模板包 v2.8.0** — 一键将 13 条规范、10 个 AI Skill、17 个 MCP Tool、编辑器 MCP 配置、文档导入 Vue 3 项目。
|
|
4
4
|
|
|
5
5
|
让 AI 编辑器(Copilot / Cursor / Windsurf / Claude Code / Cline / Kiro / Trae / Qoder / 通用 Agents)**真正理解项目规范**,从原型/详设到完整页面代码全流程自动化。
|
|
6
6
|
|
|
@@ -23,6 +23,22 @@ npm run standards:init # 本包维护/业务项目均可复用
|
|
|
23
23
|
|
|
24
24
|
## 版本亮点
|
|
25
25
|
|
|
26
|
+
**v2.8.0**:Mock 架构体系固化 + `mock-clean` CLI 命令。
|
|
27
|
+
|
|
28
|
+
- 新增 `docs/mock-architecture.md` — Mock 目录约定、开关机制、模块化规范、一键清理流程
|
|
29
|
+
- 新增 `mock/_utils.ts` 种子文件 — `init` 自动写入,提供 `pageResult`/`ok`/`paginate`/`nowStr`/`pick`
|
|
30
|
+
- 新增 CLI `mock-clean` 命令 — `--domain <name>` 按域清理、`--all` 全量清理(保留 `_utils.ts`)、`--dry-run` 预览
|
|
31
|
+
- `copilot-instructions.md` 新增 Mock 架构节(目录约定、开关、STORE 模式、URL 对齐)
|
|
32
|
+
- `page-codegen/SKILL.md` 规则 9/20/21 修正为按域分目录 + 强制引用 `_utils`
|
|
33
|
+
- `validate` 增强:检查 `_utils.ts` 存在、mock 文件是否按域分目录、是否引用共享工具
|
|
34
|
+
|
|
35
|
+
**v2.7.3**:工程质量提升 — MCP tools 单测覆盖、lint-skills 扩展到 core Skill、.gitattributes 消除行尾符噪音、permission-sync SKILL.md 精简。
|
|
36
|
+
|
|
37
|
+
- 新增 `tests/mcp-tools.test.js`(30 个测试)覆盖 menuSync/dictSync/permissionSync 核心纯函数与参数校验
|
|
38
|
+
- `lint-skills` 新增 core/ops SKILL.md 规则:有写操作 Skill 必须含 Pre-flight + standards 引用
|
|
39
|
+
- 新增 `.gitattributes` 统一 LF 行尾,消除 Windows 开发者提交噪音
|
|
40
|
+
- `permission-sync/SKILL.md` 压缩 275 → 240 行,命名规范表与报告示例精简
|
|
41
|
+
|
|
26
42
|
**v2.7.2**:sync 类 Skill 自愈闭环 + 场景索引路由。
|
|
27
43
|
|
|
28
44
|
- 新增 `skills/_best-practices.md` 场景索引(AI 每轮默认加载,弱化关键词命中)
|
|
@@ -46,7 +62,7 @@ npm run standards:init # 本包维护/业务项目均可复用
|
|
|
46
62
|
- **单元测试**:registry / CLI / version-tools 共 18 项覆盖,上面三项防护都有连动验证
|
|
47
63
|
- **单一数据源加固**:`SKILL_COUNT` 从常量改为从 `_registry.md` 动态计算;copilot-instructions 删除内嵌 Skill 表改为指针;dict-sync / code-fix 补 USAGE.md
|
|
48
64
|
|
|
49
|
-
|
|
65
|
+
2.6.x 以来重点补齐业务理解闭环:原型/详设 → 业务文档 → 接口契约 → 页面代码 → 复扫。
|
|
50
66
|
|
|
51
67
|
- **新增 `business-doc-extract` Skill**:语义级智能触发(不依赖固定关键词),在资料达模块/项目级完整度时建议生成业务文档:
|
|
52
68
|
```text
|
|
@@ -118,16 +134,17 @@ wl-skills-kit/ ← 你正看的这个仓库
|
|
|
118
134
|
├── package.json name: @agile-team/wl-skills-kit
|
|
119
135
|
│
|
|
120
136
|
├── bin/
|
|
121
|
-
│ └── wl-skills.js CLI 实现(init / update / clean / check / diff / validate / validate-page / doctor-ui / export)
|
|
137
|
+
│ └── wl-skills.js CLI 实现(init / update / clean / check / diff / validate / validate-page / doctor-ui / export / mock-clean)
|
|
122
138
|
│
|
|
123
139
|
├── files/ ★★★ 真正会被打包并复制到业务项目的内容 ★★★
|
|
124
|
-
│
|
|
125
|
-
│
|
|
126
|
-
│
|
|
127
|
-
│
|
|
128
|
-
│
|
|
129
|
-
│
|
|
130
|
-
│ ├── docs/ 组件 API 文档
|
|
140
|
+
│ ├── .github/
|
|
141
|
+
│ │ ├── copilot-instructions.md 源 AI 主入口(编辑这里,不要编辑业务项目里的副本)
|
|
142
|
+
│ │ ├── standards/ 13 条规范
|
|
143
|
+
│ │ ├── skills/ Skill 目录(含 _compat/ 多编辑器适配源)
|
|
144
|
+
│ │ ├── guides/ 人读指南
|
|
145
|
+
│ │ └── reports/ 领域基线模板(菜单/字典/权限)
|
|
146
|
+
│ ├── docs/ 组件 API 文档 + Mock 架构规范
|
|
147
|
+
│ ├── mock/ Mock 共享工具种子(_utils.ts)
|
|
131
148
|
│ └── demo/ 领域样例
|
|
132
149
|
│
|
|
133
150
|
├── kit-internal/ ★★ 仅仓库可见,不会安装到业务项目 ★★
|
|
@@ -156,7 +173,7 @@ wl-skills-kit/ ← 你正看的这个仓库
|
|
|
156
173
|
你的业务项目/
|
|
157
174
|
│
|
|
158
175
|
├── .github/ ← 来自本包 files/.github/
|
|
159
|
-
│ ├── copilot-instructions.md Copilot 主入口(精简 ~
|
|
176
|
+
│ ├── copilot-instructions.md Copilot 主入口(精简 ~340 行)
|
|
160
177
|
│ ├── standards/ 13 条模块化规范 + index.md 门控
|
|
161
178
|
│ │ ├── 01-toolchain.md
|
|
162
179
|
│ │ ├── 02-code-structure.md
|
|
@@ -197,7 +214,11 @@ wl-skills-kit/ ← 你正看的这个仓库
|
|
|
197
214
|
├── .trae/rules/conventions.md Trae(含 alwaysApply frontmatter)
|
|
198
215
|
├── .qoder/rules/conventions.md Qoder
|
|
199
216
|
│
|
|
200
|
-
├──
|
|
217
|
+
├── mock/ ← 来自本包 files/mock/(init 自动写入)
|
|
218
|
+
│ ├── _utils.ts 共享工具(pageResult / ok / paginate / nowStr / pick)
|
|
219
|
+
│ └── [业务域]/[模块].ts 按域分目录,page-codegen 自动生成
|
|
220
|
+
│
|
|
221
|
+
├── docs/ 12 个组件 API 文档 + mock-architecture.md
|
|
201
222
|
├── demo/ 13 个领域样例
|
|
202
223
|
└── src/
|
|
203
224
|
├── components/ 全局/局部/远程组件
|
|
@@ -247,6 +268,12 @@ npx @agile-team/wl-skills-kit clean
|
|
|
247
268
|
# 清理但保留 reports/(菜单/字典/权限累积数据)
|
|
248
269
|
npx @agile-team/wl-skills-kit clean --keep-reports
|
|
249
270
|
|
|
271
|
+
# 清理指定业务域的 mock 文件(保留 _utils.ts)
|
|
272
|
+
npx @agile-team/wl-skills-kit mock-clean --domain mdata
|
|
273
|
+
|
|
274
|
+
# 清理全部 mock(保留 _utils.ts)
|
|
275
|
+
npx @agile-team/wl-skills-kit mock-clean --all
|
|
276
|
+
|
|
250
277
|
# 任何命令都可加 --dry-run 预览
|
|
251
278
|
npx @agile-team/wl-skills-kit update --dry-run
|
|
252
279
|
```
|
|
@@ -306,6 +333,7 @@ npx @agile-team/wl-skills-kit update
|
|
|
306
333
|
| `api-contract` | ✅ 启用 | `skills/core/api-contract/` | 生成 api.md 前后端契约 |
|
|
307
334
|
| `page-codegen` | ✅ 启用 | `skills/core/page-codegen/` | 页面骨架生成 + 模板调度 |
|
|
308
335
|
| `convention-audit` | ✅ 启用 | `skills/core/convention-audit/` | 13 条规范扫描 + 双报告 |
|
|
336
|
+
| `business-doc-extract` | ✅ 启用 | `skills/core/business-doc-extract/` | 语义触发,业务文档抽取与维护 |
|
|
309
337
|
| `template-extract` | ✅ 启用 | `skills/core/template-extract/` | 现有页面 → 领域模板 |
|
|
310
338
|
| `menu-sync` | ✅ 启用 | `skills/sync/menu-sync/` | 菜单基线 ↔ 后端接口 |
|
|
311
339
|
| `dict-sync` | ✅ 启用 | `skills/sync/dict-sync/` | 字典基线 ↔ 后端接口 |
|
package/bin/wl-skills.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* wl-skills-kit CLI v2.
|
|
4
|
+
* wl-skills-kit CLI v2.8.0
|
|
5
5
|
*
|
|
6
6
|
* 命令:
|
|
7
7
|
* init 全量安装(默认,向后兼容)
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* validate-page validate 的别名,适用于单页/目录检查
|
|
14
14
|
* doctor-ui 检查 @agile-team/wk-skills-ui 接入完整性
|
|
15
15
|
* export 导出 SYS_MENU / SYS_DICT / SYS_PERMISSION 为 xlsx
|
|
16
|
+
* mock-clean 清理 mock 文件(按域或全部),保留 _utils.ts
|
|
16
17
|
* --help 帮助
|
|
17
18
|
* --dry-run 预览模式(所有命令均支持)
|
|
18
19
|
*/
|
|
@@ -39,6 +40,7 @@ const KNOWN_COMMANDS = new Set([
|
|
|
39
40
|
"validate-page",
|
|
40
41
|
"doctor-ui",
|
|
41
42
|
"export",
|
|
43
|
+
"mock-clean",
|
|
42
44
|
]);
|
|
43
45
|
const KNOWN_FLAGS = new Set([
|
|
44
46
|
"--dry-run",
|
|
@@ -46,6 +48,8 @@ const KNOWN_FLAGS = new Set([
|
|
|
46
48
|
"--force",
|
|
47
49
|
"--help",
|
|
48
50
|
"-h",
|
|
51
|
+
"--domain",
|
|
52
|
+
"--all",
|
|
49
53
|
]);
|
|
50
54
|
|
|
51
55
|
const dryRun = args.includes("--dry-run");
|
|
@@ -56,7 +60,10 @@ const force = args.includes("--force");
|
|
|
56
60
|
// 校验所有 flag 是否已知(--help 优先,跳过校验直接显示帮助)
|
|
57
61
|
if (!showHelp) {
|
|
58
62
|
const unknownFlags = args.filter(
|
|
59
|
-
(a) =>
|
|
63
|
+
(a) =>
|
|
64
|
+
a.startsWith("-") &&
|
|
65
|
+
!KNOWN_FLAGS.has(a) &&
|
|
66
|
+
!KNOWN_FLAGS.has(a.split("=")[0]),
|
|
60
67
|
);
|
|
61
68
|
if (unknownFlags.length > 0) {
|
|
62
69
|
console.error("");
|
|
@@ -96,11 +103,14 @@ if (showHelp) {
|
|
|
96
103
|
validate-page validate 的别名,适用于单页/目录检查
|
|
97
104
|
doctor-ui 检查 @agile-team/wk-skills-ui 接入完整性
|
|
98
105
|
export 导出 reports/SYS_* 数据为 xlsx
|
|
106
|
+
mock-clean 清理 mock 文件(按域或全部),保留 _utils.ts
|
|
99
107
|
|
|
100
108
|
选项:
|
|
101
109
|
--dry-run 预览模式,不实际写入/删除任何文件
|
|
102
110
|
--keep-reports clean 命令保留 .github/reports/(默认一起删除)
|
|
103
111
|
--force 强制执行,跳过同版本检测(忽略已安装状态)
|
|
112
|
+
--domain <name> mock-clean 指定要清理的业务域(如 sale、mdata)
|
|
113
|
+
--all mock-clean 清理全部 mock(保留 _utils.ts)
|
|
104
114
|
--help 显示帮助
|
|
105
115
|
|
|
106
116
|
示例:
|
|
@@ -116,6 +126,9 @@ if (showHelp) {
|
|
|
116
126
|
npx @agile-team/wl-skills-kit clean 清理开发期文件
|
|
117
127
|
npx @agile-team/wl-skills-kit clean --keep-reports 保留 reports/中的菜单/字典数据
|
|
118
128
|
npx @agile-team/wl-skills-kit clean --dry-run 预览将要清理哪些文件
|
|
129
|
+
npx @agile-team/wl-skills-kit mock-clean --domain mdata 清理 mdata 域 mock
|
|
130
|
+
npx @agile-team/wl-skills-kit mock-clean --all 清理全部 mock
|
|
131
|
+
npx @agile-team/wl-skills-kit mock-clean --all --dry-run 预览将要清理的 mock 文件
|
|
119
132
|
|
|
120
133
|
保护路径(init / update 不覆盖已存在的):
|
|
121
134
|
.github/reports/ AI 生成报告(团队累积数据,存在则跳过)
|
|
@@ -853,6 +866,54 @@ function runValidate() {
|
|
|
853
866
|
const mockContent = mockFiles
|
|
854
867
|
.map((rel) => fs.readFileSync(path.join(TARGET_DIR, rel), "utf8"))
|
|
855
868
|
.join("\n");
|
|
869
|
+
|
|
870
|
+
// ── Mock 架构质量检查 ──────────────────────────────────────────────
|
|
871
|
+
const mockDir = path.join(TARGET_DIR, "mock");
|
|
872
|
+
const hasMockDir = fs.existsSync(mockDir);
|
|
873
|
+
const hasUtilsTs =
|
|
874
|
+
hasMockDir &&
|
|
875
|
+
(fs.existsSync(path.join(mockDir, "_utils.ts")) ||
|
|
876
|
+
fs.existsSync(path.join(mockDir, "_utils.js")));
|
|
877
|
+
if (hasMockDir && mockFiles.length > 0 && !hasUtilsTs) {
|
|
878
|
+
issues.push({
|
|
879
|
+
level: "warn",
|
|
880
|
+
dir: "mock/",
|
|
881
|
+
text: "缺少 mock/_utils.ts 共享工具文件(建议 wl-skills init 补充)",
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
// 检查 mock 文件是否按域分目录(非 _utils 的 ts/js 文件不应直接放在 mock/ 根)
|
|
885
|
+
for (const rel of mockFiles) {
|
|
886
|
+
const parts = rel
|
|
887
|
+
.replace(/\\/g, "/")
|
|
888
|
+
.replace(/^mock\//, "")
|
|
889
|
+
.split("/");
|
|
890
|
+
const basename = parts[parts.length - 1];
|
|
891
|
+
if (parts.length === 1 && !basename.startsWith("_")) {
|
|
892
|
+
issues.push({
|
|
893
|
+
level: "info",
|
|
894
|
+
dir: "mock/",
|
|
895
|
+
text:
|
|
896
|
+
basename +
|
|
897
|
+
" 直接放在 mock/ 根目录,建议按业务域分子目录(如 mock/sale/" +
|
|
898
|
+
basename +
|
|
899
|
+
")",
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
// 检查 mock 模块文件是否 import _utils
|
|
904
|
+
for (const rel of mockFiles) {
|
|
905
|
+
const basename = path.basename(rel);
|
|
906
|
+
if (basename.startsWith("_")) continue;
|
|
907
|
+
const content = fs.readFileSync(path.join(TARGET_DIR, rel), "utf8");
|
|
908
|
+
if (hasUtilsTs && !/_utils/.test(content)) {
|
|
909
|
+
issues.push({
|
|
910
|
+
level: "info",
|
|
911
|
+
dir: rel,
|
|
912
|
+
text: "未引用 mock/_utils 共享工具,建议统一使用 pageResult/ok/paginate",
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
|
|
856
917
|
for (const page of pages) {
|
|
857
918
|
if (!page.hasDataTs)
|
|
858
919
|
issues.push({
|
|
@@ -933,7 +994,8 @@ function runValidate() {
|
|
|
933
994
|
console.log("");
|
|
934
995
|
const errors = issues.filter((issue) => issue.level === "error").length;
|
|
935
996
|
for (const issue of issues) {
|
|
936
|
-
const icon =
|
|
997
|
+
const icon =
|
|
998
|
+
issue.level === "error" ? "✖" : issue.level === "info" ? "ℹ" : "⚠";
|
|
937
999
|
console.log(" " + icon + " " + issue.dir + " — " + issue.text);
|
|
938
1000
|
}
|
|
939
1001
|
if (issues.length === 0) console.log(" ✔ 页面文件完整性检查通过");
|
|
@@ -1106,6 +1168,85 @@ function runExport() {
|
|
|
1106
1168
|
console.log("");
|
|
1107
1169
|
}
|
|
1108
1170
|
|
|
1171
|
+
// ─── mock-clean ──────────────────────────────────────────────────────────
|
|
1172
|
+
|
|
1173
|
+
function runMockClean() {
|
|
1174
|
+
console.log("");
|
|
1175
|
+
console.log(" wl-skills-kit v" + PKG.version + " [mock-clean]");
|
|
1176
|
+
console.log("");
|
|
1177
|
+
|
|
1178
|
+
const mockDir = path.join(TARGET_DIR, "mock");
|
|
1179
|
+
if (!fs.existsSync(mockDir)) {
|
|
1180
|
+
console.log(" ⚠ mock/ 目录不存在,无需清理");
|
|
1181
|
+
console.log("");
|
|
1182
|
+
return;
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
const domainArg = args.find((a) => a.startsWith("--domain"));
|
|
1186
|
+
const cleanAll = args.includes("--all");
|
|
1187
|
+
let domain = "";
|
|
1188
|
+
if (domainArg) {
|
|
1189
|
+
// 支持 --domain=xxx 和 --domain xxx
|
|
1190
|
+
if (domainArg.includes("=")) {
|
|
1191
|
+
domain = domainArg.split("=")[1];
|
|
1192
|
+
} else {
|
|
1193
|
+
const idx = args.indexOf(domainArg);
|
|
1194
|
+
domain = args[idx + 1] || "";
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
if (!domain && !cleanAll) {
|
|
1199
|
+
console.error(" ✖ 请指定 --domain <name> 或 --all");
|
|
1200
|
+
console.error(" 示例: wl-skills mock-clean --domain mdata");
|
|
1201
|
+
console.error(" wl-skills mock-clean --all");
|
|
1202
|
+
console.error("");
|
|
1203
|
+
process.exit(1);
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
// 收集要删除的文件/目录
|
|
1207
|
+
const toRemove = [];
|
|
1208
|
+
if (cleanAll) {
|
|
1209
|
+
// 删除 mock/ 下除 _utils.ts/_utils.js 之外的所有文件和子目录
|
|
1210
|
+
const entries = fs.readdirSync(mockDir, { withFileTypes: true });
|
|
1211
|
+
for (const entry of entries) {
|
|
1212
|
+
if (entry.name.startsWith("_")) continue; // 保留 _utils.ts 等
|
|
1213
|
+
toRemove.push(path.join(mockDir, entry.name));
|
|
1214
|
+
}
|
|
1215
|
+
} else {
|
|
1216
|
+
// 删除指定域目录
|
|
1217
|
+
const domainDir = path.join(mockDir, domain);
|
|
1218
|
+
if (!fs.existsSync(domainDir)) {
|
|
1219
|
+
console.log(' ⚠ mock/' + domain + '/ 不存在');
|
|
1220
|
+
console.log("");
|
|
1221
|
+
return;
|
|
1222
|
+
}
|
|
1223
|
+
toRemove.push(domainDir);
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
if (toRemove.length === 0) {
|
|
1227
|
+
console.log(" ✔ 无需清理(仅剩 _utils.ts)");
|
|
1228
|
+
console.log("");
|
|
1229
|
+
return;
|
|
1230
|
+
}
|
|
1231
|
+
|
|
1232
|
+
for (const target of toRemove) {
|
|
1233
|
+
const rel = path.relative(TARGET_DIR, target);
|
|
1234
|
+
if (dryRun) {
|
|
1235
|
+
console.log(" [dry-run] 将删除: " + rel);
|
|
1236
|
+
} else {
|
|
1237
|
+
fs.rmSync(target, { recursive: true, force: true });
|
|
1238
|
+
console.log(" ✔ 已删除: " + rel);
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
console.log("");
|
|
1243
|
+
if (!dryRun) {
|
|
1244
|
+
console.log(" 建议:将 .env.dev 中 ENV_MOCK 改为 false");
|
|
1245
|
+
console.log(" 然后运行 wl-skills validate 检查页面无 mock 依赖残留");
|
|
1246
|
+
console.log("");
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1109
1250
|
// ─── 主路由 ─────────────────────────────────────────────────────────────
|
|
1110
1251
|
|
|
1111
1252
|
switch (command) {
|
|
@@ -1134,6 +1275,9 @@ switch (command) {
|
|
|
1134
1275
|
case "export":
|
|
1135
1276
|
runExport();
|
|
1136
1277
|
break;
|
|
1278
|
+
case "mock-clean":
|
|
1279
|
+
runMockClean();
|
|
1280
|
+
break;
|
|
1137
1281
|
default:
|
|
1138
1282
|
console.error(
|
|
1139
1283
|
' ✖ 未知命令: "' + command + '",请使用 --help 查看可用命令',
|
|
@@ -28,6 +28,24 @@ src/views/[域]/[模块]/[子模块]/[kebab-case目录]/
|
|
|
28
28
|
- **通用弹窗**(新增/编辑表单,2+ 页面可复用)→ 提取到 `src/components/local/c_xxxModal/`
|
|
29
29
|
- **极个性弹窗**(仅单页面使用,c_modal 无法满足)→ 放在页面 `components/xxxModal.vue`
|
|
30
30
|
|
|
31
|
+
## Mock 架构(与页面完全解耦)
|
|
32
|
+
|
|
33
|
+
> 详细规范见 `docs/mock-architecture.md`
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
mock/
|
|
37
|
+
├── _utils.ts ← 共享工具(pageResult / ok / paginate / nowStr / pick)
|
|
38
|
+
└── [业务域]/ ← 镜像 src/views 第一级目录
|
|
39
|
+
└── [模块].ts ← 每个模块一个文件,export default MockMethod[]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- **开关**:`.env.dev` 中 `ENV_MOCK=true/false`,`vite.config.ts` 中 `viteMockServe({ enable: command === "serve" && config.ENV_MOCK !== "false" })`
|
|
43
|
+
- **解耦**:mock 文件放在项目根 `mock/` 目录,不在 `src/views` 中 import 任何 mock
|
|
44
|
+
- **URL 对齐**:`API_CONFIG` 保持真实路径(如 `/mdata/mdataModel/list`),mock 端点带 `/dev-api` 前缀,关闭 mock 后无需改页面代码
|
|
45
|
+
- **STORE 模式**:`let STORE = Array.from({ length: N }, genRecord)` 可变数组,CRUD 直接修改内存,查询立即可见
|
|
46
|
+
- **按模块自治**:删某业务 mock 只删对应文件,不影响其他模块
|
|
47
|
+
- **一键清理**:`wl-skills mock-clean --domain [域]` 或 `--all`
|
|
48
|
+
|
|
31
49
|
## data.ts 核心模式
|
|
32
50
|
|
|
33
51
|
> 配置化驱动,通过 `API_CONFIG` + `class extends AbstractPageQueryHook` 实现零 API 层开发。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **读者**:团队技术负责人 / wl-skills-kit 维护者 / 对体系设计感兴趣的团队成员
|
|
4
4
|
> **更新方式**:重大架构变更后追加对应章节,旧章节原文保留(历史可溯)
|
|
5
|
-
> **当前版本**:v2.
|
|
5
|
+
> **当前版本**:v2.8.0(2026-05-16)
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -478,9 +478,11 @@ AI "假执行"——声称读了规范,实际按惯性输出。没有强制约
|
|
|
478
478
|
| ---- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------- |
|
|
479
479
|
| v1.x | 5 个 Skill 平铺 + 9 个 TPL 平铺 + 单一超长 copilot-instructions | ✅ 已发布 |
|
|
480
480
|
| v2.0 | 规范模块化(13 条)+ 模板分层(universal/domains)+ 报告分类 + Pre-flight + 工具链门控 | ✅ 已发布 |
|
|
481
|
-
| v2.1 | Skill 分级目录(core/sync/ops/domain)+ 多 AI 适配解耦(editors.json)+ 各 Skill USAGE.md + api-contract 真实响应 + 3 个 PLANNED 草稿补全 | ✅
|
|
482
|
-
| v2.2 | dict-sync / permission-sync / code-fix 从 PLANNED →
|
|
483
|
-
| v2.
|
|
481
|
+
| v2.1 | Skill 分级目录(core/sync/ops/domain)+ 多 AI 适配解耦(editors.json)+ 各 Skill USAGE.md + api-contract 真实响应 + 3 个 PLANNED 草稿补全 | ✅ 已发布 |
|
|
482
|
+
| v2.2–2.3 | dict-sync / permission-sync / code-fix 从 PLANNED → 转正 + lint-skills 静态护栏 + MCP 自愈闭环 | ✅ 已发布 |
|
|
483
|
+
| v2.6 | business-doc-extract 语义触发 + 业务文档体系 + AGGrid/cid/defineColumns/renderOps 最终标准 + doctor-ui / validate 增强 | ✅ 已发布 |
|
|
484
|
+
| v2.7 | JH 组件文档全面修正 + MCP tools 单测覆盖 + 场景索引路由 + _mcp-guardrail 自愈闭环 + .gitattributes + 版本一致性自检 | ✅ 已发布 |
|
|
485
|
+
| v2.8 | Mock 架构体系固化(mock-architecture.md + _utils.ts 种子 + mock-clean CLI + validate mock 质量检查 + 规则修正) | ✅ 当前 |
|
|
484
486
|
|
|
485
487
|
---
|
|
486
488
|
|