@agile-team/wl-skills-kit 2.11.0 → 2.11.1

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,30 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.11.1] - 2026-06-15
4
+
5
+ ### Added
6
+
7
+ - **page-spec 落盘 + spec-align 确定性比对(S1~S5)**:新增 `lib/page-spec.js` 引擎,把"按原型精准实现"从 AI 自觉升级为代码卡控。page-codegen 生成时落盘 `page-spec.json`(单一真值),`validate` 自动比对 `data.ts` 实际实现:
8
+ - S1 查询字段顺序(warn)/ S2 表格列顺序与集合(error)/ S3 工具栏按钮顺序·集合·颜色(error)/ S4 操作列按钮严格对应(error)/ S5 按钮·列 label 文字保真(warn)
9
+ - 同步接入 MCP `wls_validate_page`,CLI 与 MCP 双通道一致
10
+ - 新增 `.wl-skills/docs/page-spec-schema.md` 字段规范
11
+ - **`wl-skills fix` 确定性机械修复(F1~F5)**:新增 `lib/safe-fix.js`,对幂等零语义偏差自动修复——BaseTable 补 `render-type="agGrid"`、`::v-deep`/`/deep/` → `:deep()`、行尾空白、文件末尾换行;支持 `--dry-run` 预览。语义级偏差仍交 AI/人工
12
+ - **规则覆盖矩阵治理**:新增 `kit-internal/rule-coverage.md`,登记每条约定的执行器(R*/S*/regex/AI);`lint-skills.js` 校验标记「阻断」的规则必须有确定性执行器,防止"文档约定"退化
13
+
14
+ ### Changed
15
+
16
+ - **C_Splitter 彻底删除**:从 kit 移除 `C_Splitter` 组件(`onMounted` 冻结 vnode 导致响应式失效的 bug 写法),`lint-skills` 全量禁止 `<C_Splitter>` / `import C_Splitter`(无任何例外),standards/14 更新为"已删除"
17
+ - page-codegen SKILL.md 新增"生成时落盘 page-spec.json + 自检跑 spec-align"硬约束
18
+ - **维护链路统一 pnpm-first**:新增 `packageManager: pnpm@11.5.3`、`pnpm-lock.yaml`、`pnpm verify` / `pnpm ci`,删除 `package-lock.json`;npm 仅保留在 `npm pack` / `npm publish` 发版环节
19
+ - **导出依赖安全替换**:`wl-skills export` 从存在高危漏洞的 `xlsx@0.18.5` 迁移到 `write-excel-file`,并将运行时 Node 基线提升到 `>=18`
20
+
21
+ ### Fixed
22
+
23
+ - 修复 `scripts/verify-version.js` / `scripts/sync-version.js` / `scripts/lint-skills.js` 仍指向旧版 `.github/` 路径导致 v2.11 后完全失效的问题(统一迁移到 `.wl-skills/`)
24
+ - 清理仓库根残留的旧版 `.wl-skills-manifest.json`(v2.6.0)
25
+ - 移除仓库 `.npmrc` 中误提交的 npm token,仅保留 registry 配置;本地私密 npmrc 已加入 ignore
26
+ - 修复 `export` 仍读取旧 `.github/reports` 的迁移漏点,现优先读取 `.wl-skills/reports` 并兼容旧目录
27
+
3
28
  ## [2.11.0] - 2026-06-14
4
29
 
5
30
  ### Changed
@@ -14,7 +39,7 @@
14
39
 
15
40
  ### Migration
16
41
 
17
- - 已安装 v2.10.x 的项目执行 `npx @agile-team/wl-skills-kit@latest update` 即可自动迁移
42
+ - 已安装 v2.10.x 的项目执行 `pnpm dlx @agile-team/wl-skills-kit@latest update` 即可自动迁移
18
43
  - 旧版 `.github/skills/`、`.github/standards/`、`.github/guides/`、`.github/reports/` 目录将被自动清理
19
44
  - `.github/copilot-instructions.md` 自动替换为薄壳入口
20
45
 
@@ -89,7 +114,7 @@
89
114
  ### Notes
90
115
 
91
116
  - 测试矩阵:cli + lint-skills + doctor-ui + registry + version-tools 合计 **53 测试通过**
92
- - 升级路径:`npx @agile-team/wl-skills-kit@latest update` 同步 standards/14;CI 增挂 `wl-skills doctor-ui` 即可
117
+ - 升级路径:`pnpm dlx @agile-team/wl-skills-kit@latest update` 同步 standards/14;CI 增挂 `wl-skills doctor-ui` 即可
93
118
 
94
119
  ## [2.9.1] - 2026-05-17
95
120
 
@@ -191,7 +216,7 @@
191
216
 
192
217
  ### Notes
193
218
 
194
- - 纯文档 + MCP 运行时增强,无 SDK 行为破坏性变更,业务项目 `npx @agile-team/wl-skills-kit update` 即可同步。
219
+ - 纯文档 + MCP 运行时增强,无 SDK 行为破坏性变更,业务项目 `pnpm dlx @agile-team/wl-skills-kit update` 即可同步。
195
220
 
196
221
  ## [2.7.1] - 2026-05-13
197
222
 
@@ -212,7 +237,7 @@
212
237
 
213
238
  ### Notes
214
239
 
215
- - 纯文档修正,无功能变更,业务项目 `npx @agile-team/wl-skills-kit update` 即可同步最新文档
240
+ - 纯文档修正,无功能变更,业务项目 `pnpm dlx @agile-team/wl-skills-kit update` 即可同步最新文档
216
241
 
217
242
  ## [2.7.0] - 2026-05-12
218
243
 
@@ -220,7 +245,7 @@
220
245
 
221
246
  - **CLI 未知 flag/命令防护**:`bin/wl-skills.js` 引入 `KNOWN_COMMANDS` / `KNOWN_FLAGS` 白名单。`node bin/wl-skills.js --version` 等未识别参数不再默认走 `init`,而是**退出非零并提示**,彻底消除 v2.6.x 时段被验证过的"误装风险"。
222
247
  - **MCP Tool auto-discovery**:新增 `mcp/registry.js` 集中维护 17 个工具描述符(含 `handle` / `needsBackendConfig`)。`mcp/server.js` 大幅瘦身(496 行 → 130 行),不再硬编码 17 项 switch case;新增 / 修改 Tool 仅改 `mcp/registry.js`。
223
- - **版本一致性自检脚本**:新增 `scripts/verify-version.js`(`npm run version:verify`),跨文件校验 `package.json#version` 与 CLI header / README / `guides/architecture.md` / headers 中描述行的一致性,并交叉校验 `_registry.md` 的 ✅ 启用 行数与 README / `package.json#description` 中的 "N 个 AI Skill" 数字一致。
248
+ - **版本一致性自检脚本**:新增 `scripts/verify-version.js`(`pnpm version:verify`),跨文件校验 `package.json#version` 与 CLI header / README / `guides/architecture.md` / headers 中描述行的一致性,并交叉校验 `_registry.md` 的 ✅ 启用 行数与 README / `package.json#description` 中的 "N 个 AI Skill" 数字一致。
224
249
  - **prepublishOnly 守门**:`npm publish` 前自动运行 `version:verify` + `vitest run`,不一致或测试失败则阻断发版。
225
250
  - **vitest 单元测试**:`tests/registry.test.js`(17 项 Tool 描述符 / Skill 计数 / package.json 一致性,9 测试)+ `tests/cli.test.js`(A1 防护黑盒测试 + dry-run 隔离验证,6 测试)+ `tests/version-tools.test.js`(version 工具脚本,3 测试)。共 **18 测试**全绿。
226
251
  - 新增 `dict-sync` / `code-fix` 的 `USAGE.md`,与其他 8 个启用 Skill 文档结构一致。
@@ -234,10 +259,10 @@
234
259
 
235
260
  ### Notes
236
261
 
237
- - 业务项目升级 `npx @agile-team/wl-skills-kit update` 即可,无破坏性变更。
262
+ - 业务项目升级 `pnpm dlx @agile-team/wl-skills-kit update` 即可,无破坏性变更。
238
263
  - 维护者新增 Skill:仅改 `_registry.md` 与 `_pipeline.md` + 写 SKILL.md/USAGE.md,**不再需要手改 sync-version 常量与 copilot Skill 表**。
239
264
  - 维护者新增 MCP Tool:仅改 `mcp/registry.js` 加一条描述符,**不再需要改 server.js**。
240
- - 验证:`npm run version:verify && npm test` 应全绿,CI 可直接接入。
265
+ - 验证:`pnpm version:verify && pnpm test` 应全绿,CI 可直接接入。
241
266
 
242
267
  ## [2.6.0] - 2026-05-12
243
268
 
@@ -303,7 +328,7 @@
303
328
  ### Added
304
329
 
305
330
  - CLI 安装完成后新增 `@agile-team/wk-skills-ui` 可选桥接提醒,保持两包独立分工、不强耦合
306
- - 新增 `standards:init` 脚本,统一指向 `npx @robot-admin/git-standards init`
331
+ - 新增 `standards:init` 脚本,统一指向 `pnpm dlx @robot-admin/git-standards init`
307
332
  - README 补充 wk-skills-ui 可选桥接说明与规范插件入口
308
333
 
309
334
  ## [2.4.0] - 2026-05-02
@@ -689,7 +714,7 @@
689
714
 
690
715
  ### 迁移指南(从 v1.x 升级)
691
716
 
692
- 执行 `npx @agile-team/wl-skills-kit@latest update` 即可。注意:
717
+ 执行 `pnpm dlx @agile-team/wl-skills-kit@latest update` 即可。注意:
693
718
 
694
719
  1. 老的 `docs/SYS_MENU_INFO.md` 需手动迁移到 `reports/SYS_MENU_INFO.md`
695
720
  2. 老的 `docs/menu-sync-design.md` / `docs/wl-skills-kit.md` 已删除,相关内容见 `guides/architecture.md`
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @agile-team/wl-skills-kit
2
2
 
3
- **AI Skill 模板包 v2.11.0** — 一键将 14 条规范、11 个 AI Skill、17 个 MCP Tool、编辑器 MCP 配置、文档导入 Vue 3 项目。
3
+ **AI Skill 模板包 v2.11.1** — 一键将 14 条规范、11 个 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
 
@@ -9,9 +9,9 @@
9
9
  ## TL;DR
10
10
 
11
11
  ```bash
12
- npx @robot-admin/git-standards init # 工程化前置(必须)
13
- npx @agile-team/wl-skills-kit # 安装 AI 体系
14
- npm run standards:init # 本包维护/业务项目均可复用的规范插件入口
12
+ pnpm dlx @robot-admin/git-standards init # 工程化前置(必须)
13
+ pnpm dlx @agile-team/wl-skills-kit # 安装 AI 体系
14
+ pnpm standards:init # 本包维护/业务项目均可复用的规范插件入口
15
15
  # 在 AI 对话中:
16
16
  "扫描 docs/prototypes/ 下的原型生成页面清单"
17
17
  "基于上一步生成所有 api.md,再 codegen 出页面"
@@ -19,10 +19,20 @@ npm run standards:init # 本包维护/业务项目均可复用
19
19
 
20
20
  > 可选桥接:如业务项目也需要统一 UI 风格、老系统化妆层和 UI 扫描修复,可单独安装 `@agile-team/wk-skills-ui`。两包职责独立,不互相强依赖:`wl-skills-kit` 负责编码规范/页面生成/菜单字典权限,`wk-skills-ui` 负责视觉一致性/设计令牌/化妆层/Runtime 渲染。
21
21
 
22
+ > 包管理策略:本仓库维护链路 **pnpm-first**,使用 `pnpm-lock.yaml`、`pnpm verify`、`pnpm ci`;npm 只用于 `npm pack` / `npm publish` 发版环节,不提交 `package-lock.json` 和 npm token。
23
+
22
24
  ---
23
25
 
24
26
  ## 版本亮点
25
27
 
28
+ **v2.11.1**:精准卡控闭环 —— 把"约定"接线到确定性执行器,生成即精确。
29
+
30
+ - **新增 page-spec 落盘 + spec-align 确定性比对(S1~S5)**:`page-codegen` 生成页面时同步写出 `page-spec.json`(原型约定真值),`validate` 用 AST 解析 `data.ts` 的 `queryDef/columnsDef/toolbarDef` 与之逐项比对——查询字段顺序、表格列顺序、工具栏按钮顺序与颜色、操作列按钮集合、label 文字保真。过去只靠 AI 自觉的 6 条"精准实现"约定,现在变成可阻断的硬卡控
31
+ - **新增 `wl-skills fix` 确定性机械修复**:对幂等、零语义判断的偏差(BaseTable 补 `render-type`、`::v-deep`→`:deep()`、行尾空白、文件末尾换行)做确定性自动修复,AI 只处理需语义判断的部分;`--dry-run` 预览
32
+ - **新增「规则 → 执行器」覆盖矩阵治理**:`kit-internal/rule-coverage.md` 登记每条约定由谁兜底(R*/S*/regex/AI),`lint:skills` 校验标记「阻断」的规则必须有真实执行器,杜绝"文档约定"退化为纯文档
33
+ - **C_Splitter 彻底删除**:废弃组件(onMounted 冻 vnode 致响应式失效)从包内移除,`lint:skills` 全量禁止任何引用,无例外
34
+ - **修复 v2.11 目录迁移遗留**:`lint-skills.js` / `verify-version.js` / `sync-version.js` 的 `.github/` 路径全部修正为 `.wl-skills/`,CI 自检链路恢复可用
35
+
26
36
  **v2.8.0**:Mock 架构体系固化 + `mock-clean` CLI 命令。
27
37
 
28
38
  - 新增 `docs/mock-architecture.md` — Mock 目录约定、开关机制、模块化规范、一键清理流程
@@ -45,7 +55,7 @@ npm run standards:init # 本包维护/业务项目均可复用
45
55
  - 新增 `skills/sync/_mcp-guardrail.md` 公共护栏(含 L0~L4 错误自愈剧本,MCP 失败时引导用户完善 `env.local.json` 而不是绕开自拼 HTTP)
46
56
  - 修复 `dict-sync/SKILL.md` 旧版残留与错路径;统一 `menu-sync/USAGE.md` 字段命名
47
57
  - MCP server 启动 banner(stderr,不污染 JSON-RPC);client.js 401/4004 友好提示
48
- - 新增 `npm run lint:skills` 静态护栏,已串入 `prepublishOnly`
58
+ - 新增 `pnpm lint:skills` 静态护栏,已串入 `prepublishOnly`
49
59
 
50
60
  **v2.7.1**:JH 组件文档全面修正,基于 `@jhlc/common-core` 源码校准 Props/API/映射规则。
51
61
 
@@ -56,9 +66,9 @@ npm run standards:init # 本包维护/业务项目均可复用
56
66
 
57
67
  **v2.7.0**:一致性治理与可测性升级,安全防护加固。
58
68
 
59
- - **CLI 未知 flag / 命令防护**:`npx @agile-team/wl-skills-kit --version` 等未识别参数不再默认走 `init` 误装,而是退出非零并提示
69
+ - **CLI 未知 flag / 命令防护**:`pnpm dlx @agile-team/wl-skills-kit --version` 等未识别参数不再默认走 `init` 误装,而是退出非零并提示
60
70
  - **MCP Tool auto-discovery**:新增 `mcp/registry.js`,17 个 Tool 描述符集中维护;`mcp/server.js` 从 496 行瘦身到 130 行,新增 Tool 仅改 registry
61
- - **版本一致性自检**:`npm run version:verify` 跨文件校验版本 + Skill 计数;`prepublishOnly` 在 `npm publish` 前自动运行它与 `vitest`,不一致则阻断发版
71
+ - **版本一致性自检**:`pnpm version:verify` 跨文件校验版本 + Skill 计数;`prepublishOnly` 在 `npm publish` 前自动运行它与 `vitest`,不一致则阻断发版
62
72
  - **单元测试**:registry / CLI / version-tools 共 18 项覆盖,上面三项防护都有连动验证
63
73
  - **单一数据源加固**:`SKILL_COUNT` 从常量改为从 `_registry.md` 动态计算;copilot-instructions 删除内嵌 Skill 表改为指针;dict-sync / code-fix 补 USAGE.md
64
74
 
@@ -134,7 +144,7 @@ wl-skills-kit/ ← 你正看的这个仓库
134
144
  ├── package.json name: @agile-team/wl-skills-kit
135
145
 
136
146
  ├── bin/
137
- │ └── wl-skills.js CLI 实现(init / update / clean / check / diff / validate / validate-page / doctor-ui / export / mock-clean)
147
+ │ └── wl-skills.js CLI 实现(init / update / clean / check / diff / validate / validate-page / fix / doctor-ui / export / mock-clean)
138
148
 
139
149
  ├── files/ ★★★ 真正会被打包并复制到业务项目的内容 ★★★
140
150
  │ ├── .github/
@@ -167,7 +177,7 @@ wl-skills-kit/ ← 你正看的这个仓库
167
177
  > - 多 AI 编辑器适配要改 → 改 `files/.wl-skills/skills/_compat/`(**不是**改业务项目里的根配置文件)
168
178
  > - 维护文档要写 → 进 `kit-internal/`(不会污染业务项目)
169
179
 
170
- ### B. 业务项目结构(执行 `npx @agile-team/wl-skills-kit` 之后)
180
+ ### B. 业务项目结构(执行 `pnpm dlx @agile-team/wl-skills-kit` 之后)
171
181
 
172
182
  ```
173
183
  你的业务项目/
@@ -240,43 +250,51 @@ wl-skills-kit/ ← 你正看的这个仓库
240
250
 
241
251
  ```bash
242
252
  # 全量安装(默认)
243
- npx @agile-team/wl-skills-kit
253
+ pnpm dlx @agile-team/wl-skills-kit
244
254
 
245
255
  # 增量更新(仅覆盖有变化的文件,自动保护 reports/)
246
- npx @agile-team/wl-skills-kit update
256
+ pnpm dlx @agile-team/wl-skills-kit update
247
257
 
248
258
  # 环境预检(Node / 工具链 / MCP 配置 / manifest)
249
- npx @agile-team/wl-skills-kit check
259
+ pnpm dlx @agile-team/wl-skills-kit check
250
260
 
251
261
  # 对比已安装文件与当前 kit 版本差异
252
- npx @agile-team/wl-skills-kit diff
262
+ pnpm dlx @agile-team/wl-skills-kit diff
253
263
 
254
264
  # 静态检查 src/views 页面文件完整性 + AGGrid/cid/skills-ui/mock
255
- npx @agile-team/wl-skills-kit validate
265
+ pnpm dlx @agile-team/wl-skills-kit validate
256
266
 
257
267
  # 单页/指定目录校验
258
- npx @agile-team/wl-skills-kit validate-page src/views/mdata/model/mdata-model-config
268
+ pnpm dlx @agile-team/wl-skills-kit validate-page src/views/mdata/model/mdata-model-config
269
+
270
+ # spec-align:页面目录存在 page-spec.json 时,确定性比对"约定 vs 代码"
271
+ # (查询字段/表格列顺序、工具栏按钮顺序与颜色、操作列严格对应、label 保真)
272
+ # 已内置于 validate,无需额外参数
273
+
274
+ # 确定性机械修复(缺 render-type、::v-deep→:deep、行尾空白等,幂等安全)
275
+ pnpm dlx @agile-team/wl-skills-kit fix
276
+ pnpm dlx @agile-team/wl-skills-kit fix --dry-run
259
277
 
260
278
  # 检查 wk-skills-ui 是否真正接入
261
- npx @agile-team/wl-skills-kit doctor-ui
279
+ pnpm dlx @agile-team/wl-skills-kit doctor-ui
262
280
 
263
281
  # 导出菜单/字典/权限基线为 xlsx
264
- npx @agile-team/wl-skills-kit export
282
+ pnpm dlx @agile-team/wl-skills-kit export
265
283
 
266
284
  # 构建前清理(保留 src/components + src/types)
267
- npx @agile-team/wl-skills-kit clean
285
+ pnpm dlx @agile-team/wl-skills-kit clean
268
286
 
269
287
  # 清理但保留 reports/(菜单/字典/权限累积数据)
270
- npx @agile-team/wl-skills-kit clean --keep-reports
288
+ pnpm dlx @agile-team/wl-skills-kit clean --keep-reports
271
289
 
272
290
  # 清理指定业务域的 mock 文件(保留 _utils.ts)
273
- npx @agile-team/wl-skills-kit mock-clean --domain mdata
291
+ pnpm dlx @agile-team/wl-skills-kit mock-clean --domain mdata
274
292
 
275
293
  # 清理全部 mock(保留 _utils.ts)
276
- npx @agile-team/wl-skills-kit mock-clean --all
294
+ pnpm dlx @agile-team/wl-skills-kit mock-clean --all
277
295
 
278
296
  # 任何命令都可加 --dry-run 预览
279
- npx @agile-team/wl-skills-kit update --dry-run
297
+ pnpm dlx @agile-team/wl-skills-kit update --dry-run
280
298
  ```
281
299
 
282
300
  > 全局安装后也可直接用 `wl-skills` 命令(如 `wl-skills update`)。
@@ -313,7 +331,7 @@ npx @agile-team/wl-skills-kit update --dry-run
313
331
 
314
332
  ```bash
315
333
  # 执行增量更新即可
316
- npx @agile-team/wl-skills-kit update
334
+ pnpm dlx @agile-team/wl-skills-kit update
317
335
  ```
318
336
 
319
337
  `update` 命令会自动完成:
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.11.0
4
+ * wl-skills-kit CLI v2.11.1
5
5
  *
6
6
  * 命令:
7
7
  * init 全量安装(默认,向后兼容)
@@ -29,6 +29,12 @@ const {
29
29
  hasAstAvailable,
30
30
  } = require("../lib/ast-rules");
31
31
 
32
+ // ─── page-spec 比对引擎(v2.11.1+,"约定 vs 代码"确定性核对)────────────
33
+ const { alignPage } = require("../lib/page-spec");
34
+
35
+ // ─── 安全修复引擎(v2.11.1+,确定性机械修复 F1~F5)────────────────────────
36
+ const { runSafeFix } = require("../lib/safe-fix");
37
+
32
38
  const FILES_DIR = path.resolve(__dirname, "..", "files");
33
39
  const TARGET_DIR = process.cwd();
34
40
  const MANIFEST_NAME = ".wl-skills-manifest.json";
@@ -48,6 +54,7 @@ const KNOWN_COMMANDS = new Set([
48
54
  "doctor-ui",
49
55
  "export",
50
56
  "mock-clean",
57
+ "fix",
51
58
  ]);
52
59
  const KNOWN_FLAGS = new Set([
53
60
  "--dry-run",
@@ -102,7 +109,7 @@ if (showHelp) {
102
109
  wl-skills-kit v${PKG.version} — AI Skill 模板包
103
110
 
104
111
  用法:
105
- npx @agile-team/wl-skills-kit [命令] [选项]
112
+ pnpm dlx @agile-team/wl-skills-kit [命令] [选项]
106
113
 
107
114
  命令:
108
115
  init 全量安装模板文件到当前项目(默认)
@@ -116,6 +123,7 @@ if (showHelp) {
116
123
  doctor-ui 检查 @agile-team/wk-skills-ui 接入完整性
117
124
  export 导出 reports/SYS_* 数据为 xlsx
118
125
  mock-clean 清理 mock 文件(按域或全部),保留 _utils.ts
126
+ fix 确定性机械修复(agGrid/:deep/未用 import 等),AI 无关
119
127
 
120
128
  选项:
121
129
  --dry-run 预览模式,不实际写入/删除任何文件
@@ -128,21 +136,21 @@ if (showHelp) {
128
136
  --help 显示帮助
129
137
 
130
138
  示例:
131
- npx @agile-team/wl-skills-kit 安装全量文件
132
- npx @agile-team/wl-skills-kit update 仅更新有变化的文件
133
- npx @agile-team/wl-skills-kit update --force 强制更新(忽略同版本检测)
134
- npx @agile-team/wl-skills-kit check 检查本地环境
135
- npx @agile-team/wl-skills-kit diff 查看当前项目与最新 kit 差异
136
- npx @agile-team/wl-skills-kit validate 检查 src/views 页面文件
137
- npx @agile-team/wl-skills-kit validate-page src/views/mdata/model/demo
138
- npx @agile-team/wl-skills-kit doctor-ui 检查 wk-skills-ui 接入
139
- npx @agile-team/wl-skills-kit export 导出菜单/字典/权限 xlsx
140
- npx @agile-team/wl-skills-kit clean 清理开发期文件
141
- npx @agile-team/wl-skills-kit clean --keep-reports 保留 reports/中的菜单/字典数据
142
- npx @agile-team/wl-skills-kit clean --dry-run 预览将要清理哪些文件
143
- npx @agile-team/wl-skills-kit mock-clean --domain mdata 清理 mdata 域 mock
144
- npx @agile-team/wl-skills-kit mock-clean --all 清理全部 mock
145
- npx @agile-team/wl-skills-kit mock-clean --all --dry-run 预览将要清理的 mock 文件
139
+ pnpm dlx @agile-team/wl-skills-kit 安装全量文件
140
+ pnpm dlx @agile-team/wl-skills-kit update 仅更新有变化的文件
141
+ pnpm dlx @agile-team/wl-skills-kit update --force 强制更新(忽略同版本检测)
142
+ pnpm dlx @agile-team/wl-skills-kit check 检查本地环境
143
+ pnpm dlx @agile-team/wl-skills-kit diff 查看当前项目与最新 kit 差异
144
+ pnpm dlx @agile-team/wl-skills-kit validate 检查 src/views 页面文件
145
+ pnpm dlx @agile-team/wl-skills-kit validate-page src/views/mdata/model/demo
146
+ pnpm dlx @agile-team/wl-skills-kit doctor-ui 检查 wk-skills-ui 接入
147
+ pnpm dlx @agile-team/wl-skills-kit export 导出菜单/字典/权限 xlsx
148
+ pnpm dlx @agile-team/wl-skills-kit clean 清理开发期文件
149
+ pnpm dlx @agile-team/wl-skills-kit clean --keep-reports 保留 reports/中的菜单/字典数据
150
+ pnpm dlx @agile-team/wl-skills-kit clean --dry-run 预览将要清理哪些文件
151
+ pnpm dlx @agile-team/wl-skills-kit mock-clean --domain mdata 清理 mdata 域 mock
152
+ pnpm dlx @agile-team/wl-skills-kit mock-clean --all 清理全部 mock
153
+ pnpm dlx @agile-team/wl-skills-kit mock-clean --all --dry-run 预览将要清理的 mock 文件
146
154
 
147
155
  保护路径(init / update 不覆盖已存在的):
148
156
  .wl-skills/reports/ AI 生成报告(团队累积数据,存在则跳过)
@@ -297,7 +305,7 @@ const LEGACY_DIR_PREFIXES = [
297
305
 
298
306
  const AUTO_HEADER_NOTE =
299
307
  "<!-- 由 @agile-team/wl-skills-kit 自动生成。薄壳入口 → .wl-skills/copilot-instructions-full.md -->\n" +
300
- "<!-- 请勿手动编辑本文件,更新时重新执行:npx @agile-team/wl-skills-kit@latest update -->\n\n";
308
+ "<!-- 请勿手动编辑本文件,更新时重新执行:pnpm dlx @agile-team/wl-skills-kit@latest update -->\n\n";
301
309
 
302
310
  function getEditorConfigs(raw) {
303
311
  // v2.11+: _compat 目录已迁移到 .wl-skills/skills/_compat/
@@ -375,7 +383,7 @@ function runInstall(incremental) {
375
383
  if (oldManifest.version === PKG.version) {
376
384
  console.log(" ✔ 当前项目已安装 v" + PKG.version + ",无需重复操作");
377
385
  console.log(
378
- " 如需强制重装:npx @agile-team/wl-skills-kit@latest " +
386
+ " 如需强制重装:pnpm dlx @agile-team/wl-skills-kit@latest " +
379
387
  label +
380
388
  " --force",
381
389
  );
@@ -604,7 +612,7 @@ function runInstall(incremental) {
604
612
  );
605
613
  }
606
614
  console.log(
607
- " ℹ 规范插件:建议执行 npx @robot-admin/git-standards init 接入代码质量与提交规范。",
615
+ " ℹ 规范插件:建议执行 pnpm dlx @robot-admin/git-standards init 接入代码质量与提交规范。",
608
616
  );
609
617
  console.log("");
610
618
 
@@ -622,7 +630,7 @@ function runInstall(incremental) {
622
630
  * 3. 如果存在且已含但格式过旧 → 刷新为最新格式
623
631
  * 4. 如果存在且格式最新 → 跳过
624
632
  *
625
- * hook 使用 npx 动态解析,避免硬编码 node_modules 路径在 pnpm 下失效。
633
+ * hook 使用包管理器动态解析,避免硬编码 node_modules 路径在 pnpm 下失效。
626
634
  * 包含存在性守卫:kit 未安装时优雅跳过,不阻断提交。
627
635
  */
628
636
  function ensurePreCommitHook(targetDir) {
@@ -737,7 +745,7 @@ function runClean() {
737
745
  const manifest = readManifest();
738
746
  if (!manifest) {
739
747
  console.log(" ⚠ 未找到 " + MANIFEST_NAME);
740
- console.log(" 请先执行 npx @agile-team/wl-skills-kit init 安装一次。");
748
+ console.log(" 请先执行 pnpm dlx @agile-team/wl-skills-kit init 安装一次。");
741
749
  console.log("");
742
750
  process.exit(1);
743
751
  }
@@ -1253,8 +1261,24 @@ function runValidate() {
1253
1261
  // 合并 AST 结果(降级和正常都 push)
1254
1262
  issues.push(...astResult.issues);
1255
1263
 
1264
+ // ── page-spec 比对(v2.11.1+,"约定 vs 代码"确定性核对 S1~S5)───────
1265
+ // 页面目录存在 page-spec.json 时,比对 data.ts 实际实现与原型约定真值。
1266
+ // 无 page-spec.json 的页面静默跳过,不影响其他检查。
1267
+ let specAlignedPages = 0;
1268
+ for (const page of pages) {
1269
+ const absDir = path.join(TARGET_DIR, page.dir);
1270
+ const { issues: specIssues, hasSpec } = alignPage(absDir, page.dir);
1271
+ if (hasSpec) specAlignedPages++;
1272
+ issues.push(...specIssues);
1273
+ }
1274
+
1256
1275
  // ── 输出 ───────────────────────────────────────────────────────────
1257
- console.log(" 页面目录: " + pages.length + (astResult.pages ? "(AST 扫描 " + astResult.pages + ")" : ""));
1276
+ console.log(
1277
+ " 页面目录: " +
1278
+ pages.length +
1279
+ (astResult.pages ? "(AST 扫描 " + astResult.pages + ")" : "") +
1280
+ (specAlignedPages ? "(spec-align " + specAlignedPages + ")" : ""),
1281
+ );
1258
1282
  console.log(" 提示项: " + issues.length);
1259
1283
  console.log("");
1260
1284
  const errors = issues.filter((issue) => issue.level === "error").length;
@@ -1360,6 +1384,12 @@ const AST_FIX_SUGGESTIONS = {
1360
1384
  R10: { fix: '\u66ff\u6362\u539f\u751f el-* \u7ec4\u4ef6\u4e3a\u5e73\u53f0\u5c01\u88c5\uff08jh-select/jh-date/jh-pagination \u7b49\uff09', ref: 'standards/13-platform-components.md', auto: true },
1361
1385
  R11: { fix: '\u4ece data.ts \u4e2d\u79fb\u9664 Pinia Store import\uff0cStore \u5e94\u5728\u7ec4\u4ef6\u5c42\u4f7f\u7528', ref: 'standards/10-pinia.md', auto: true },
1362
1386
  R12: { fix: '\u5c06\u786c\u7f16\u7801 IP/URL \u79fb\u81f3 .env.* \u73af\u5883\u53d8\u91cf', ref: 'standards/07-config.md', auto: true },
1387
+ // S 系列:page-spec 约定 vs 代码确定性核对(v2.11.1+)
1388
+ S0: { fix: '\u4fee\u6b63 page-spec.json \u7ed3\u6784\uff08page/query/columns/toolbar/operations\uff09', ref: '.wl-skills/skills/core/page-codegen/SKILL.md', auto: false },
1389
+ S1: { fix: '\u8c03\u6574 queryDef() \u67e5\u8be2\u5b57\u6bb5\u987a\u5e8f\u4e0e page-spec.json query \u4e25\u683c\u4e00\u81f4', ref: '.wl-skills/skills/core/page-codegen/SKILL.md', auto: true },
1390
+ S2: { fix: '\u8c03\u6574 columnsDef() \u8868\u683c\u5217\u987a\u5e8f/\u96c6\u5408\u4e0e page-spec.json columns \u4e25\u683c\u4e00\u81f4', ref: '.wl-skills/skills/core/page-codegen/SKILL.md', auto: true },
1391
+ S3: { fix: '\u8c03\u6574 toolbarDef() \u6309\u94ae\u987a\u5e8f/\u989c\u8272\u4e0e page-spec.json toolbar \u4e25\u683c\u4e00\u81f4', ref: '.wl-skills/skills/core/page-codegen/SKILL.md', auto: true },
1392
+ S4: { fix: '\u64cd\u4f5c\u5217\u6309\u94ae\u4e0e page-spec.json operations \u4e25\u683c\u5bf9\u5e94\uff0c\u4e0d\u591a\u4e0d\u5c11', ref: '.wl-skills/skills/core/page-codegen/SKILL.md', auto: true },
1363
1393
  };
1364
1394
 
1365
1395
  function printFixSuggestions(blockingIssues) {
@@ -1595,13 +1625,18 @@ function parseMarkdownTable(content) {
1595
1625
  );
1596
1626
  }
1597
1627
 
1598
- function runExport() {
1628
+ async function runExport() {
1599
1629
  console.log("");
1600
1630
  console.log(" wl-skills-kit v" + PKG.version + " [export]");
1601
1631
  console.log(" 目标目录: " + TARGET_DIR);
1602
1632
  console.log("");
1603
1633
 
1604
- const reportDir = path.join(TARGET_DIR, ".github", "reports");
1634
+ const reportDir =
1635
+ [
1636
+ path.join(TARGET_DIR, ".wl-skills", "reports"),
1637
+ path.join(TARGET_DIR, ".github", "reports"),
1638
+ ].find((dir) => fs.existsSync(dir)) ||
1639
+ path.join(TARGET_DIR, ".wl-skills", "reports");
1605
1640
  const files = [
1606
1641
  ["菜单", "SYS_MENU_INFO.md"],
1607
1642
  ["字典", "SYS_DICT_INFO.md"],
@@ -1636,25 +1671,22 @@ function runExport() {
1636
1671
  console.log(" 将导出: " + outFile);
1637
1672
  console.log(" sheet 数: " + addedSheets);
1638
1673
  } else {
1639
- let XLSX;
1674
+ let writeXlsxFile;
1640
1675
  try {
1641
- XLSX = require("xlsx");
1676
+ writeXlsxFile = require("write-excel-file/node");
1642
1677
  } catch {
1643
1678
  console.error(
1644
- " ✖ 未找到 xlsx 依赖,请重新安装最新 @agile-team/wl-skills-kit",
1679
+ " ✖ 未找到 write-excel-file 依赖,请重新安装最新 @agile-team/wl-skills-kit",
1645
1680
  );
1646
1681
  process.exit(1);
1647
1682
  }
1648
- const wb = XLSX.utils.book_new();
1649
- for (const [sheetName, rows] of sheets) {
1650
- XLSX.utils.book_append_sheet(
1651
- wb,
1652
- XLSX.utils.aoa_to_sheet(rows),
1653
- sheetName,
1654
- );
1655
- }
1656
1683
  fs.mkdirSync(outDir, { recursive: true });
1657
- XLSX.writeFile(wb, outFile);
1684
+ await writeXlsxFile(
1685
+ sheets.map(([sheetName, rows]) => ({
1686
+ sheet: sheetName,
1687
+ data: rows,
1688
+ })),
1689
+ ).toFile(outFile);
1658
1690
  console.log(" ✔ 已导出: " + outFile);
1659
1691
  console.log(" sheet 数: " + addedSheets);
1660
1692
  }
@@ -1742,6 +1774,38 @@ function runMockClean() {
1742
1774
 
1743
1775
  // ─── 主路由 ─────────────────────────────────────────────────────────────
1744
1776
 
1777
+ // ─── 命令: fix(确定性机械修复)──────────────────────────────────────────
1778
+
1779
+ function runFix() {
1780
+ const scanPath =
1781
+ args.find((a) => !a.startsWith("-") && a !== command) || "src/views";
1782
+ console.log("");
1783
+ console.log(" wl-skills-kit v" + PKG.version + " [fix]" + (dryRun ? " [dry-run]" : ""));
1784
+ console.log(" 扫描目录: " + scanPath);
1785
+ console.log("");
1786
+
1787
+ const result = runSafeFix(TARGET_DIR, scanPath, { dryRun });
1788
+ if (result.files.length === 0) {
1789
+ console.log(" ✔ 未发现可自动修复的机械偏差");
1790
+ console.log("");
1791
+ return;
1792
+ }
1793
+ for (const f of result.files) {
1794
+ for (const change of f.changes) {
1795
+ console.log(" " + (dryRun ? "将修复" : "已修复") + " " + f.rel + " — " + change);
1796
+ }
1797
+ }
1798
+ console.log("");
1799
+ console.log(
1800
+ " " + (dryRun ? "预览" : "完成") + ":" + result.fixedCount + " 处机械修复,涉及 " + result.files.length + " 个文件",
1801
+ );
1802
+ if (!dryRun) {
1803
+ console.log("");
1804
+ console.log(" → 建议执行 wl-skills validate 复扫确认;语义级偏差仍需 AI 或人工处理");
1805
+ }
1806
+ console.log("");
1807
+ }
1808
+
1745
1809
  switch (command) {
1746
1810
  case "init":
1747
1811
  runInstall(false);
@@ -1766,11 +1830,17 @@ switch (command) {
1766
1830
  runDoctorUi();
1767
1831
  break;
1768
1832
  case "export":
1769
- runExport();
1833
+ runExport().catch((e) => {
1834
+ console.error(" ✖ 导出失败: " + (e && e.message ? e.message : e));
1835
+ process.exit(1);
1836
+ });
1770
1837
  break;
1771
1838
  case "mock-clean":
1772
1839
  runMockClean();
1773
1840
  break;
1841
+ case "fix":
1842
+ runFix();
1843
+ break;
1774
1844
  default:
1775
1845
  console.error(
1776
1846
  ' ✖ 未知命令: "' + command + '",请使用 --help 查看可用命令',
@@ -136,9 +136,9 @@ page-codegen 产出 SYS_* 报告
136
136
  ### 本地页面质量
137
137
 
138
138
  ```bash
139
- npx @agile-team/wl-skills-kit validate
140
- npx @agile-team/wl-skills-kit validate-page src/views/xxx/yyy
141
- npx @agile-team/wl-skills-kit doctor-ui
139
+ pnpm dlx @agile-team/wl-skills-kit validate
140
+ pnpm dlx @agile-team/wl-skills-kit validate-page src/views/xxx/yyy
141
+ pnpm dlx @agile-team/wl-skills-kit doctor-ui
142
142
  ```
143
143
 
144
144
  ### MCP 项目感知
@@ -132,9 +132,9 @@ prototype-scan
132
132
  ### Step 1:安装与环境预检
133
133
 
134
134
  ```bash
135
- npx @robot-admin/git-standards init
136
- npx @agile-team/wl-skills-kit@latest
137
- npx @agile-team/wl-skills-kit@latest check
135
+ pnpm dlx @robot-admin/git-standards init
136
+ pnpm dlx @agile-team/wl-skills-kit@latest
137
+ pnpm dlx @agile-team/wl-skills-kit@latest check
138
138
  ```
139
139
 
140
140
  检查点:
@@ -224,7 +224,7 @@ Agent 完成任一 Skill 后,必须输出:
224
224
  建议组合:
225
225
 
226
226
  ```bash
227
- npx @agile-team/wl-skills-kit@latest validate
227
+ pnpm dlx @agile-team/wl-skills-kit@latest validate
228
228
  ```
229
229
 
230
230
  MCP 验证: