Skip to content
cccskills
FreePublished on GitHub

牛马锐评

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

The English summary is being prepared. Showing the original description.

See how to install

Files included (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 (original)

Review the instructions the agent will receive before you install.

🔥 牛马锐评 — 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 码
  • 响应式设计,移动端友好
  • 深色/浅色主题切换

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

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.

The English summary is being prepared. Showing the original description.

nexu-io/roast-skill8Updated Apr 10, 2026

See all skills by nexu-io

Report a problem with this skill