wxa-skills-polish
对 wxa-skills-generate 生成的小程序 AI SKILL 初稿进行标准化二轮优化。用户手动调用,修复接口描述、Schema、组件绑定、API 返回值和组件 UI,补充官方最佳实践。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
对 wxa-skills-generate 生成的小程序 AI SKILL 初稿进行标准化二轮优化。用户手动调用,修复接口描述、Schema、组件绑定、API 返回值和组件 UI,补充官方最佳实践。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | wxa-skills-polish |
| description | 对 wxa-skills-generate 生成的小程序 AI SKILL 初稿进行标准化二轮优化。用户手动调用,修复接口描述、Schema、组件绑定、API 返回值和组件 UI,补充官方最佳实践。 |
在 wxa-skills-generate 生成小程序 AI SKILL 的第一版初稿后,执行标准化的第二轮优化,使 SKILL 达到可发布状态。
用户手动调用。当用户明确表达以下意图时触发:
按顺序执行以下修复。每项修复针对 <miniprogramRoot>/skills/{skillName}/ 下的特定文件(<miniprogramRoot> 为小程序源码根目录,以 project.config.json 中的 miniprogramRoot 为准,未配置时通常为项目根目录或 miniprogram)。
目标文件:app.json、page-meta.json
subPackages 的 root 为 "skills"(不能是 "skills/xxx" 或项目根目录)。skills/ 目录应位于小程序源码根目录(<miniprogramRoot>)下,以 project.config.json 中的 miniprogramRoot 配置为准。"independent": true。app.json 开启 "lazyCodeLoading": "requiredComponents"。app.json 中 agent.skills 正确配置每个 SKILL 的 name、description、path。app.json 中 agent.pageMetadata 指向 page-meta.json。page-meta.json 声明了 SKILL 涉及的所有页面(首页、列表、详情、编辑等)。格式如下:
{
"pages": [
{
"path": "pages/home/home",
"name": "首页名称",
"description": "页面功能描述"
}
]
}
pages 为对象数组,每个对象必须包含 path(页面路径)、name(页面名称)、description(页面功能描述)。3.16.1 或更高。app.json 中 "darkmode": true。核心原则:不同信息源在 AI 决策时的注意力权重不同,写在错误的位置会显著降低准确率。
| 信息源 | 注意力权重 | 说明 |
|---|---|---|
原子接口返回的 content | ★★★★★ | 离当前决策点最近,模型会把它当作"事实 + 动作"读取(参见 https://developers.weixin.qq.com/miniprogram/dev/ai/best-practices.html)。这里出现错误话术,会让模型偏离 SKILL.md 的约定。 |
原子接口声明(mcp.json)里的 description | ★★★★ | 影响模型"选不选这个接口",写得模糊时模型容易选错。 |
原子接口声明(mcp.json)里的 inputSchema.description | ★★★★ | 影响模型"怎么填参数",是字段级约束的核心位置,比写在 SKILL.md 长文里更有效。 |
SKILL.md | ★★★ | 适合写业务流程编排、跨接口规则、意图分流、通用规范。 |
内容分工:
| 信息源 | 写什么 |
|---|---|
原子接口返回的 content | 本次调用结果与下一步动作 |
原子接口声明里的 description | 接口本身的功能、调用时机、不适用场景 |
原子接口声明里的 inputSchema.description | 参数语义、取值来源、缺省处理 |
SKILL.md | 业务流程编排、跨接口规则、意图分流、通用规范 |
常见错位(必须避免):
SKILL.md:长文膨胀、与 mcp.json 易不一致。SKILL.md 中的接口清单只写"前置条件 + 上下游关系"。description:仅在调用该接口时生效,其他接口决策时模型读不到。应写在 SKILL.md。content:content 只承载本次调用结果与下一步动作,功能描述属于 description。通用写作原则:
目标文件:mcp.json
对 apis 数组中的每个接口对象:
searchDrinks 优于 search。drinkId,不要混用 itemId。入参字段选取:优先传 ID 而非自然语言,例如门店传 storeId 而非省市街道,饮品传 drinkId 而非饮品名称、类目。模型不必再从自然语言中反复提取和匹配,参数歧义更少,推理也更快、更稳。
普通字段 description:举例时给多个不同样本(避免被当默认值),并配明确的缺省处理。单一举例容易被模型当作"标准答案"。
// 反例:只举一个例子,且未说明缺省处理
"keyword": { "description": "饮品关键词,如『拿铁』" }
// 推荐:多样化举例 + 缺省处理
"keyword": {
"description": "饮品关键词,例如『拿铁』『美式』『奶茶』。用户未说出具体饮品时,不要填写本字段,应改走饮品推荐接口。"
}
ID 类字段 description:声明取值来源接口。业务 ID 容易被按格式凑出,需在 description 中显式声明来源。
// 反例
"drinkId": { "description": "饮品 ID" }
// 推荐
"drinkId": {
"description": "饮品唯一标识,取自上游接口 searchDrinks 或 getRecommendedDrinks 返回的 drinkId 原值。不要从用户自然语言(如『那个拿铁』)推断,也不要使用示例值。上下文无可用 drinkId 时,应先调 searchDrinks。"
}
目标文件:apis/*.js
每个 API handler 必须返回如下结构的对象:
return {
content: [
{ type: 'text', text: '当前客观状态陈述...' },
{ type: 'text', text: '下一步引导...' }
],
structuredContent: { /* 供原子组件渲染的结构化数据 */ },
_meta: { /* 渲染需要但 AI 无需理解的数据 */ },
isError: false
}
输入校验
小程序 AI 生成的参数不保证正确,原子接口需校验类型与有效性(如 drinkId 是否存在)。
返回内容
structuredContent 与 content 都会提供给小程序 AI:前者承载结构化数据(卡片展示内容),后者承载结果说明与决策约束,两者避免重复。_meta 传递。错误处理
参数非法时,返回 isError: true,content 说明缺失/错误的字段及正确填法:
// 推荐:参数校验示例
if (!args.drinkId || typeof args.drinkId !== 'string') {
return {
content: [
{ type: 'text', text: '调用失败:缺少必填参数 drinkId,或 drinkId 类型不正确。' },
{ type: 'text', text: '请通过 searchDrinks 或 getRecommendedDrinks 获取有效的 drinkId 后,再调用本接口。' }
],
isError: true
}
}
content 应先陈述本次返回的客观状态,再给出下一步动作。仅有动作没有事实时,模型可能把"展示卡片"理解为"准备调下一步接口"而跳过等待用户确认。
// 反例:仅给动作,缺少事实
"接下来请务必为用户展示订单确认卡片。"
// 推荐:事实 + 动作
"已根据所选规格生成订单。请展示订单确认卡片,并用一句话引导用户核对后下单。"
当接口执行失败、返回空结果或参数不合法时,content 同样遵循"事实 + 动作"两段式,但在动作段中需明确包含下一步出口以及不应做的动作。
// 反例:信息不足,模型会盲目重试
return {
content: [{ type: 'text', text: '搜索失败,请重试。' }],
isError: true
}
// 推荐:事实 + 动作两段式
return {
content: [
{ type: 'text', text: '搜索饮品失败:当前门店(storeId=xxx)未营业,无法提供饮品列表。' },
{ type: 'text', text: '请引导用户更换门店,或切换到"无需门店"的推荐模式。禁止在相同门店下重复调用 searchDrinks,结果不会改变。' }
],
isError: true
}
目标文件:apis/*.js、index.js
检查 API 文件的导出方式:
// 方式 A:导出函数本身(官方推荐)
module.exports = function handler(args) { ... }
// 方式 B:导出对象(wxa-skills-generate 常见生成方式)
module.exports = { handlerName: function(args) { ... } }
module.exports = function),则 index.js 使用直接导入:
const handlerName = require('./apis/handlerName.js')
module.exports = { handlerName }),则 index.js 必须使用解构导入:
const { handlerName } = require('./apis/handlerName.js')
关键:确保 skill.registerAPI('name', handler) 注册的是函数本身,而不是对象。
目标文件:SKILL.md
按官方最佳实践,SKILL.md 应包含以下章节:
目标文件:components/*/index.js
path,不是 page:
viewCtx.setRelatedPage({ path: 'pages/index/index', query: 'foo=bar' })
path 设为小程序首页。query 跳转到详情页。relatedPage 应在 mcp.json 的 components 数组中配置,组件内动态设置仅用于覆盖默认行为。目标文件:components/*/index.js
当用户在组件内触发操作(如点击按钮、选择选项)需要调用下一个原子接口时,使用 sendFollowUpMessage:
wx.modelContext.getContext(this).sendFollowUpMessage({
content: [
{ type: 'text', text: '用户操作描述' },
{ type: 'api/call', data: { name: 'nextApiName', arguments: { /* 参数 */ } } }
]
})
确保 api/call 中的 name 与 mcp.json 中注册的接口名称一致。
目标文件:apis/*.js、components/*/index.js
上行消息文案指 content 中 type: 'text' 的内容,以及 sendFollowUpMessage 中的 text 内容。文案质量直接影响 AI 会话的流畅度和用户体验。
| 原则 | 说明 | 示例 |
|---|---|---|
| 用户视角出发 | 消息需站在用户视角表述,可使用第一人称,一般不建议使用其他人称 | 参见官方文档 |
| 不可上行系统消息 | 即使是用户操作导致的异常系统消息,也不可以上行,需要转换成用户操作 | 参见官方文档 |
| 自然语言表达 | 用自然语言表达,摒弃字段罗列、编码等技术性描述格式 | 参见官方文档 |
| 使用生活化语言 | 表意准确基础上,优先选用生活化口语,规避专业性过强的术语 | 参见官方文档 |
| 仅限用户已明确表达的信息 | 信息仅限用户当前操作可推导内容,不可擅自补充用户未说明的偏好或诉求 | 参见官方文档 |
| 描述当前操作 | 描述聚焦当下操作,不能描述其他环节或提前预判未来操作 | 参见官方文档 |
| 信息充分但不过载 | 只保留能推动当前对话或有助于模型理解的必备信息,次要信息可以不说明 | 参见官方文档 |
| 简洁但不歧义 | 精简文案长度的同时保证表意清晰,尤其多选择场景下规避这个、那个等指代模糊的用词 | 参见官方文档 |
| 处理敏感信息 | 身份证号、手机号等隐私信息禁止明文展示,必要时脱敏模糊表述 | 参见官方文档 |
| 其他通用性文案规范 | 无错别字,无病句,正确断句,正确使用空格、标点符号等 | 参见官方文档 |
目标文件:components/*/{index.wxml,index.wxss,index.js}
button 默认 padding/margin,显式设置 height、line-height、padding: 0、margin: 0、border: none。bindtap,禁止出现无事件绑定的"死"按钮。transform: rotate()、calc() 和复杂渐变,这些经常无法渲染。mcp.json 的 components[] 中声明 expirable: true 和 expiredText(如 expiredText: "该优惠已过期")。目标文件:AGENTS.md(如适用)
如果小程序有多个 SKILL 或需要全局行为引导,可在项目根目录创建 AGENTS.md:
app.json 的 agent 字段中通过 instruction 指定路径。inputSchema 根级是否有 description)。sendFollowUpMessage 并调用后续接口。所有修复完成后,向用户提供修改摘要,列出本次二轮优化涉及的具体文件和关键改动点。SKILL 即可进入第二轮测试。
面试前公司背调。快速梳理目标公司的业务/产品、融资与规模、组织与文化、面试特点、薪资区间与避坑点,帮助用户有的放矢地准备。触发词:公司背调、了解公司、面试前了解XX、这家公司怎么样、XX公司评价、去XX公司面试、公司靠谱吗、XX公司薪资。
面试全流程总控教练(编排层)。按"投递前→面试前→面试后"生命周期,把用户路由到正确的专项 Skill,并保证环节间衔接成闭环。触发词:面试辅导、准备面试、帮我面试、面试全流程、求职辅导、面试陪练、面试怎么准备、从零开始准备面试、求职规划。
生成预测面试题库、答题话术策略、打磨自我介绍。触发词:面试会问什么、准备面试题、面试话术、怎么回答离职原因、自我介绍、STAR、面试重点、面试前准备什么、行为题、压力面。
复盘真实面试表现、生成高质量反向提问清单。触发词:面试复盘、面得怎么样、面试后复盘、面试官可能怎么看、我该问什么、反向提问、面试后问什么、面试后该做什么。
多角色模拟面试官,实战对练并给评分与改进。触发词:模拟面试、面试陪练、帮我练面试、mock interview、模拟技术面、模拟HR面、来一场模拟面试、压力面试。
Offer 薪资拆解、谈判话术、多 Offer 决策、投递进度管理。触发词:谈薪、薪资谈判、offer对比、多个offer怎么选、怎么谈工资、入职前注意、投递进度、面试进度管理、总包、期权。