@agile-team/wl-skills-kit 2.10.1 → 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 +51 -8
- package/README.md +47 -29
- package/bin/wl-skills.js +156 -53
- package/docs/agent-pipeline-runbook.md +3 -3
- package/docs//345/205/250/347/233/230/345/210/206/346/236/220/344/270/216/346/231/272/350/203/275/344/275/223/346/220/255/345/273/272/346/214/207/345/215/227.md +4 -4
- package/files/.github/copilot-instructions.md +23 -465
- package/files/.wl-skills/copilot-instructions-full.md +233 -0
- package/files/{docs → .wl-skills/docs}/jh-pagination.md +2 -2
- package/files/{docs → .wl-skills/docs}/page-query-hook-best-practices.md +3 -3
- package/files/.wl-skills/docs/page-spec-schema.md +109 -0
- package/files/{.github → .wl-skills}/guides/README.md +1 -1
- package/files/{.github → .wl-skills}/guides/architecture.md +5 -5
- package/files/{.github → .wl-skills}/guides/mcp-setup.md +1 -1
- package/files/{.github → .wl-skills}/guides/usage.md +8 -8
- package/files/{.github → .wl-skills}/reports/SYS_MENU_INFO.md +1 -1
- package/files/{.github → .wl-skills}/reports/SYS_PERMISSION_INFO.md +1 -1
- package/files/{.github → .wl-skills}/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +1 -1
- package/files/{.github → .wl-skills}/skills/_best-practices.md +5 -5
- package/files/{.github → .wl-skills}/skills/_compat/README.md +1 -1
- package/files/{.github → .wl-skills}/skills/_compat/editors.json +1 -1
- package/files/{.github → .wl-skills}/skills/_pipeline.md +9 -9
- package/files/{.github → .wl-skills}/skills/_registry.md +3 -3
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/SKILL.md +27 -27
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/USAGE.md +22 -22
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/templates/business-index.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/templates/business-open-questions.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/templates/module-dictionary.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/templates/module-field.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/templates/module-index.md +2 -2
- package/files/{.github → .wl-skills}/skills/core/business-doc-extract/templates/module-requirement.md +2 -2
- package/files/{.github → .wl-skills}/skills/core/convention-audit/SKILL.md +6 -6
- package/files/{.github → .wl-skills}/skills/core/convention-audit/USAGE.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/page-codegen/SKILL.md +20 -14
- package/files/{.github → .wl-skills}/skills/core/page-codegen/USAGE.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +7 -7
- package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +5 -5
- package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +2 -2
- package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/prototype-scan/SKILL.md +11 -11
- package/files/{.github → .wl-skills}/skills/core/prototype-scan/USAGE.md +3 -3
- package/files/{.github → .wl-skills}/skills/core/spec-doc-parse/SKILL.md +9 -9
- package/files/{.github → .wl-skills}/skills/core/spec-doc-parse/USAGE.md +6 -6
- package/files/{.github → .wl-skills}/skills/core/template-extract/SKILL.md +1 -1
- package/files/{.github → .wl-skills}/skills/core/template-extract/USAGE.md +1 -1
- package/files/{.github → .wl-skills}/skills/sync/_mcp-guardrail.md +3 -3
- package/files/{.github → .wl-skills}/skills/sync/dict-sync/SKILL.md +5 -5
- package/files/{.github → .wl-skills}/skills/sync/dict-sync/USAGE.md +2 -2
- package/files/{.github → .wl-skills}/skills/sync/menu-sync/SKILL.md +6 -6
- package/files/{.github → .wl-skills}/skills/sync/menu-sync/USAGE.md +3 -3
- package/files/{.github → .wl-skills}/skills/sync/menu-sync/env/guide.md +2 -2
- package/files/{.github → .wl-skills}/skills/sync/permission-sync/SKILL.md +3 -3
- package/files/{.github → .wl-skills}/skills/sync/permission-sync/USAGE.md +1 -1
- package/files/{src → .wl-skills/src}/components/local/c_formModal/README.md +1 -1
- package/files/{src → .wl-skills/src}/components/local/c_formSections/README.md +2 -2
- package/files/{src → .wl-skills/src}/components/remote/BaseForm/README.md +2 -2
- package/files/{src → .wl-skills/src}/components/remote/BaseQuery/README.md +4 -4
- package/files/{src → .wl-skills/src}/components/remote/BaseTable/README.md +2 -2
- package/files/{src → .wl-skills/src}/components/remote/BaseToolbar/README.md +1 -1
- package/files/{.github → .wl-skills}/standards/02-code-structure.md +1 -1
- package/files/{.github → .wl-skills}/standards/08-git.md +1 -1
- package/files/{.github → .wl-skills}/standards/11-form-validation.md +1 -1
- package/files/{.github → .wl-skills}/standards/13-platform-components.md +15 -15
- package/files/{.github → .wl-skills}/standards/14-layout-containers.md +9 -9
- package/files/{demo → .wl-skills/templates}/README.md +3 -3
- package/lib/page-spec.js +588 -0
- package/lib/safe-fix.js +115 -0
- package/lib/vite-plugin-wl-skills.js +97 -0
- package/mcp/config.js +3 -3
- package/mcp/tools/projectTools.js +10 -0
- package/package.json +16 -11
- package/files/src/components/global/C_Splitter/index.scss +0 -61
- package/files/src/components/global/C_Splitter/index.vue +0 -149
- /package/files/{docs → .wl-skills/docs}/jh-date-range.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-date.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-dept-picker.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-drag-row.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-file-upload.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-picker.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-select.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-text.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-textarea.md +0 -0
- /package/files/{docs → .wl-skills/docs}/jh-user-picker.md +0 -0
- /package/files/{docs → .wl-skills/docs}/mock-architecture.md +0 -0
- /package/files/{docs → .wl-skills/docs}/request.md +0 -0
- /package/files/{.github → .wl-skills}/reports/README.md +0 -0
- /package/files/{.github → .wl-skills}/reports/SYS_DICT_INFO.md +0 -0
- /package/files/{.github → .wl-skills}/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md" +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/agents.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/claude-code.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/cline.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/cursor-mdc.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/cursor-rules.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/github-copilot.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/kiro.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/qoder.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/trae.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/_compat/headers/windsurf.txt +0 -0
- /package/files/{.github → .wl-skills}/skills/core/api-contract/SKILL.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/api-contract/USAGE.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/_index.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/domains/sale/README.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-LIST.md +0 -0
- /package/files/{.github → .wl-skills}/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +0 -0
- /package/files/{.github → .wl-skills}/skills/domain/README.md +0 -0
- /package/files/{.github → .wl-skills}/skills/ops/code-fix/SKILL.md +0 -0
- /package/files/{.github → .wl-skills}/skills/ops/code-fix/USAGE.md +0 -0
- /package/files/{.github → .wl-skills}/skills/sync/env.local.json +0 -0
- /package/files/{.github → .wl-skills}/skills/sync/menu-sync/env/env.local.json +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_ParentView/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_RightToolbar/data.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_RightToolbar/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_RightToolbar/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_SvgIcon/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_SvgIcon/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_SvgIcon/svgicon.js +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_TagStatus/README.md +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_TagStatus/config.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_TagStatus/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_TagStatus/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_TagStatus/types.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_Tree/README.md +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_Tree/data.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_Tree/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_Tree/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/global/C_Tree/types.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_formModal/data.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_formModal/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_formModal/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_formSections/data.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_formSections/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_formSections/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_listModal/data.ts +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_listModal/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_listModal/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_spliterTitle/index.scss +0 -0
- /package/files/{src → .wl-skills/src}/components/local/c_spliterTitle/index.vue +0 -0
- /package/files/{src → .wl-skills/src}/components/remote/AGGrid/README.md +0 -0
- /package/files/{src → .wl-skills/src}/types/page.ts +0 -0
- /package/files/{.github → .wl-skills}/standards/01-toolchain.md +0 -0
- /package/files/{.github → .wl-skills}/standards/03-comments.md +0 -0
- /package/files/{.github → .wl-skills}/standards/04-coding-basics.md +0 -0
- /package/files/{.github → .wl-skills}/standards/05-logging.md +0 -0
- /package/files/{.github → .wl-skills}/standards/06-security.md +0 -0
- /package/files/{.github → .wl-skills}/standards/07-config.md +0 -0
- /package/files/{.github → .wl-skills}/standards/09-typescript.md +0 -0
- /package/files/{.github → .wl-skills}/standards/10-pinia.md +0 -0
- /package/files/{.github → .wl-skills}/standards/12-base-table.md +0 -0
- /package/files/{.github → .wl-skills}/standards/index.md +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add/api.md +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add-form/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add-form/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-add-form/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change-form/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change-form/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change-form/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change-history/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change-history/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-apply-change-history/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-archive/api.md +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-archive/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-archive/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-archive/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-detail/api.md +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-detail/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-detail/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-customer-detail/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-temp-customer-archive/api.md +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-temp-customer-archive/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-temp-customer-archive/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/produce/aiflow/mmwr-temp-customer-archive/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/add-demo/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/add-demo/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/add-demo/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/billet-flame-cut-plan/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/billet-flame-cut-plan/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/billet-flame-cut-plan/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/domestic-trade-order/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/domestic-trade-order/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/domestic-trade-order/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/heat-batch-return/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/heat-batch-return/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/heat-batch-return/index.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/heat-batch-return/meltDialog.vue +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/metallurgical-spec/data.ts +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/metallurgical-spec/index.scss +0 -0
- /package/files/{demo → .wl-skills/templates}/sale/demo/metallurgical-spec/index.vue +0 -0
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.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
|
-
|
|
112
|
+
pnpm dlx @agile-team/wl-skills-kit [命令] [选项]
|
|
106
113
|
|
|
107
114
|
命令:
|
|
108
115
|
init 全量安装模板文件到当前项目(默认)
|
|
@@ -116,10 +123,11 @@ 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 预览模式,不实际写入/删除任何文件
|
|
122
|
-
--keep-reports clean 命令保留 .
|
|
130
|
+
--keep-reports clean 命令保留 .wl-skills/reports/(默认一起删除)
|
|
123
131
|
--force 强制执行,跳过同版本检测(忽略已安装状态)
|
|
124
132
|
--domain <name> mock-clean 指定要清理的业务域(如 sale、mdata)
|
|
125
133
|
--all mock-clean 清理全部 mock(保留 _utils.ts)
|
|
@@ -128,24 +136,24 @@ if (showHelp) {
|
|
|
128
136
|
--help 显示帮助
|
|
129
137
|
|
|
130
138
|
示例:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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 生成报告(团队累积数据,存在则跳过)
|
|
149
157
|
|
|
150
158
|
清理保护路径(clean 不删除):
|
|
151
159
|
src/components/ 通用组件(被业务页面 import,构建必需)
|
|
@@ -246,20 +254,20 @@ function writeManifest(data) {
|
|
|
246
254
|
}
|
|
247
255
|
|
|
248
256
|
// 受保护路径(clean 不删除)
|
|
249
|
-
const PROTECTED_PREFIXES = ["src/components/", "src/types/"];
|
|
257
|
+
const PROTECTED_PREFIXES = ["src/components/", "src/types/", ".wl-skills/src/components/", ".wl-skills/src/types/"];
|
|
250
258
|
function isProtected(relPath) {
|
|
251
259
|
return PROTECTED_PREFIXES.some((p) => relPath.startsWith(p));
|
|
252
260
|
}
|
|
253
261
|
|
|
254
262
|
// reports/ 中的 AI 生成报告:init/update 遇到已存在不覆盖(团队累积数据)
|
|
255
263
|
function isReportFile(relPath) {
|
|
256
|
-
return relPath.startsWith(".github/reports/") && relPath.endsWith(".md");
|
|
264
|
+
return (relPath.startsWith(".wl-skills/reports/") || relPath.startsWith(".github/reports/")) && relPath.endsWith(".md");
|
|
257
265
|
}
|
|
258
266
|
|
|
259
267
|
// ─── 旧版遗留路径(v1.x/v2.0 → v2.1 迁移清理)───────────────────────────
|
|
260
268
|
// update 时自动检测并移除,避免旧结构与新结构并存产生歧义。
|
|
261
269
|
const LEGACY_PATHS = [
|
|
262
|
-
// Skill
|
|
270
|
+
// v2.1: Skill 目录重组 flat → core/sync/ops
|
|
263
271
|
".github/skills/prototype-scan/SKILL.md",
|
|
264
272
|
".github/skills/api-contract/SKILL.md",
|
|
265
273
|
".github/skills/page-codegen/SKILL.md",
|
|
@@ -275,34 +283,42 @@ const LEGACY_PATHS = [
|
|
|
275
283
|
".github/skills/menu-sync/SKILL.md",
|
|
276
284
|
".github/skills/menu-sync/env/env.local.json",
|
|
277
285
|
".github/skills/menu-sync/env/guide.md",
|
|
278
|
-
".github/skills/convention-extract/SKILL.md",
|
|
279
|
-
// docs/ 废弃文件:内容已迁移至 guides/ 或 reports/(v2.0)
|
|
286
|
+
".github/skills/convention-extract/SKILL.md",
|
|
280
287
|
".github/docs/menu-sync-design.md",
|
|
281
288
|
".github/docs/use-skill.md",
|
|
282
289
|
".github/docs/wl-skills-kit.md",
|
|
283
|
-
".github/docs/SYS_MENU_INFO.md",
|
|
284
|
-
// _compat/ 旧说明文件(v2.0 → v2.1 重构为可执行配置层)
|
|
290
|
+
".github/docs/SYS_MENU_INFO.md",
|
|
285
291
|
".github/skills/_compat/ai-model-matrix.md",
|
|
286
292
|
".github/skills/_compat/editor-setup.md",
|
|
287
293
|
];
|
|
288
294
|
|
|
295
|
+
// ─── v2.11 迁移:.github/ → .wl-skills/ 目录重构 ────────────────────────────
|
|
296
|
+
// update 时自动检测旧目录结构并清理
|
|
297
|
+
const LEGACY_DIR_PREFIXES = [
|
|
298
|
+
".github/skills/",
|
|
299
|
+
".github/standards/",
|
|
300
|
+
".github/guides/",
|
|
301
|
+
".github/reports/",
|
|
302
|
+
];
|
|
303
|
+
|
|
289
304
|
// ─── 编辑器配置生成(从 _compat/editors.json 读取,特化 frontmatter 注入)─────
|
|
290
305
|
|
|
291
306
|
const AUTO_HEADER_NOTE =
|
|
292
|
-
"<!-- 由 @agile-team/wl-skills-kit
|
|
293
|
-
"<!-- 请勿手动编辑本文件,更新时重新执行:
|
|
307
|
+
"<!-- 由 @agile-team/wl-skills-kit 自动生成。薄壳入口 → .wl-skills/copilot-instructions-full.md -->\n" +
|
|
308
|
+
"<!-- 请勿手动编辑本文件,更新时重新执行:pnpm dlx @agile-team/wl-skills-kit@latest update -->\n\n";
|
|
294
309
|
|
|
295
310
|
function getEditorConfigs(raw) {
|
|
311
|
+
// v2.11+: _compat 目录已迁移到 .wl-skills/skills/_compat/
|
|
296
312
|
const editorsJsonPath = path.join(
|
|
297
313
|
FILES_DIR,
|
|
298
|
-
".
|
|
314
|
+
".wl-skills",
|
|
299
315
|
"skills",
|
|
300
316
|
"_compat",
|
|
301
317
|
"editors.json",
|
|
302
318
|
);
|
|
303
319
|
const headersDir = path.join(
|
|
304
320
|
FILES_DIR,
|
|
305
|
-
".
|
|
321
|
+
".wl-skills",
|
|
306
322
|
"skills",
|
|
307
323
|
"_compat",
|
|
308
324
|
"headers",
|
|
@@ -367,7 +383,7 @@ function runInstall(incremental) {
|
|
|
367
383
|
if (oldManifest.version === PKG.version) {
|
|
368
384
|
console.log(" ✔ 当前项目已安装 v" + PKG.version + ",无需重复操作");
|
|
369
385
|
console.log(
|
|
370
|
-
" 如需强制重装:
|
|
386
|
+
" 如需强制重装:pnpm dlx @agile-team/wl-skills-kit@latest " +
|
|
371
387
|
label +
|
|
372
388
|
" --force",
|
|
373
389
|
);
|
|
@@ -477,6 +493,8 @@ function runInstall(incremental) {
|
|
|
477
493
|
if (incremental) {
|
|
478
494
|
let migrated = 0;
|
|
479
495
|
if (dryRun) console.log("\n [Step 3] 旧版遗留文件检查(迁移清理):\n");
|
|
496
|
+
|
|
497
|
+
// v2.1 旧版单文件清理
|
|
480
498
|
for (const legacyRel of LEGACY_PATHS) {
|
|
481
499
|
const legacyFull = path.join(TARGET_DIR, legacyRel);
|
|
482
500
|
if (fs.existsSync(legacyFull)) {
|
|
@@ -488,6 +506,28 @@ function runInstall(incremental) {
|
|
|
488
506
|
migrated++;
|
|
489
507
|
}
|
|
490
508
|
}
|
|
509
|
+
|
|
510
|
+
// v2.11 目录重构迁移:.github/skills|standards|guides|reports/ → .wl-skills/
|
|
511
|
+
for (const prefix of LEGACY_DIR_PREFIXES) {
|
|
512
|
+
const legacyDir = path.join(TARGET_DIR, prefix);
|
|
513
|
+
if (fs.existsSync(legacyDir)) {
|
|
514
|
+
const legacyFiles = walkDir(legacyDir, legacyDir);
|
|
515
|
+
for (const f of legacyFiles) {
|
|
516
|
+
const legacyFile = path.join(legacyDir, f);
|
|
517
|
+
if (dryRun) {
|
|
518
|
+
console.log(" 迁移清理 " + prefix + f + " (v2.11 目录重构)");
|
|
519
|
+
} else {
|
|
520
|
+
removeFileAndEmptyParents(legacyFile);
|
|
521
|
+
}
|
|
522
|
+
migrated++;
|
|
523
|
+
}
|
|
524
|
+
// 删除空目录
|
|
525
|
+
if (!dryRun && fs.existsSync(legacyDir)) {
|
|
526
|
+
try { fs.rmSync(legacyDir, { recursive: true, force: true }); } catch {}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
491
531
|
if (!dryRun && migrated > 0) {
|
|
492
532
|
console.log(
|
|
493
533
|
" 迁移: " +
|
|
@@ -572,7 +612,7 @@ function runInstall(incremental) {
|
|
|
572
612
|
);
|
|
573
613
|
}
|
|
574
614
|
console.log(
|
|
575
|
-
" ℹ 规范插件:建议执行
|
|
615
|
+
" ℹ 规范插件:建议执行 pnpm dlx @robot-admin/git-standards init 接入代码质量与提交规范。",
|
|
576
616
|
);
|
|
577
617
|
console.log("");
|
|
578
618
|
|
|
@@ -590,7 +630,7 @@ function runInstall(incremental) {
|
|
|
590
630
|
* 3. 如果存在且已含但格式过旧 → 刷新为最新格式
|
|
591
631
|
* 4. 如果存在且格式最新 → 跳过
|
|
592
632
|
*
|
|
593
|
-
* hook
|
|
633
|
+
* hook 使用包管理器动态解析,避免硬编码 node_modules 路径在 pnpm 下失效。
|
|
594
634
|
* 包含存在性守卫:kit 未安装时优雅跳过,不阻断提交。
|
|
595
635
|
*/
|
|
596
636
|
function ensurePreCommitHook(targetDir) {
|
|
@@ -705,7 +745,7 @@ function runClean() {
|
|
|
705
745
|
const manifest = readManifest();
|
|
706
746
|
if (!manifest) {
|
|
707
747
|
console.log(" ⚠ 未找到 " + MANIFEST_NAME);
|
|
708
|
-
console.log(" 请先执行
|
|
748
|
+
console.log(" 请先执行 pnpm dlx @agile-team/wl-skills-kit init 安装一次。");
|
|
709
749
|
console.log("");
|
|
710
750
|
process.exit(1);
|
|
711
751
|
}
|
|
@@ -713,12 +753,12 @@ function runClean() {
|
|
|
713
753
|
const allFiles = Object.keys(manifest.files);
|
|
714
754
|
const toRemove = allFiles.filter((f) => {
|
|
715
755
|
if (isProtected(f)) return false;
|
|
716
|
-
if (keepReports && f.startsWith(".github/reports/")) return false;
|
|
756
|
+
if (keepReports && (f.startsWith(".wl-skills/reports/") || f.startsWith(".github/reports/"))) return false;
|
|
717
757
|
return true;
|
|
718
758
|
});
|
|
719
759
|
const toKeep = allFiles.filter((f) => {
|
|
720
760
|
if (isProtected(f)) return true;
|
|
721
|
-
if (keepReports && f.startsWith(".github/reports/")) return true;
|
|
761
|
+
if (keepReports && (f.startsWith(".wl-skills/reports/") || f.startsWith(".github/reports/"))) return true;
|
|
722
762
|
return false;
|
|
723
763
|
});
|
|
724
764
|
|
|
@@ -754,7 +794,7 @@ function runClean() {
|
|
|
754
794
|
console.log(
|
|
755
795
|
" 保留: " +
|
|
756
796
|
toKeep.length +
|
|
757
|
-
" 个文件(src/components/ + src/types/ + .
|
|
797
|
+
" 个文件(src/components/ + src/types/ + .wl-skills/reports/)",
|
|
758
798
|
);
|
|
759
799
|
} else {
|
|
760
800
|
console.log(
|
|
@@ -773,6 +813,7 @@ function expectedManifestFiles() {
|
|
|
773
813
|
for (const relPath of files) {
|
|
774
814
|
expected[relPath] = fileMd5(path.join(FILES_DIR, relPath));
|
|
775
815
|
}
|
|
816
|
+
// v2.11+: copilot-instructions.md 是薄壳入口,完整地图在 .wl-skills/
|
|
776
817
|
const instructionsSrc = path.join(
|
|
777
818
|
FILES_DIR,
|
|
778
819
|
".github",
|
|
@@ -1220,8 +1261,24 @@ function runValidate() {
|
|
|
1220
1261
|
// 合并 AST 结果(降级和正常都 push)
|
|
1221
1262
|
issues.push(...astResult.issues);
|
|
1222
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
|
+
|
|
1223
1275
|
// ── 输出 ───────────────────────────────────────────────────────────
|
|
1224
|
-
console.log(
|
|
1276
|
+
console.log(
|
|
1277
|
+
" 页面目录: " +
|
|
1278
|
+
pages.length +
|
|
1279
|
+
(astResult.pages ? "(AST 扫描 " + astResult.pages + ")" : "") +
|
|
1280
|
+
(specAlignedPages ? "(spec-align " + specAlignedPages + ")" : ""),
|
|
1281
|
+
);
|
|
1225
1282
|
console.log(" 提示项: " + issues.length);
|
|
1226
1283
|
console.log("");
|
|
1227
1284
|
const errors = issues.filter((issue) => issue.level === "error").length;
|
|
@@ -1327,6 +1384,12 @@ const AST_FIX_SUGGESTIONS = {
|
|
|
1327
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 },
|
|
1328
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 },
|
|
1329
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 },
|
|
1330
1393
|
};
|
|
1331
1394
|
|
|
1332
1395
|
function printFixSuggestions(blockingIssues) {
|
|
@@ -1562,13 +1625,18 @@ function parseMarkdownTable(content) {
|
|
|
1562
1625
|
);
|
|
1563
1626
|
}
|
|
1564
1627
|
|
|
1565
|
-
function runExport() {
|
|
1628
|
+
async function runExport() {
|
|
1566
1629
|
console.log("");
|
|
1567
1630
|
console.log(" wl-skills-kit v" + PKG.version + " [export]");
|
|
1568
1631
|
console.log(" 目标目录: " + TARGET_DIR);
|
|
1569
1632
|
console.log("");
|
|
1570
1633
|
|
|
1571
|
-
const reportDir =
|
|
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");
|
|
1572
1640
|
const files = [
|
|
1573
1641
|
["菜单", "SYS_MENU_INFO.md"],
|
|
1574
1642
|
["字典", "SYS_DICT_INFO.md"],
|
|
@@ -1603,25 +1671,22 @@ function runExport() {
|
|
|
1603
1671
|
console.log(" 将导出: " + outFile);
|
|
1604
1672
|
console.log(" sheet 数: " + addedSheets);
|
|
1605
1673
|
} else {
|
|
1606
|
-
let
|
|
1674
|
+
let writeXlsxFile;
|
|
1607
1675
|
try {
|
|
1608
|
-
|
|
1676
|
+
writeXlsxFile = require("write-excel-file/node");
|
|
1609
1677
|
} catch {
|
|
1610
1678
|
console.error(
|
|
1611
|
-
" ✖ 未找到
|
|
1679
|
+
" ✖ 未找到 write-excel-file 依赖,请重新安装最新 @agile-team/wl-skills-kit",
|
|
1612
1680
|
);
|
|
1613
1681
|
process.exit(1);
|
|
1614
1682
|
}
|
|
1615
|
-
const wb = XLSX.utils.book_new();
|
|
1616
|
-
for (const [sheetName, rows] of sheets) {
|
|
1617
|
-
XLSX.utils.book_append_sheet(
|
|
1618
|
-
wb,
|
|
1619
|
-
XLSX.utils.aoa_to_sheet(rows),
|
|
1620
|
-
sheetName,
|
|
1621
|
-
);
|
|
1622
|
-
}
|
|
1623
1683
|
fs.mkdirSync(outDir, { recursive: true });
|
|
1624
|
-
|
|
1684
|
+
await writeXlsxFile(
|
|
1685
|
+
sheets.map(([sheetName, rows]) => ({
|
|
1686
|
+
sheet: sheetName,
|
|
1687
|
+
data: rows,
|
|
1688
|
+
})),
|
|
1689
|
+
).toFile(outFile);
|
|
1625
1690
|
console.log(" ✔ 已导出: " + outFile);
|
|
1626
1691
|
console.log(" sheet 数: " + addedSheets);
|
|
1627
1692
|
}
|
|
@@ -1709,6 +1774,38 @@ function runMockClean() {
|
|
|
1709
1774
|
|
|
1710
1775
|
// ─── 主路由 ─────────────────────────────────────────────────────────────
|
|
1711
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
|
+
|
|
1712
1809
|
switch (command) {
|
|
1713
1810
|
case "init":
|
|
1714
1811
|
runInstall(false);
|
|
@@ -1733,11 +1830,17 @@ switch (command) {
|
|
|
1733
1830
|
runDoctorUi();
|
|
1734
1831
|
break;
|
|
1735
1832
|
case "export":
|
|
1736
|
-
runExport()
|
|
1833
|
+
runExport().catch((e) => {
|
|
1834
|
+
console.error(" ✖ 导出失败: " + (e && e.message ? e.message : e));
|
|
1835
|
+
process.exit(1);
|
|
1836
|
+
});
|
|
1737
1837
|
break;
|
|
1738
1838
|
case "mock-clean":
|
|
1739
1839
|
runMockClean();
|
|
1740
1840
|
break;
|
|
1841
|
+
case "fix":
|
|
1842
|
+
runFix();
|
|
1843
|
+
break;
|
|
1741
1844
|
default:
|
|
1742
1845
|
console.error(
|
|
1743
1846
|
' ✖ 未知命令: "' + command + '",请使用 --help 查看可用命令',
|
|
@@ -136,9 +136,9 @@ page-codegen 产出 SYS_* 报告
|
|
|
136
136
|
### 本地页面质量
|
|
137
137
|
|
|
138
138
|
```bash
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
227
|
+
pnpm dlx @agile-team/wl-skills-kit@latest validate
|
|
228
228
|
```
|
|
229
229
|
|
|
230
230
|
MCP 验证:
|