wxa-skills-generate 用于从小程序源码生成符合 wx.modelContext 规范的技能分包(skills/)。整体流程为:分析源码 → 识别业务 → 提取接口与 JSAPI → 设计原子接口 → 生成代码 → 集成配置 → 交棒校验。
一、用途与职责边界 本 skill 负责源码分析、原子接口设计、按需使用 automator 获取真实响应、代码生成、app.json / project.config.json 集成,并在生成过程内做自检(字段来源自检、鉴权自检、代码一致性自检)。它不负责对生成产物的独立校验(静态规则校验 V001~V021、真机 execute 跑通、组件渲染核对),这些由 wxa-skills-validate 负责。交付物为 skills/{skill-name}/(含 mcp.json、SKILL.md、index.js、原子接口实现文件、工具模块;组件目录仅生成组件时才有)+ 配置文件更新 + .ai-mode-skills/ 分析产物两份。
二、分析产物 分析结果落盘两份,按读取频率拆分:analysis-auth.md(阶段 1.2 产出,鉴权事实 + 逐字代码片段,写一次读多次)与 analysis-apis.md(阶段 3 产出,逐接口规格 + probe 结果摘要,逐接口追加)。probe/plan.json 与 probe/<run-id>.json 由 subagent 脚本管理,不属于分析产物。
三、依赖 需要可读的源码目录(仅给 appid / URL / 截图会触发阻断)。开发者工具方面需要微信开发者工具 + scripts/probe.mjs(miniprogram-automator 装在 skill 的 scripts/,不装源项目),仅在阶段 3.7 的两种触发条件命中时才使用。
四、术语约定 原子接口:对外暴露给小程序 AI 的可调用能力,约定路径 skills/{skill}/apis/{name}.js(validator 也兼容 tools/services/ / tools/)。原子组件:用于渲染原子接口返回数据的 GUI 卡片。压缩代码:单行超 500 字符、变量名单字符的产物(含混淆)。probe:阶段 3.7 的运行时探测,用 automator 连接开发者工具 WS 端口(9420),在源项目上触发请求、捕获真实响应,产物落盘 .ai-mode-skills/probe/。
五、参考资料索引 包括 ANALYSIS_PATTERNS.md(业务流程识别、接口/JSAPI 搜索模式)、JSAPI_WHITELIST.md(wx API 白名单完整清单)、CODE_TEMPLATES.md(代码与配置模板)、COMPONENT_TEMPLATES.md(原子组件模板)、ATOMIC_COMPONENT_DESIGN.md(组件设计规范)、ATOMIC_COMPONENT_CSS.md(组件 WXSS 实现规范)、STYLE_MIGRATION.md(源样式提取 + 字段映射工作流)、HALF_SCREEN.md(半屏页 API 与禁用清单)、RUNTIME_PROBE.md(probe 触发场景、plan/result 格式、执行命令)、AUTH_MIGRATION.md(analysis-auth.md 填写指引、鉴权复刻、ensureXxx、§6 自检)、SUBAGENT_PROTOCOL.md(大项目 subagent 派发协议)。各文件有对应的加载时机与不加载条件。
六、硬性约束 A. 独立分包禁止项:禁止 getApp()、require 引用主包/兄弟分包、依赖主包 wx.cloud.init()、依赖主包 app.js 初始化 storage、从 getApp().globalData 读配置、依赖主包登录态、使用主包注册的全局组件,均需改写为分包内自行管理。 B. 直接终止生成的阻断规则:依赖小程序插件、用户声明的能力在源码中找不到对应接口或页面、未提供可读源码目录、所有候选实现都依赖非白名单 JSAPI 且无替代方案、app.json 缺 "lazyCodeLoading": "requiredComponents" 配置、响应结构无法从源码消费点确定且 probe 不可用。 C. 代码一致性:迁移即忠实搬移,不增不减;封装层强制复用,utils/request.js 是网络请求唯一入口,所有 apis/*.js 必须通过它发请求。禁止添加源码中不存在的逻辑,禁止丢弃源码中存在的逻辑,鉴权参数完整保留,依赖完整内联,响应字段类型安全。 D. wx API 白名单:分接口侧白名单与组件侧白名单,每次生成必须对照。接口侧高频项包括小程序 AI(wx.modelContext.registerAPI 等)、登录、网络、云开发、位置、系统、数据缓存、上传下载、订阅消息、授权设置、图片、手机号、账号、隐私授权等。组件侧白名单见 references/JSAPI_WHITELIST.md §2。组件配置方面,默认不生成原子组件,仅当用户明确要求时才生成;relatedPage 必填;permissions.scope.dynamic 按需声明。组件过期态声明按需非强制。半屏页面按需默认不生成。handoff 接力页是进小程序的主要方式。不可迁移 JSAPI 接口与组件均禁用。button 的 open-type 需改写。判定规则按 references/JSAPI_WHITELIST.md §4 三条执行。 E. 原子组件约束:数据通道禁止 properties / observer / dataSource,必须通过 NotificationType.Result 取 structuredContent;WXML 表达式限制,{{ }} 中不支持数组下标、函数调用、模板字符串等复杂 JS。
七、执行清单 阶段 0 业务需求澄清(强制前置):判定用户场景是否明确,不明确则最小扫描 + 引导澄清 + 等待确认;确认是否生成原子组件;产出目标业务场景 + 期望原子能力清单。 阶段 1 项目扫描:首检 lazyCodeLoading;提取 app.json / app.js / project.config.json 关键字段;产出云开发 / 插件 / storage 初始化清单;落盘 analysis-auth.md;大项目先产能力索引坐标。 阶段 2 业务功能识别(用户已明确时跳过):产出结构化功能清单 JSON 并二次确认。 阶段 3 接口与 JSAPI 提取 + 可行性校验:逐接口分析,追加到 analysis-apis.md;按需 probe。 阶段 4 原子接口设计:原子接口清单、API 依赖图、storage key 清单。 阶段 5 代码生成:进小程序的接口配 _meta.ui.pagePath + 返回值顶层 handoff;utils/request.js 按规范生成并自检;每写完一个 apis/<name>.js 做字段来源自检;生成组件时走前置与模板;skills/{skill-name}/ 目录完整。 阶段 6 配置集成:app.json 加 agent.skills + subPackages;project.config.json 的 packOptions.include 加 skills;按需 AGENTS.md + agent.instruction、page-meta.json + agent.pageMetadata;体积与数量上限自查。 收尾:交棒给 wxa-skills-validate,提示 skills 路径与 project-path。
八、跨阶段跳转与增量重入 正常主干为 0 → 1 → (2) → 3 → 4 → 5 → 6 → 交棒。用户已明确能力可跳过阶段 2。probe 环境不可用则静态结果照常使用,代码标 [ai-mode:static]。validator 反馈 T1~T6 / A/B/C/D 类错误回阶段 5 改代码,T7/T8 回阶段 4 重设计。任一阶段触发阻断规则 B 立即终止。工作区已存在 skills/ 产物时,按用户意图选择入口阶段,重入时已生成且未触及的文件保持不变。
九、阶段 0 业务需求澄清 判定规则:必须同时满足指明具体业务名词、可推断至少 2-3 个原子能力的粒度两项才算明确。不明确时做最小扫描(只读 app.json 的 tabBar.list、pages 一级路径、subPackages.root),归纳 3~6 个候选场景,向用户一次问完问题,等用户回复后才能进入阶段 1。
十、阶段 1 项目扫描 按规模分流:小项目(页面 ≤ ~30、无多分包)主 agent 直接 read/grep;大项目按 SUBAGENT_PROTOCOL.md 执行。1.1 配置扫描读 app.json / app.js / project.config.json,lazyCodeLoading 必检。1.2 鉴权逻辑扫描落盘 analysis-auth.md。1.3 主包 storage 初始化扫描必做。1.4 压缩代码处理:优先问用户要未压缩源码,否则尝试 prettier 格式化,格式化后关键字段仍全是 a.b.c.d 则阻断。1.5 插件检测。
十一、阶段 2 业务功能识别 分析页面用途、交互事件、数据流向,从用户视角识别功能点,分析数据依赖。mcp.json 只注册用户直接使用的原子能力:鉴权/登录类、系统级/生命周期接口、内部辅助接口、工具函数、敏感接口(不可逆副作用)、管理端接口均不收集为原子能力。判定标准是问自己用户会对小程序 AI 说“帮我做 X”吗。敏感接口默认不收集。