架构转变:从代运营多客户模式改为开源单用户模式。 - 去掉 clients/ 目录,style.yaml/history.yaml 扁平化到 skill root - Step 1 简化(不再提取客户名,直接读 style.yaml) - 新增 Step 0 环境检查(config/依赖/API 配置,降级标记传递到后续 Step) - Onboard 改为首次设置流程(交互式问答 + 支持"用默认的直接写") - 3 个脚本去掉 --client 参数,路径扁平化 - 修复 10 项 workflow 问题(降级传递、历史写入、wechat-constraints 引用等) - evals 更新为单用户模式的 3 个场景 - 新增 style.example.yaml 作为默认模板 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
97 lines
4.4 KiB
JSON
97 lines
4.4 KiB
JSON
{
|
||
"skill_name": "wewrite",
|
||
"evals": [
|
||
{
|
||
"id": 0,
|
||
"name": "first-time-onboard",
|
||
"prompt": "我想用 WeWrite 写公众号文章。我的公众号叫「AI前哨站」,主要写 AI 和科技方向,风格偏轻松有趣,像跟朋友聊天。不用配微信 API,先不配,直接用默认的就行。",
|
||
"expected_output": "完成 Onboard 流程:通过对话收集信息生成 style.yaml,检测到无 config.yaml 时设置降级标记而非报错停止",
|
||
"files": [],
|
||
"assertions": [
|
||
{
|
||
"name": "creates_style_yaml",
|
||
"type": "file_exists",
|
||
"description": "应在 skill 目录下生成 style.yaml"
|
||
},
|
||
{
|
||
"name": "style_has_required_fields",
|
||
"type": "content_check",
|
||
"description": "style.yaml 包含 name、topics、tone 字段"
|
||
},
|
||
{
|
||
"name": "no_client_directory",
|
||
"type": "negative_check",
|
||
"description": "不应创建 clients/ 子目录(旧模式已移除)"
|
||
},
|
||
{
|
||
"name": "graceful_no_config",
|
||
"type": "behavior_check",
|
||
"description": "检测到无 config.yaml 时应设置降级标记并继续,而非报错停止"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 1,
|
||
"name": "topic-writing-anti-ai",
|
||
"prompt": "写一篇公众号文章,选题:为什么 AI Agent 正在杀死传统 SaaS。不要用交互模式,全自动跑完。不用推送,生成本地预览就行。",
|
||
"expected_output": "一篇 1500-2500 字的公众号 Markdown 文章,通过 7 层去 AI 痕迹验证,包含维度随机化记录,保存到 output/ 目录",
|
||
"files": [],
|
||
"assertions": [
|
||
{
|
||
"name": "article_word_count",
|
||
"type": "range_check",
|
||
"description": "文章字数在 1500-2500 之间"
|
||
},
|
||
{
|
||
"name": "no_banned_words",
|
||
"type": "content_check",
|
||
"description": "文章不包含禁用词:首先、其次、总之、综上所述、值得注意的是、不可否认、众所周知、至关重要、不言而喻"
|
||
},
|
||
{
|
||
"name": "has_broken_sentences",
|
||
"type": "content_check",
|
||
"description": "文章包含至少 3 处破句/不完整句(如破折号中断、自我纠正、省略)"
|
||
},
|
||
{
|
||
"name": "has_specific_details",
|
||
"type": "content_check",
|
||
"description": "文章包含具体时间/地点/人物/非整数数字等细节,而非泛化表达"
|
||
},
|
||
{
|
||
"name": "dimensions_recorded",
|
||
"type": "behavior_check",
|
||
"description": "输出中展示了本次激活的随机维度(如叙事视角、类比域等)"
|
||
},
|
||
{
|
||
"name": "saved_to_output",
|
||
"type": "file_exists",
|
||
"description": "文章 Markdown 文件保存到 output/ 目录"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 2,
|
||
"name": "markdown-to-wechat",
|
||
"prompt": "帮我把下面这段 markdown 转成微信公众号格式,用 professional-clean 主题预览一下:\n\n# 为什么你应该停止追求完美代码\n\n## 完美是个陷阱\n\n说实话,我写了十年代码,最大的领悟不是什么设计模式,而是——完美的代码根本不存在。\n\n你以为 Google 的代码库很优雅?去看看 Chromium 的源码,保证刷新你的三观。\n\n## 够用就是最好的\n\n我之前一个同事,重构一个模块重构了三周。结果呢?性能提升了 2%,但错过了整个 sprint 的交付。\n\n老板的原话是:「我要的是能跑的,不是能裱起来的。」\n\n## 最后说两句\n\n写代码跟做饭一样——你妈做的菜不一定摆盘好看,但你就是爱吃。",
|
||
"expected_output": "生成微信兼容的内联样式 HTML 文件,H1 提取为独立标题,H2 有主题样式,可在浏览器预览",
|
||
"files": [],
|
||
"assertions": [
|
||
{
|
||
"name": "html_generated",
|
||
"type": "file_exists",
|
||
"description": "生成了 HTML 预览文件"
|
||
},
|
||
{
|
||
"name": "inline_styles_only",
|
||
"type": "content_check",
|
||
"description": "HTML 使用内联 style 属性,不包含 <style> 标签(微信限制)"
|
||
},
|
||
{
|
||
"name": "h1_extracted",
|
||
"type": "content_check",
|
||
"description": "H1 标题被提取为独立标题字段,不在正文 HTML 中"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|