wechat-miniprogram/ai-mode-skills/wxa-skills-validate
- community
Checking that the SKILL.md file is still in the repository.
校验和修复小程序 AI SKILLs 产物。在以下场景触发:对 skills/ 目录做静态校验、跑通原子接口、验证原子组件渲染、修复校验报错、输出交付文档。依托微信开发者工具进行真机验证。
Install
npx vskill@latest install wechat-miniprogram/ai-mode-skills/wxa-skills-validateSKILL.md
wxa-skills-validate
对小程序 AI SKILLs 产物执行"静态校验 → 原子接口执行 → 原子组件渲染 → 交付文档"的闭环校验,并在每一步失败时按错误类型分类就地修复 skill 源文件。
依赖
- Node.js ≥ 18(
scripts/*.mjs用到node:crypto/ 原生fetch) - 微信开发者工具(Nightly Electron Build 最新版)已安装,CLI 可执行:
<DEVTOOLS_APP_PATH>/Contents/MacOS/cli -h(macOS 默认<DEVTOOLS_APP_PATH>=/Applications/wechatwebdevtools.app) - 开发者工具的服务端口必须开启:手动打开工具 → 设置 → 安全设置 → 打开「服务端口」。未开启时 CLI 连不上,execute / render 全部失败
- 调试基础库 ≥ 3.16.2;项目 AppID 已在「微信公众平台 - 基础功能 - AI 能力」申请通过「开发模式」
- 项目
project.config.json含appid;app.json含agent.skills;每个 skill 目录含mcp.json+SKILL.md
运行过程中开发者工具可能弹授权窗,需手动授权;未授权会导致原子接口执行失败。
触发条件
出现下列任一情况时启动本技能:
- 显式要求对 skills 目录做 "校验 / 跑通 / 渲染 / 出交付文档" 中任一项
- 已有 skills 产物(无论来源)需要进入验证阶段
- 跑出 skills 的校验报错需要修复
必需信息
| 项 | 说明 | 缺失时动作 | |
|---|---|---|---|
<project-path> | 小程序项目根目录(含 project.config.json + app.json;app.json 的 agent.skills[].path 指向 skill 分包) | 向用户询问 | |
<DEVTOOLS_APP_PATH> | 微信开发者工具应用路径 | macOS 默认 /Applications/wechatwebdevtools.app,用户可覆盖 | |
<AUTO_PORT> | auto WebSocket 端口 | 默认 9420 |
注:<skills-path>已不再作为入参,脚本自动从app.json发现分包。
参考资料(按需加载)
进入"步骤 4:真机闭环"时必须先读 references/CLI_AGENT_REFERENCE.md,内含脚本用法、产物结构、读产物后的下一步动作、5 项核对对照表、失败回溯流程。
| 文件 | 用途 | 加载时机 | |
|---|---|---|---|
references/CLI_AGENT_REFERENCE.md | CLI agent 命令参考 | 步骤 4 执行前 | |
references/VALIDATE_RULES.md | validate.mjs 内置的 V001~V021 规则详解 | 出现校验报错需定位 id 时 | |
references/DELIVERY_TEMPLATE.md | DELIVERY.md 交付模板 | 最终交付时 |
验收目标(不可降级)
<project-path>下app.json发现的每个 skill 分包,其mcp.json声明的所有原子接口必须跑通 execute(status === "ok"且invokeResult.isError !== true)。例外:敏感接口不真实执行——命中敏感关键词的接口由 V019 落盘cli-agent-run/destructive-manifest.json,execute.mjs 读该 manifest 拦截(--confirm-destructive放行)——只做静态校验,验收时视为「已跳过执行」而非未通过,需在报告标注skipped_destructive。- 所有带
_meta.ui.componentPath的原子接口,必须跑通 render 且通过 5 项核对(见references/CLI_AGENT_REFERENCE.md第 2.3 节)。 - 单接口连续修复 3 轮仍不通过才允许挂起。不得跳过任何一项(敏感接口的执行跳过除外)。
- 静态/编译通过 ≠ 验收通过:须真机 execute + render 5 项核对;execute 未跑成时不得判通过、不产出
DELIVERY.md(见「不可修复类」与「终止条件 4」)。
执行清单(复制后勾选,逐项完成)
工作目录
在 <project-path> 同级建 ./cli-agent-run/ 统一存放产物:
同一接口重跑时必须复用 --output(文件会被覆盖);不同接口必须用不同文件名。
阶段 1 — 静态校验 + 编译校验(合并为一次运行)
运行:
入参只需要一个——小程序项目根目录(含 project.config.json + app.json)。脚本自动:
- 读
app.json的agent.skills[].path发现 skill 分包(没配置时回退到顶层metaServicePkg/或skills/) - 静态规则只在 skill 分包目录内 执行,不触及主包代码
- 把校验产物目录
cli-agent-run/写入project.config.json的packOptions.ignore(打包忽略)和watchOptions.ignore(监听忽略),避免开发者工具持续监听产物变更触发循环编译(已存在不会重复追加;产物落盘前完成同步,结果挂在报告ignoreSync字段) - 静态校验通过(
errors === 0)后自动调用cli preview做编译校验;有 error 则跳过 preview - 报告落盘到
<project>/cli-agent-run/validate-report.json(可用--output覆盖)
可选参数:--rules <自定义规则 json> / --cli-path <CLI 路径> / --build-timeout <ms> / --output <path>。
退出码:0 通过;1 存在 error 或 build 失败;2 运行异常。
通过判据:
summary.errors === 0(warning 允许带着进入阶段 2)summary.buildStatus === "pass"(静态 0 error 后会自动触发 build;"skipped"意味着静态未过,先按修复决策表修复)- Build 行
stage=compile + FAIL说明有语法/编译错,必须修复
Build 编译报错时:优先检查集成配置,再动源码。对照 wxa-skills-generate SKILL.md 的"阶段 6 — 配置集成"与 references/CODE_TEMPLATES.md 的"六、app.json + project.config.json 配置"核对 app.json(agent.skills / subPackages)与 project.config.json(appid / packOptions.include)。集成无误后才按日志改源码,禁止用注释/删除源码的方式绕过集成问题。
CLI 未找到时的处理:若输出 Build: SKIPPED - 跳过:未找到微信开发者工具 CLI,说明脚本未能自动定位到 cli。自动探测顺序为:--cli-path > 环境变量 WECHAT_DEVTOOLS_CLI / WXA_CLI > macOS /Applications/wechatwebdevtools.app/Contents/MacOS/cli > 同路径的用户目录变体 > Windows C:\Program Files (x86)\Tencent\微信web开发者工具\cli.bat。此时应主动向用户询问微信开发者工具的安装路径,然后:
- 重跑:
node validate.mjs <project-path> --cli-path <用户提供的绝对 cli 路径> - 或建议用户设置环境变量:
export WECHAT_DEVTOOLS_CLI=<绝对路径>后重跑
CLI 缺失不影响静态规则的输出,只会让 build 阶段被 skip。
执行顺序(脚本内部闭环):
- 同步
project.config.json的packOptions.ignore+watchOptions.ignore(追加cli-agent-run/) - 发现 skill 分包 → 只在分包内跑 V001~V021
- 有 error → build=
skipped(节省 preview 成本);0 error → 调cli preview - 到达
upload阶段视为编译通过;即便上传失败(服务端校验、网络等),也不标记 build 失败
失败时的修复决策表(读完 validate-report.json 中 results[].id / message / fix 后匹配):
| 错误类型 | 识别特征 | 修复范围 | 动作 | |
|---|---|---|---|---|
| T1 命名拼写 | 字段大小写/拼写错 | 单文件单行 | 直接改 | |
| T2 Schema 不一致 | structuredContent 与 outputSchema.properties 字段不匹配(V009) | apis/{name}.js + mcp.json | 对齐字段 | |
| T3 组件绑定不一致 | WXML {{}} 与 setData 字段对不上(V011) | components/{x}/index.{js,wxml} | 对齐绑定 | |
| T4 组件取值路径错 | result.structuredContent.xxx 与接口返回字段不符(V010) | components/{x}/index.js | 修访问路径 | |
| T5 合规性违规 | 非白名单 WXML 标签 / 事件 / 图片格式 / CSS 属性(V003/V005/V006) | 单文件改写 | 用白名单实现替换:collapsible-view 是允许的;transition / animation / overflow / -webkit-line-clamp 一律删除(改 -wx-line-clamp);非 tap 事件删除 | |
| T6 注册缺失 | mcp.json 的 name 在 index.js 未 registerAPI,或反之(V007/V008) | index.js | 补/删注册 | |
| T7 依赖链路问题 | storage key 写入方/读取方对不上 | 跨接口 + utils/util.js | 跨文件调整 | |
| T8 原子接口粒度错 | 接口职责重叠 | mcp.json + index.js + apis/*.js | 拆分/合并 apis[] | |
| T-mcp-size | mcp.json 去除 outputSchema 后超过 24000 字符(V013;后台也会拒绝) | mcp.json 的 description/title/inputSchema;或重划 skill 分包 | 压缩描述文字;接口多到难以精简时按职责拆分为多个 skill 分包,不要把示例/枚举硬塞进 outputSchema | |
| T-auth 鉴权缺失 | 401 / unauthorized / token 无效 等(静态阶段通常由 V007/V008 连带触发) | utils/util.js / apis/{name}.js | 读主包还原登录流程 | |
| T-wx-jsapi 非白名单 | 运行时 wx.<xxx> is not a function / wx.<ns> 为 undefined | apis/{name}.js / components/{x}/index.js | 对照 wxa-skills-generate SKILL.md D.1/D.2 白名单(完整清单见 wxa-skills-generate/references/JSAPI_WHITELIST.md),按 D.7 替换或改网络请求;无替代标 T9(详见阶段 4 C 类) | |
| T-build 编译失败 | Build 行显示 FAIL 且 stage=compile | 项目集成 / .js / .wxml / .wxss | 先对照 wxa-skills-generate SKILL.md 阶段 6 "配置集成" 核对 app.json / project.config.json,集成无误后再按日志修源码 | |
| T-skill-description | app.json 的 agent.skills[].description 缺失或为空(V016) | app.json | 在该条目中补充非空的 description 字段 | |
| T-handoff | 接力页 _meta.ui.pagePath 格式错/页面不存在/带 query,或声明了 pagePath 却未返回 handoff(V017) | mcp.json + apis/{name}.js | pagePath 以 / 开头、不含 query、页面真实存在;返回值顶层补 handoff: { query, payload? }(详见 wxa-skills-generate SKILL.md D.6) | |
| T-handoff-query | handoff.query 的参数名与接力页 onLoad 读取的参数名不匹配(V018) | apis/{name}.js | 读接力页 <pagePath>.js 的 onLoad(param) 确认其读取的 param.xxx 名称,将 handoff.query 的参数名改为页面实际读取的名称 | |
| T-destructive | 接口命中敏感关键词,V019 待模型判断(V019,destructive:null) | cli-agent-run/destructive-manifest.json | 编辑 manifest 填 destructive=true+destructiveReason(真敏感)或 false+destructiveReason(误判如只读查询) | |
| T-relatedPage | 组件未在 components[] 声明,或 relatedPage 缺失 / 缺前导 / / 页面不存在(V015) | mcp.json + components/{x}/index.js | 在 components[] 补 { path, relatedPage }(path 与接口 _meta.ui.componentPath 严格相等,relatedPage 以 / 开头且页面真实存在,无对应业务页时填首页);运行时在收到 Result 后调 setRelatedPage({ query }) | |
| T-limits | SKILL.md / AGENTS.md / page-meta.json 超字节上限,或 SKILL 数超 30(V020) | 对应文件 / app.json | 精简内容(SKILL.md 只留 5 节结构,接口契约回 mcp.json);SKILL 过多时合并职责相近的 | |
| T-dynamic | 静态原子组件或其相对 JavaScript 依赖里用了 wx.login / wx.checkSession / wx.request / setTimeout / setInterval,或任意组件代码路径用了云开发(V021) | <componentPath>.js、其相对 JavaScript 依赖或 mcp.json | 静态组件确有实时需求才在 components[] 该条目加 permissions["scope.dynamic"];云开发一律移到原子接口并经 NotificationType.Result 下发数据 | |
| T9 能力无法实现 | 所有候选都违反硬约束 | — | ⛔ 终止,告知用户 |
V001~V021 规则详情见 references/VALIDATE_RULES.md。
判别口诀:文件内能改完 → T1~T6;需改 storage 清单或接口划分 → T7/T8;连修复方案都违规 → T9。
迭代规则:
| 情况 | 动作 | |
|---|---|---|
summary.errors === 0 | ✅ 进入阶段 2 | |
| errors 数较上一轮减少 | 继续修复,重跑 | |
| 连续 3 轮相同 finding id | 升级为 T7/T8 跨文件调整 | |
| 累计 5 轮仍未通过 | ⛔ 终止,请求人工介入 |
阶段 2 — 准备 CLI agent 命令
确认 CLI 可执行:
失败则告知用户 "确认微信开发者工具已安装" 后停止,不要强行绕过。
(推荐)先 open 预热再 auto(约 10s,大项目可延长),减少 websocket 超时:
跳过此步时脚本会自动拉起 auto;遇超时或 agent compile mode is disabled 时按「不可修复类 / 工具不稳定」处理。
阶段 3 — 构建执行计划
读取 <project-path> 下 app.json 发现的每个 skill 分包的 mcp.json(validate-report.json 中的 skillDirs 字段给出了具体分包路径):
- 敏感接口初筛+模型判断(V019,execute 前必做):阶段 1 静态校验的 V019 脚本初筛所有 mcp.json,把 name/description 命中敏感关键词的接口写入
cli-agent-run/destructive-manifest.json(destructive:null待判断),报 error 阻断 build。模型逐个判断后编辑 manifest 填destructive:true(真敏感,execute 跳过)或false(误判,execute 放行)+destructiveReason,重跑 validate 至 V019 pass。execute.mjs 读 manifest:true拦截 /false放行 /null拦截(待判断)/ 不在 manifest 放行。生成侧阶段 2 已规定敏感接口默认不收集;V019 是兜底,catch 漏网的敏感接口名。 - 汇总
apis[]的name/description/inputSchema/outputSchema/_meta.ui.componentPath。 - 按入参依赖排序(拓扑序):
- 无参接口(
inputSchema.properties为空或无required)→ 最先执行 - 有参接口 → 排在其参数来源接口之后
description或inputSchema含 "需要先调用 X" 类表述时,将 X 前置
- 维护"已知数据池":每个接口成功后把
structuredContent存入池中,供下游参数引用。 - 有参接口的参数填充优先级:先查已知数据池(上游接口
structuredContent的同义字段),池中没有才考虑用户指定或默认值——禁止在有数据池可用时直接用默认值测试有参接口。
阶段 4 — execute 与 render
术语澄清:execute 是校验阶段名(本阶段),用 CLI agent tool 调用 skills 分包的注册接口;不要与 probe 混淆——probe 是 generate 阶段 3.7 用 automator 在源项目上抓请求响应。两者工具不同(CLI agent vs automator)、对象不同(skills 分包 vs 源项目)、阶段不同(校验 vs 生成)。
execute 和 render 是两个独立可重入的命令:
execute调用原子接口,产出业务数据(invokeResult.structuredContent)。render通过--from-execute把 execute 的invokeResult.structuredContent作为渲染数据源喂给组件;
也可以 --name + --args 独立指定。CLI 内部每次 render 会自动生成一次性 toolCallId / sessionId, 不依赖 execute 的运行时上下文。
执行灵活度:
- 可以一次 execute 所有原子接口、再统一批量 render
- 也可以"单接口 execute → render"交替进行
- render 的数据来源优先级:
--args显式指定 >--from-execute读到的invokeResult.structuredContent
硬约束(仅保留真正必要的):
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingwxa-skills-validate/SKILL.md
Popularity
- Repository stars
- 206
- Repository forks
- 11
- 7-day trend score
- 27
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/wechat-miniprogram/ai-mode-skills/wxa-skills-validate)