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 المهني
面试前公司背调。快速梳理目标公司的业务/产品、融资与规模、组织与文化、面试特点、薪资区间与避坑点,帮助用户有的放矢地准备。触发词:公司背调、了解公司、面试前了解XX、这家公司怎么样、XX公司评价、去XX公司面试、公司靠谱吗、XX公司薪资。
面试全流程总控教练(编排层)。按"投递前→面试前→面试后"生命周期,把用户路由到正确的专项 Skill,并保证环节间衔接成闭环。触发词:面试辅导、准备面试、帮我面试、面试全流程、求职辅导、面试陪练、面试怎么准备、从零开始准备面试、求职规划。
生成预测面试题库、答题话术策略、打磨自我介绍。触发词:面试会问什么、准备面试题、面试话术、怎么回答离职原因、自我介绍、STAR、面试重点、面试前准备什么、行为题、压力面。
复盘真实面试表现、生成高质量反向提问清单。触发词:面试复盘、面得怎么样、面试后复盘、面试官可能怎么看、我该问什么、反向提问、面试后问什么、面试后该做什么。
多角色模拟面试官,实战对练并给评分与改进。触发词:模拟面试、面试陪练、帮我练面试、mock interview、模拟技术面、模拟HR面、来一场模拟面试、压力面试。
Offer 薪资拆解、谈判话术、多 Offer 决策、投递进度管理。触发词:谈薪、薪资谈判、offer对比、多个offer怎么选、怎么谈工资、入职前注意、投递进度、面试进度管理、总包、期权。
| 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 即可进入第二轮测试。