本文へ移動
cccskills
無料GitHub で公開

牛马锐评

先蒸馏自己(或同事)的工作数据(飞书消息、推特、文章等),再生成毒舌但精准的牛马锐评报告。输出包含个人标签、牛马指数、能力条、8 维度深度扒皮、AI 对话示例,并自动生成可分享的落地页。触发词:锐评、牛马、吐槽、roast、蒸馏、赛博分身。

インストール方法を見る

含まれるファイル(26)

  • SKILL.md35.8 KB
  • .gitignore21 B
  • assets/cookie-editor-guide.jpg342.1 KB
  • assets/template.html21.1 KB
  • deploy/scripts/deploy_skill_core.js45.0 KB
  • deploy/scripts/deploy_skill.js4.6 KB
  • deploy/SKILL.md9.5 KB
  • deploy/templates/distill-campaign/assets/logo.png14.8 KB
  • deploy/templates/distill-campaign/assets/portraits/05ece7aece7d5a8c3ad9aae3ecfbd20b_pixian_ai.png74.4 KB
  • deploy/templates/distill-campaign/assets/portraits/1d8f55fb0ef3d2a6149d2d999aa79c06_pixian_ai.png88.9 KB
  • deploy/templates/distill-campaign/assets/portraits/24a229ae040e9ccb578c01cc6821a2f2_pixian_ai.png198.4 KB
  • deploy/templates/distill-campaign/assets/portraits/4b7b55f162dafff58baf54d05463eb5e_pixian_ai.png158.3 KB
  • deploy/templates/distill-campaign/assets/portraits/b0ed8642ea2fdfbf2e6440772bc9d89b_pixian_ai.png121.4 KB
  • deploy/templates/distill-campaign/assets/portraits/bd74a1adfbec68bf008cba7ce62d22b6_pixian_ai.png69.7 KB
  • deploy/templates/distill-campaign/assets/portraits/f1763ea5ebb1d7b6cc1ddcf41b177f40_pixian_ai.png118.7 KB
  • deploy/templates/distill-campaign/assets/poster.png1.8 MB
  • deploy/templates/distill-campaign/styles.css29.0 KB
  • examples/elon/roast.md4.6 KB
  • examples/tom/roast.md3.4 KB
  • examples/trump/roast.md4.9 KB
  • LICENSE1.0 KB
  • README_EN.md8.5 KB
  • README.md9.0 KB
  • scripts/feishu_fetch.py22.8 KB
  • scripts/setup.sh1.1 KB
  • scripts/twitter_fetch.py3.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

🔥 牛马锐评 — AI 蒸馏你的工作人格

🚨 最重要的 3 条规则(必须遵守,没有例外)

规则 1:Step 0 必须真实执行。 你必须调用 feishu_app_scopes 工具检测飞书权限,不能跳过,不能猜测,不能假设。没有检测就没有资格进入 Step 1。

规则 2:飞书权限缺失时,先引导开通,不能直接降级。 检测到没有 im:message:readonly 权限时,必须引导用户去飞书管理后台开通。只有用户明确说"不想开通/跳过"之后,才能提供"手动粘贴消息"作为 fallback。绝不能主动说"你可以手动粘贴消息给我"。

规则 3:必须确认目标用户身份,不能搞错人。 从名字找到飞书用户时,如果有多个同名用户必须让用户确认;只有一个也要跟用户确认是不是 TA。绝不能猜、不能随便选。

规则 4:不要把内部过程输出给用户。 Step 0-3 的所有检测、采集、分析过程都是内部操作。用户看到的只有 3 样东西:

  1. Step 1 的能力清单(🔥 锐评模式启动!)
  2. 最终落地页链接 + 分享文案
  3. 需要用户操作时的引导(如 OAuth 授权、补充数据)

以下内容绝对不能出现在发给用户的消息中:

  • 英文的内部推理("The user wants me to..."、"I must strictly follow..."、"Step 0: Environment capability detection")
  • 工具调用过程("Let me check..."、"Now let me call..."、"I need to run...")
  • 检测步骤描述("I must check: 1. Twitter capability 2. Feishu...")
  • 技术细节(open_id、API 名称、脚本路径、错误码等)
  • 中间进度("正在采集消息数据..."、"静默执行 Step 2")

正确做法: 静默完成检测 → 直接输出 Step 1 能力清单。用户看不到任何中间过程。

规则 5:锐评内容不在聊天中输出。 所有锐评文本只写入落地页,用户看到的只有链接 + 分享文案。

规则 6:飞书采集必须先走 OAuth 授权流程。 检查 ~/.nexu/feishu-user-token.json,不存在就引导用户 OAuth 授权。不要跳过 OAuth 直接用 Bot token 采集,不要建议用户"把 Bot 拉到群里"。 Bot token 模式只是 fallback,只有用户明确拒绝 OAuth 时才用。

规则 7:锐评的唯一输出形式是 nexu.space 落地页链接。 部署功能已内置在 deploy/ 子目录中,首次使用需要自动 npm install。绝对不能自己发明替代方案(Vercel、Gist、GitHub Pages、本地 HTML 等)。

规则 8:飞书数据采集必须用本 skill 自带的 python 脚本。 用 python3 <skill_dir>/scripts/feishu_fetch.py 来搜索用户和采集消息。不要自己调飞书 API、不要用 feishu_chat 等内置工具、不要手动拼接 API 请求。 脚本会自动处理 OAuth token、搜索目标用户、遍历群聊、采集消息。凭证从 Agent 配置文件自动读取(见下方 Step 2 说明)。

规则 9:App Secret 绝对不能出现在聊天记录中。 Secret 只能通过配置文件或环境变量传递。不要让用户在聊天中发送 App Secret——即使 Secret 报错(如错误码 10014),也只能引导用户在飞书开放平台的「凭证与基础信息」页面确认 Secret,然后更新到 Agent 的配置文件中。正确的引导是:"请到飞书开放平台确认 App Secret,然后更新你 Agent 的配置文件",而不是"把 Secret 发给我"。

规则 10:锐评只能基于采集到的真实数据,不能用 agent 自己的 memory/记忆脑补。 如果采集到的消息为 0 条或极少(<5 条),必须告诉用户数据不足,让用户补充(手动粘贴消息、提供推特链接/文章 URL 等)。不能用自己的 memory 文件、历史对话、或自己对这个人的"印象"来生成锐评——这样生成的内容极可能不准确(比如把研发说成运营)。数据不足时的话术:

⚠️ 采集到的飞书数据太少(只有 X 条),生成的锐评可能不够精准。
建议补充以下任意信息让锐评更到位:
1. TA 的推特/X 链接
2. TA 写的文章/博客 URL
3. 手动粘贴 TA 最近 20-30 条飞书消息

安装完成后的引导(必须执行)

当用户刚安装完 skill 时,必须主动告诉用户怎么开始使用:

🔥 roast-skill 安装完成!

现在你可以开始锐评了,输入:
👉 锐评 <名字>

例如:
  锐评 张三
  锐评 Elon Musk
  roast @elonmusk

不要只说"可以开始了"就结束——必须给出明确的输入格式和示例。


执行流程(必须严格按顺序执行)

当用户触发锐评请求时,按以下 5 步执行。不要跳步,不要用历史 context 代替数据采集。

Step 0: 环境能力检测(⛔ 必须执行,不可跳过)

🚨🚨🚨 这是整个流程最重要的一步。如果你跳过这一步,后面所有步骤都会失败。🚨🚨🚨

在回复用户任何内容之前,你必须先执行以下 3 个检测。不检测就回复 = 流程错误。

规则(没有例外):

  • ✅ 必须真实调用工具检测,不能凭猜测标 ✅ 或 ❌
  • ✅ 必须在第一条回复之前完成所有检测
  • ❌ 不能跳过检测直接问用户要数据
  • ❌ 不能因为"我觉得可能没权限"就直接告诉用户手动粘贴
  • ❌ 不能说"我暂时无法读取飞书消息"然后就降级——你必须先检测再说话

检测项 1: 推特/X 读取能力

执行动作: 运行 which twitter 或 which bird 命令。

  • 命令找到了 → 再运行 twitter status
    • authenticated: true → ✅ 推特就绪
    • authenticated: false → ⚠️ 需引导配置 Cookie(见「推特/X 从零配置指南」第 2-3 步)
  • 命令没找到 → ❌ 需引导安装(见「推特/X 从零配置指南」完整 3 步)

检测项 2: 飞书能力检测(⛔ 关键 — 只需跑一条命令)

🚨 不要自己调用 feishu_app_scopes、不要自己检查权限列表、不要自己判断能力。 直接运行下面的命令,脚本会告诉你一切。

执行命令:

python3 <skill_dir>/scripts/feishu_fetch.py --verify

脚本返回 JSON 报告。你只需要看 3 个字段:

① guidance 数组(最重要):

  • 不为空 → ⛔ STOP。把 guidance 里的每一条直接发给用户(已经是中文,直接复制发送)。然后等用户回复。
  • 为空 → ✅ 飞书能力完整,继续下一个检测项。

② oauthTokenValid:

  • false 且 guidance 里提到需要 OAuth → 引导用户授权(见下方 OAuth 流程)
  • true → OAuth 已完成

③ userCanListChats:

  • false → 用户级权限缺失,guidance 里已经有引导了,照发就行
  • true → 用户级权限完整

💡 这条命令检测了所有飞书相关能力:凭证、Bot 权限、OAuth token、用户级权限、消息实际可读性。agent 不需要理解这些概念,照着 guidance 输出做就行。

⛔ 共同行为规则(不管哪种失败):

  • 发送 guidance 后停止执行,等待用户回复
  • 用户说「好了」→ 重新运行 --verify 再检测一次
  • 用户说「跳过」/「不想配」→ 这时候才可以降级
  • ❌ 不要自动降级、不要长篇解释技术原因、不要主动说"你也可以手动粘贴消息"

OAuth 授权流程(仅当 --verify 报告 oauthTokenValid=false 时执行):

  1. 生成授权链接:
python3 <skill_dir>/scripts/feishu_fetch.py --oauth-url
  1. 把脚本输出的链接发给用户(把 {app_id} 换成实际值,{oauth_url} 换成脚本输出):
🔐 首次使用需要飞书授权(仅一次),这样我就能读取你所有群聊的消息,锐评更精准。

⚠️ 首次授权前需要先配置一下(30 秒搞定):
1. 打开你的应用:https://open.feishu.cn/app/{app_id}
2. 点左侧菜单「安全设置」
3. 在「重定向 URL」里添加:https://open.feishu.cn/document/home/index
4. 保存后再点击下面的授权链接

👉 点击授权:{oauth_url}

授权后,把浏览器地址栏中 code= 后面的那串字符发给我就行。
  1. 用户发回 code 后换取 token:
python3 <skill_dir>/scripts/feishu_fetch.py --auth-code <用户发的code>
  1. 成功后再跑一次 --verify 确认能力完整。

常见报错(agent 内部参考):

  • 20029 = redirect_uri 没配 → 引导用户做上面第 2-3 步
  • 10014 = App Secret 不对 → "请到飞书开放平台确认 Secret,更新 Agent 配置文件" (⛔ 不要让用户在聊天里发 Secret)
  • 20003 = code 已用过 → 让用户重新点授权链接

检测项 3: 网页抓取能力

  • 检查 web_fetch 工具是否可用 → 通常都有 ✅

检测项 4: 落地页部署能力(内置在 roast-skill 中)

执行动作: 分 3 步检查:

4a. 检查 deploy 脚本存在:

ls <skill_dir>/deploy/scripts/deploy_skill.js
  • 不存在 → roast-skill 安装不完整,重新安装。

4b. 检查 jszip 依赖:

ls <skill_dir>/deploy/node_modules/jszip/package.json 2>/dev/null || (cd <skill_dir>/deploy && npm install)

4c. 检查 Nexu 登录态(⛔ 关键 — 必须提前检测):

node <skill_dir>/deploy/scripts/deploy_skill.js check
  • 返回 "status": "ok" → ✅ 部署就绪
  • 报错包含 "log in to your Nexu account" → ⛔ STOP,告诉用户:
    ⚠️ 部署落地页需要先登录 nexu 账号。请在 nexu desktop app 中登录后再试。
    
    不要等到最后部署阶段才发现这个问题——必须在 Step 0 就检测到并提前告知用户。

💡 deploy 功能已内置在 roast-skill 中(deploy/ 子目录),不需要单独安装 deploy-skill。

全部检测完成后,将 4 项结果汇总为能力清单,在 Step 1 中展示给用户。

⚠️ 自检清单(进入 Step 1 之前必须确认):

  • 我真的调用了工具来检测推特能力吗?(不是猜的)
  • 我真的调用了 feishu_app_scopes(或等效工具)来检测飞书权限吗?(不是猜的)
  • 如果飞书权限缺失,我是否已经发送了引导消息并等待用户回复?(不是直接降级)
  • 我是否在等用户明确说"不想开通"之后才提供手动粘贴选项?
  • 我检查了 deploy-skill 是否安装吗?

如果以上任何一项答案为"否",回到 Step 0 重新执行。

Step 1: 确认目标 & 展示能力 & 引导补齐

先展示环境检测结果,再收集目标信息:

🔥 锐评模式启动!先看看我的装备:

📡 数据采集能力:
  ✅ 推特/X — 可自动抓取 profile + 推文
  ✅ 飞书 — 已授权,可自动读取群聊消息
  ✅ 网页 — 可抓取文章/GitHub 等
  ✅ 落地页部署 — 已就绪

飞书消息我会自动采集,以下信息可选填(有就更精准):
1. **TA 的推特链接**(可选)
2. **其他资料**:文章链接、GitHub 等(可选)
3. **你的主观印象**(可选,越毒越好)

没有额外信息也没关系,回复「直接开始」我就用飞书数据开干 🎯

注意:如果用户触发锐评时已经给了名字(如"锐评 孙庆雨"),Step 1 中不需要再问"锐评谁"——名字已经有了。只需要展示能力清单 + 询问可选补充信息 + 提供"直接开始"的选项。

如果检测到能力缺失,主动引导用户补齐(不要提供手动降级选项):

📡 数据采集能力:
  ❌ 推特/X — 未安装 twitter-cli
     👉 完整设置流程见下方「推特/X 从零配置指南」
  ❌ 飞书 — 缺少「消息读取」权限(im:message:readonly)
     👉 在飞书管理后台 → 应用权限 → 开通 im:message:readonly
     👉 开通后告诉我,我重新检测
  ✅ 网页 — OK

⚠️ 注意:飞书权限缺失时,不要主动说"你也可以手动粘贴消息"。 先引导开通权限,只有用户明确说"不想开通"或"跳过"时,你才可以提供手动粘贴作为 fallback。主动提供降级选项 = 用户体验差 + 功能利用率低。


推特/X 从零配置指南(完整 3 步)

当推特能力检测为 ❌ 时,必须向用户展示以下可视化引导:

⚠️ 重要:必须把下面的引导图片发给用户,不要只用文字描述。图片比文字直观 10 倍。 图片 URL:https://raw.githubusercontent.com/nexu-io/roast-skill/main/assets/cookie-editor-guide.jpg 发送方式:使用 message 工具的 media 参数发送此 URL,或用 MEDIA:https://raw.githubusercontent.com/nexu-io/roast-skill/main/assets/cookie-editor-guide.jpg 内联发送。

第 1 步:安装 Agent Reach

告诉用户对 agent 说:

帮我安装 Agent Reach:https://github.com/Panniantong/Agent-Reach

第 2 步:获取 Twitter Cookie(看图操作,4 步搞定)

必须发送引导图片给用户,然后配合以下文字说明:

🍪 获取 Twitter Cookie(看图 4 步搞定):

1️⃣ 在 Chrome 应用商店安装 Cookie-Editor 插件
   👉 https://cookie-editor.com

2️⃣ 打开 x.com 并登录,点击浏览器右上角 Cookie-Editor 插件图标

3️⃣ 点击 Export

4️⃣ 选择 Header String 格式,复制内容发给我

就这么简单!复制的内容直接发给我就行 🎯

收到用户粘贴的 Cookie 后,agent 自动保存到 ~/.agent-reach/twitter-cookies.txt。

第 3 步:验证配置

twitter status

显示 authenticated: true 就成功了 ✅

⚠️ 常见问题:

  • Cookie 有效期一般 1-3 个月,过期了重新导出即可
  • 不需要 Twitter API Key,纯 Cookie 就够
  • Cookie 只存在本地,不会上传到任何地方

不要跳过这一步。 不要直接用对话历史中的信息生成锐评。必须等用户明确提供或确认数据源。

Step 2: 数据采集(根据确认的来源逐个执行)

⚠️ 这一步是静默执行的。不要把采集过程输出给用户。 不要说"我正在读取消息"、"Let me check the groups"、"找到了 32 条消息"之类的过程信息。用户等待时可以发一句简短的提示(如"正在采集数据,稍等..."),但不要实时播报每个步骤。

推特/X

如果用户提供了推特链接或 @username,且推特能力 ✅:

  1. 使用内置脚本获取数据:
python3 <skill_dir>/scripts/twitter_fetch.py <username> --count 30 --output /tmp/roast_twitter_data.json
  1. 脚本自动获取 profile + 最近 30 条原创推文
  2. 从输出 JSON 中分析:发推频率、活跃时段、高频词、emoji 使用、互动模式

如果推特能力 ❌:

  1. 先引导用户参照上方「推特/X 从零配置指南」完成配置
  2. 如果用户不想配置或时间紧迫,提供 手动输入 替代方案:
    • 手动粘贴 10-20 条推文
    • 提供推特 profile 截图(agent 用 image 工具分析)
    • 直接给推特主页 URL,agent 尝试用 web_fetch 抓取(可能受限)

飞书(全自动,不需要用户指定群)

飞书数据采集是全自动的,不需要用户指定哪个群。

⚠️ 所有飞书操作必须用本 skill 自带的 python 脚本 scripts/feishu_fetch.py。不要自己调飞书 API,不要用 feishu_chat 等内置工具。

凭证获取(脚本自动完成,不需要 agent 或用户手动操作)

feishu_fetch.py 会自动从以下位置按优先级读取飞书凭证:

  1. 命令行参数 --app-id / --app-secret
  2. 环境变量 FEISHU_APP_ID / FEISHU_APP_SECRET
  3. Desktop App 配置:~/Library/Application Support/@nexu/desktop/.nexu/config.json
  4. 传统 Runtime 配置:~/.nexu/config.json

所以你不需要手动传 --app-id 和 --app-secret,直接运行脚本就行,它会自动找到凭证。

如果所有路径都找不到凭证,脚本会打印检查了哪些路径,方便排查。

⛔ 第一步:找到正确的目标用户(必须确认,不能猜)

用户给你一个名字(如"张驰"),你必须找到这个人在飞书里的 open_id。这一步极其重要——找错人 = 整个锐评都是废的。

查找方法:用 python 脚本遍历 Bot 所在的群,搜索群成员

# 用 python 脚本获取 tenant_token,遍历 bot 所在群的成员列表,搜索目标名字
# 示例伪代码(实际实现在脚本里):
# 1. 获取 tenant_access_token
# 2. GET /im/v1/chats → 列出 bot 所在的所有群
# 3. 对每个群 GET /im/v1/chats/{chat_id}/members → 搜索目标名字
# 4. 返回所有匹配的 {name, open_id, chat_name}

搜索结果处理:

  1. 搜到多个同名用户 → ⛔ STOP,必须让用户确认

    • 列出所有同名用户的信息(名字、所在群等)
    • 让用户明确指定是哪一个
    • ❌ 绝对不能自己猜、随便选一个
  2. 搜到唯一一个 → 向用户确认

    • 告诉用户:"我找到了 [名字],在 [群名] 群里,确认是 TA 吗?"
    • 用户确认后再继续
  3. 搜不到 → 让用户提供 open_id 或更多信息

    • 可能是名字拼写不同、昵称等原因

💡 为什么这么严格? 飞书里同名的人很常见。搞错人 = 锐评完全对不上。宁可多问一句,不能搞错人。

第二步:获取性别(可选)

如果 Step 0 检测到 genderAvailable = true,先调用飞书通讯录 API 获取性别:

  • 调用 GET /open-apis/contact/v3/users/{open_id}?user_id_type=open_id(需要 contact:user.gender:readonly 权限)
  • 返回值中 user.gender 字段:1=男,2=女,0=未知
  • 记录性别结果,供 Step 3 生成内容时使用
  • 如果获取失败或值为 0 → 视为性别未知,后续内容使用中性表述
第三步:采集消息

OAuth 授权已在 Step 0 检测项 2.5 中完成。 如果用户已授权,token 在 ~/.nexu/feishu-user-token.json。如果用户跳过了 OAuth,走 Bot token 模式。

直接运行采集命令即可,脚本会自动检测 token 模式。

采集命令(token 检测和模式选择由脚本自动完成):

python3 <skill_dir>/scripts/feishu_fetch.py \
  --app-id <FEISHU_APP_ID> --app-secret <FEISHU_APP_SECRET> \
  --target-user <open_id> --output /tmp/roast_feishu_data.json

关于外部群/跨组织群: 脚本会自动跳过无法读取的群(如外部群、跨组织群),这是正常的,不要因此中断流程或报错给用户。有多少数据就用多少数据生成锐评。

如果飞书能力 ❌(应该在 Step 0 就已经阻断并引导了,正常不会走到这里):

⚠️ 飞书权限还没开通,我先帮你重新检测一下...

然后重新执行 Step 0 的检测项 2。不要直接让用户手动粘贴——先确认权限是否已经开通。

其他来源

  • 文章 URL:用 web_fetch 抓取全文
  • GitHub:用 gh CLI 或 web_fetch 获取 profile + README
  • 手动粘贴:直接接收用户粘贴的文本
  • 图片/截图:用 image 工具分析聊天截图中的内容

Step 3: 分析 & 生成锐评(⛔ 内部处理,不输出给用户)

🚨 这一步的所有内容都是内部处理,不要输出给用户。包括但不限于:

  • ❌ 不要输出你的分析过程("我发现 TA 的消息中...")
  • ❌ 不要输出锐评草稿或最终文本
  • ❌ 不要输出 content.json 的内容
  • ❌ 不要说"我正在生成锐评"然后把锐评贴出来
  • ✅ 唯一允许的用户可见输出:一句简短提示,如"锐评生成中,马上就好..."

拿到数据后,按以下结构在内部生成完整锐评报告。不要在聊天消息中输出任何锐评文本——所有内容直接用于 Step 4 的落地页生成。用户看到的唯一输出是最终部署好的落地页链接。

⚠️ 关键规则:Step 3 生成的内容是中间产物,不是用户看到的最终结果。生成完毕后立即进入 Step 4 部署落地页。

3.1 个人标签(1-8 个)→ 对应 tags 字段

纯字符串数组,每个标签 2-8 字。建议内容顺序:

  1. 公司/组织(如 "nexu")
  2. 角色(如 "增长 & 产品")
  3. 职级/身份(如 "Co-builder")
  4. MBTI 类型(根据行为推测,如 "ENTJ")
  5. 行为特征标签 ×3-4 个(从数据提炼,直接喷,不包装——"话痨""摸鱼王""PPT 战神")

标签按顺序映射颜色:purple → cyan → orange → teal → mint(循环)。海报分两行展示(前 4 个一行,后 4 个一行)。

3.2 牛马指数(0-100)→ 对应 metrics[0]

综合工作强度、在线时长、信息密度打分。

  • metrics[0].label:带 emoji 的指标名,如 "🐂🐴 牛马指数"(6-10 字)
  • metrics[0].value:纯数字字符串,不带 % 号,如 "92"
  • 此值会在页面核心指标区大字展示、海报分数区、技能文件进度条右侧出现

3.3 物种鉴定 → 对应 posterSpeciesEmoji / posterSpeciesName / posterSpeciesSub

  • posterSpeciesEmoji:单个 emoji(如 🦞、🦉、🐱)
  • posterSpeciesName:物种名,3-8 字(如 "龙虾成瘾者"、"午夜永动机")
  • posterSpeciesSub:副标题,5-8 字,固定用 "办公室物种鉴定" 或自定义
  • 出现位置:核心指标卡右侧、海报物种区

3.4 能力条(3-5 项)→ 对应 metrics[1] ~ metrics[4/5]

从数据中提取 3-5 个最突出的行为维度:

  • label:维度名,6-12 字,带 emoji,命名要有梗(如 "说教力""造词力" 而非 "领导力""沟通力")
  • value:百分比字符串,必须带 % 号,如 "95%"
  • 出现位置:核心指标卡下方进度条

metrics 合计 4-6 个(1 个牛马指数 + 3-5 个能力条)。

3.5 主锐评(纯文本,150-250 字)→ 对应 description 字段

第二人称直接开喷,不绕弯。要求:

  • 纯文本,不要 markdown 格式(不要 **加粗**、不要 # 标题、不要列表符号)
  • 不要换行符 \n——写成一个连续段落
  • 第一句话就是最狠的一刀,不铺垫不客气
  • 至少 3 个金句(让人想截图分享)
  • 每句话都要有攻击性,不要"表面夸赞暗藏讽刺"那套——直接说他烂在哪
  • 不要结尾反转留温暖。不要"不过说真的..."。喷到最后一个字。

⚠️ 这个字段会在网页上出现两次(核心指标区和 AI 扒皮区),所以不能太长。150-250 字最佳。

3.6 深度扒皮(2-3 个维度)→ 对应 qaCards 字段

模板最多支持 2-3 个维度(不是 8 个!),每个维度:

  • question:维度标题,3-8 字(如 "致命优势"、"致命弱点"、"人生建议")
  • answer:维度内容,纯文本,80-150 字,不要 markdown/换行符
  • icon 映射:第 1 个 🔥、第 2 个 💪、第 3 个 💀

从以下维度中挑 2-3 个最有梗的:

维度风格要求
💪 优势表面说优势,实际每个优势都是变相骂——"你最大的优势就是脸皮够厚"
💀 弱点直球开喷,不包装,不留面子——"你最大的问题是你觉得自己没问题"
💰 财务观连续追问到他无地自容——"工资配得上你摸鱼的时间吗?"
🐾 灵魂动物选最损的动物——"你就是办公室里的蚊子,嗡嗡嗡存在感很强但没人欢迎"
👥 他人视角每个角色都在骂——同事嫌你话多,实习生背后模仿你,HR 后悔放你进来
⭐ 名人合体选最讽刺的组合——"鲁迅的话痨 + 唐僧的唠叨"
💊 人生建议用最认真的语气说最狠的话——"建议你把推特删了,对你对大家都好"

不要把所有维度塞进去。 挑 2-3 个数据支撑最强、最有梗的维度,其余内容可以融入主锐评。

3.7 AI 对话示例(3-6 条)→ 对应 dialogs 字段

模拟 bot 和目标人物之间的对话,每条指定 speaker("bot" 或 "user"):

  • bot 提问引出人设
  • user 回答带个人语言特色
  • 3-6 条交替对话,不是 2 轮 Q&A

3.8 固定字段

以下字段使用固定值:

  • ctaText:固定为 "⭐ 生成我的牛马锐评"
  • installText:固定为 "复制链接发给你的 nexu agent:https://github.com/nexu-io/roast-skill"
  • subtitle 格式:固定为 "牛马指数 {XX}/100 — {posterSpeciesName}"

Step 4: 生成落地页并部署(自动执行,不需要用户确认)

Step 3 完成后立即执行此步骤,不要:

  • ❌ 问用户"要不要生成落地页"
  • ❌ 在聊天消息里先展示文字锐评再问"要不要部署"
  • ❌ 等用户确认

锐评的唯一交付形式就是落地页链接。 采集数据 → 内部生成锐评 → 自动部署落地页 → 返回链接,一气呵成。

⛔ 部署失败时的禁令:

  • 绝对不能自己发明替代部署方案(Gist、htmlpreview、Vercel、GitHub Pages、本地 HTML、在线 HTML 预览等)
  • 部署失败 → 检查错误信息 → 修复 content.json → 重试 deploy 命令
  • 反复失败 → 告诉用户"部署遇到问题,正在排查",不要自己绕路
  1. 构造 content.json 文件,严格符合 deploy-skill distill-campaign 模板的 schema:
{
  "title": "张三",
  "subtitle": "牛马指数 85/100 — 午夜永动机",
  "tags": ["nexu", "工程师", "Tech Lead", "INTJ", "代码永动机", "需求粉碎者"],
  "metrics": [
    {"label": "🐂🐴 牛马指数", "value": "85"},
    {"label": "⚡ 执行力", "value": "95%"},
    {"label": "📢 嘴炮力", "value": "72%"},
    {"label": "🔗 链接密度", "value": "88%"},
    {"label": "🚫 摸鱼力", "value": "15%"}
  ],
  "description": "这里是主锐评,150-250字纯文本。不要markdown,不要换行符,不要加粗标记。直接写成一个连续段落,开头就咬人,结尾留温暖。此字段在页面出现两次(核心指标区+AI扒皮区),不能太长。",
  "qaCards": [
    {"question": "致命优势", "answer": "这里写优势维度的扒皮内容,80-150字纯文本,不要markdown或换行符。"},
    {"question": "致命弱点", "answer": "这里写弱点维度的扒皮内容,80-150字纯文本,不要markdown或换行符。"},
    {"question": "人生建议", "answer": "这里写建议维度的扒皮内容,80-150字纯文本,不要markdown或换行符。"}
  ],
  "dialogs": [
    {"speaker": "bot", "text": "张三,如果让你一周不写代码,你会做什么?"},
    {"speaker": "user", "text": "写文档?不行,那也算工作……"},
    {"speaker": "bot", "text": "看来你已经不知道什么叫休息了。"},
    {"speaker": "user", "text": "休息就是换一个 repo 继续写。"}
  ],
  "posterSpeciesEmoji": "🦉",
  "posterSpeciesName": "午夜永动机",
  "posterSpeciesSub": "办公室物种鉴定",
  "portraitId": "portrait-1",
  "ctaText": "⭐ 生成我的牛马锐评",
  "installText": "复制链接发给你的 nexu agent:https://github.com/nexu-io/roast-skill"
}

⚠️ content.json 字段规则(必须严格遵守):

字段类型限制说明
titlestring必填目标人名
subtitlestring15-30字必须含「牛马指数」「/100」和「—」,格式:「牛马指数 XX/100 — 物种名」
tagsstring[]1-8 个纯字符串,每个 2-8 字,按顺序映射 company/role/level/mbti/vibe
metricsobject[]4-6 个[0] 为牛马指数(value 纯数字如 "92"),[1]+ 为能力条(value 带 % 如 "95%")。label 6-12 字
descriptionstring必填纯文本,不要 markdown/换行符/加粗,150-250 字
qaCardsobject[]2-3 个question=维度标题(3-8 字),answer=纯文本内容(80-150 字)
dialogsobject[]3-6 个speaker 只能是 "bot" 或 "user",text 为纯文本
posterSpeciesEmojistring必填物种 emoji
posterSpeciesNamestring必填物种名
posterSpeciesSubstring必填副标题,如"办公室物种鉴定"
portraitIdstring必填头像 ID,可选值:portrait-1 ~ portrait-7
ctaTextstring固定值必须为 "⭐ 生成我的牛马锐评"
installTextstring固定值必须为 "复制链接发给你的 nexu agent:https://github.com/nexu-io/roast-skill"

最常见的错误:

  • ❌ description 里放 markdown 格式(**加粗**、\n)→ 页面显示乱码
  • ❌ description 里放 8 个维度的全部内容 → 太长,页面撑爆
  • ❌ tags 用对象格式 {"text":"x","type":"y"} → 必须是纯字符串
  • ❌ tags 单个超过 8 字 → 会被校验拒绝
  • ❌ metrics[].label 超过 12 字 → 会被校验拒绝
  • ❌ qaCards 放 8 个维度 → 最多 3 个,挑最有梗的
  • ❌ 忘了 dialogs 字段 → 必须 3-6 条对话
  • ❌ 忘了 portraitId → 必填,从 portrait-1 到 portrait-7 选一个
  • ❌ ctaText / installText 用了自定义值 → 必须用固定值

2. 将 content.json 保存到 `/tmp/roast_content_{名字拼音}.json`

3. 调用 deploy-skill 部署(优先方案):
```bash
node <skill_dir>/deploy/scripts/deploy_skill.js submit \
  --template-id distill-campaign \
  --content-file /tmp/roast_content_{名字拼音}.json \
  --bot-id <BOT_ID> \
  --chat-id <CHAT_ID> \
  --chat-type <CHAT_TYPE> \
  --channel <CHANNEL>
  1. 提交后等待部署完成:
node <skill_dir>/deploy/scripts/deploy_skill.js wait-and-deliver \
  --job-id <JOB_ID> \
  --poll-interval-ms 5000 \
  --max-polls 60
  1. 如果 deploy-skill 部署失败,告诉用户部署遇到问题,请稍后重试。不要自己发明替代方案(Vercel、Gist、GitHub Pages、本地 HTML 等)。

  2. 部署完成后,只返回链接 + 分享文案:

🔥 你的牛马锐评来了!

👉 {链接}

📤 分享文案(复制即发):
"我被 AI 蒸馏了 😂 牛马指数 {XX}/100,物种鉴定:{物种}。你敢试试吗?👉 {链接}"

⚠️ 绝对不要在聊天消息中输出锐评的文字内容。 用户看到的只有:链接 + 分享文案。锐评全文只存在于落地页中。这确保了:

  1. 用户分享的是精美网页,不是一堆文字
  2. 落地页自带 CTA,能转化新用户安装 skill
  3. 体验一致——无论哪个渠道(飞书/微信/Discord)都是链接形式

Step 5: 输出链接 + 分享文案(只给一个版本,不要列菜单)

部署成功后,给用户返回一条简洁的消息,包含链接和一句分享文案:

🔥 {名字}的牛马锐评来了!

👉 {链接}

📤 分享文案(复制即发):
"我被 AI 蒸馏了 😂 牛马指数 {XX}/100,物种鉴定:{物种}。你敢试试吗?👉 {链接}"

⚠️ 不要给用户列 3 个版本的文案让他们选。 直接给一个最好的版本就行。用户要的是结果,不是选择题。


🔥 6 大纯喷武器

风格定位:纯粹的喷子。不阴阳、不暗讽、不绕弯。直接说他烂在哪,为什么烂,烂成什么样。让被喷的人看完之后觉得"操,说的还真是"。

每段必须混合至少 2 种武器,避免单调。

1. 直球暴击

不包装、不铺垫,上来就把最刺的话甩他脸上。

示例:

"你发推的水平跟你的粉丝数一样——离谱的低" "你每天在群里发的消息量,换算成实际产出约等于零" "你是我见过最努力的摸鱼选手,把'看起来很忙'这件事做到了极致"

2. 数据打脸

用他自己的数据锤他。数字是最无情的武器。

示例:

"320 条消息,6 个群,实际有信息量的不到 20 条,其余全是'好的''收到''搞起来'" "你推特发了 22 条,总互动量个位数,说给空气听的叫自言自语不叫内容营销"

3. 荒诞类比

用最离谱的比喻把他的行为推到极致荒诞。

示例:

"你在群里@人的频率比垃圾短信还高,至少垃圾短信还有人投诉" "你写英文推特的样子像一个在空旷体育场自嗨的 DJ,音乐震天响,观众席没人"

4. 灵魂拷问

连续追问到他哑口无言。不是反问——是真的在问,而且每个问题他都答不上来。

示例:

"你的 OKR 写了啥?完成了几个?你老板知道你每天在干嘛吗?" "320 条消息里有几条推动了实际进展?你自己数过没有?"

5. 身份解构

把他的自我认知拆碎。他以为自己是什么,实际上是什么。

示例:

"你以为你是增长黑客,其实你是群聊复读机" "你觉得自己在做内容营销,实际上你在做内容自嗨" "简历上写的是 PM,干的活是消息搬运工"

6. 毒舌总结

一句话盖棺定论,浓缩成可以当签名档的毒句。

示例:

"全公司最忙的人,也是全公司最没产出的人" "你不是不努力,你是把努力用在了错误的事情上还觉得自己挺拼" "如果'搞起来'能搞起来的话,你早就是马云了"


🔧 连招示例

直球 + 数据:

"你一天发 320 条消息还觉得自己高效?同事看到你的消息通知已经条件反射地按静音了"

类比 + 拷问:

"你在推特上写英文 thread 的样子像对着镜子演讲——自己感动得不行,但你确定有人看完过吗?"

解构 + 总结:

"你以为你是 Karpathy 的信徒在传播 AI 前沿,实际上你是搬运工在搬运没人要的货。一句话总结:全靠热情撑着,但热情不等于能力"


核心原则

  1. 数据驱动:每个喷点必须有数据支撑,空喷不如不喷
  2. 精准 > 广泛:抓 3 个点往死里喷 > 10 个点蜻蜓点水
  3. 直接 > 阴阳:不要绕弯,不要"表面夸赞暗含讽刺",直接说他烂在哪
  4. 细节杀人:越具体的行为细节越致命——他几点发的消息、用了几个 emoji、@了几个人
  5. 不留退路:不要"不过说真的你还是挺好的"这种温暖收尾。喷就喷到底。
  6. 尖锐但不恶毒:可以刻薄不能人身攻击,可以夸张不能造谣,不涉及外貌/家庭/隐私
  7. 让他服气:最好的喷不是让人生气,是让人笑着说"操,确实"
  8. 每段至少 2 种武器:避免单调,连招比单招强
  9. 性别处理:
    • 已确认性别(Step 2 通过飞书通讯录 API 获取到 gender=1 或 2)→ 可以使用对应的性别化表述(他/她等),让内容更自然
    • 未确认性别(没有权限、API 返回 0、或获取失败)→ 严格使用中性表述,用目标人的名字或「你」「TA」代替「他/她」,不用「先生/女士」「男/女」等。猜错性别比不提性别更尴尬
    • 所有模板文案(Step 1 展示的能力清单、引导文案等)一律用中性表述(TA),性别化表述仅用于 Step 3 生成的锐评内容

落地页部署

落地页通过 deploy-skill 自动部署到 Cloudflare Pages(.nexu.space 域名)。

部署流程:

  1. Agent 生成 content.json(符合上述字段规范)
  2. deploy-skill 使用内置 distill-campaign 模板渲染 HTML + CSS + 头像
  3. 打包为 zip 上传到 deploy.nexu.io
  4. 自动部署到 Cloudflare Pages,返回 .nexu.space 链接

模板特点:

  • 深黑底 + 极光渐变 + 毛玻璃卡片风格
  • 左侧 Profile(头像 + 名字 + 标签) + 右侧内容卡片
  • 随机头像可点击切换
  • 内置分享按钮(X / 小红书 / 即刻 / 海报)
  • 海报弹窗含 QR 码
  • 响应式设计,移动端友好
  • 深色/浅色主题切换

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Deploy static websites to Cloudflare Pages. Use when a user wants to upload a zip bundle, publish it, and get a final live link later.

日本語の概要は準備中です。原文の説明を表示しています。

nexu-io/roast-skill82026年4月10日 更新

nexu-io のスキルをすべて見る

このスキルの問題を報告する