review-demos

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Review InboxMate Demos

审核InboxMate演示项目

Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Demo Review Pipeline started.
Checking environment...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

通知:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
演示审核流程已启动。
检查环境中...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

STEP 0 — Check Environment

步骤0 — 检查环境

Before doing anything, check if a
.env
file exists in the current working directory. Read it and source it:
bash
source .env
The
.env
file should contain tokens for:
  • CRM API — for querying and updating opportunities (variable name should be obvious, e.g. contains "CRM" and "TOKEN")
  • InboxMate MCP API — for auto-fixing widget styles (variable name should reference "MCP" or "DEMO" and "TOKEN")
If the
.env
file is missing or doesn't contain recognizable tokens for both services, stop immediately and ask the user to provide them.
Note on env var placeholders: Throughout this skill,
$<CRM_TOKEN_VAR>
and
$<MCP_TOKEN_VAR>
mean "use the actual variable name you found in
.env
for the CRM token and InboxMate MCP token respectively." Substitute with the real variable names when running commands.
Once verified, announce:
Environment OK. Finding demos pending review...

在开始任何操作前,检查当前工作目录下是否存在
.env
文件。读取并加载该文件:
bash
source .env
.env
文件应包含以下服务的令牌:
  • CRM API — 用于查询和更新商机(变量名称应清晰可辨,例如包含"CRM"和"TOKEN")
  • InboxMate MCP API — 用于自动修复部件样式(变量名称应包含"MCP"或"DEMO"和"TOKEN")
如果
.env
文件缺失,或未包含这两个服务的可识别令牌,请立即停止并要求用户提供。
关于环境变量占位符的说明: 在本技能中,
$<CRM_TOKEN_VAR>
$<MCP_TOKEN_VAR>
表示“使用你在
.env
中找到的CRM令牌和InboxMate MCP令牌的实际变量名称”。运行命令时请替换为真实的变量名称。
验证通过后,通知:
环境验证通过。正在查找待审核的演示项目...

STEP 1 — Find Demos Pending Review

步骤1 — 查找待审核的演示项目

Query CRM for opportunities at SCREENING stage with demoStatus = PENDING_REVIEW:
bash
curl -s -X POST https://crm.psquared.dev/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<CRM_TOKEN_VAR>" \
  -d '{"query":"{ opportunities(filter: { stage: { eq: SCREENING }, demoStatus: { eq: PENDING_REVIEW } }, first: 50) { edges { node { id name stage demoStatus demoUrl { primaryLinkUrl } company { id name domainName { primaryLinkUrl } } } } } }"}'
Announce:
Found [N] demos pending review:
1. [Company Name] — [demoUrl]
2. [Company Name] — [demoUrl]
...
If none found, announce "No demos pending review" and stop.

查询CRM中处于SCREENING阶段且demoStatus为PENDING_REVIEW的商机:
bash
curl -s -X POST https://crm.psquared.dev/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<CRM_TOKEN_VAR>" \
  -d '{"query":"{ opportunities(filter: { stage: { eq: SCREENING }, demoStatus: { eq: PENDING_REVIEW } }, first: 50) { edges { node { id name stage demoStatus demoUrl { primaryLinkUrl } company { id name domainName { primaryLinkUrl } } } } } }"}'
通知:
找到[N]个待审核的演示项目:
1. [公司名称] — [demoUrl]
2. [公司名称] — [demoUrl]
...
如果未找到任何项目,通知“无待审核的演示项目”并停止操作。

STEP 2 — Review Each Demo

步骤2 — 审核每个演示项目

For each opportunity, perform a quality check:
针对每个商机,执行质量检查:

2a — Fetch the Demo Page

2a — 获取演示页面

Use WebFetch to open the demo playground URL. The demo page is at
demo.inboxmate.psquared.dev/?id=<demoId>
.
Look at the page content for:
  • Company name and branding
  • Bot greeting message
  • Quick questions displayed
  • Color theme
使用WebFetch打开演示 playground URL。演示页面地址为
demo.inboxmate.psquared.dev/?id=<demoId>
检查页面内容是否包含:
  • 公司名称和品牌标识
  • 机器人问候语
  • 显示的快速问题
  • 颜色主题

2b — Fetch the Company Website

2b — 获取公司官网

Use WebFetch on the company's domain (from
company.domainName.primaryLinkUrl
). Compare against the demo.
使用WebFetch访问公司域名(来自
company.domainName.primaryLinkUrl
)。将其与演示项目进行对比。

2b2 — Get Brand Colors via OpenBrand

2b2 — 通过OpenBrand获取品牌颜色

Call the OpenBrand API to extract the company's actual brand colors:
WebFetch: https://openbrand.sh/api/extract?url=https://[companyDomain]
From the response, find the primary color — look for the color tagged as
"primary"
in the
colors
array. Record this hex value as
expectedPrimaryColor
.
If OpenBrand fails or returns no colors, fall back to manually inspecting the company website HTML for dominant button/CTA colors.
调用OpenBrand API提取公司的实际品牌颜色:
WebFetch: https://openbrand.sh/api/extract?url=https://[companyDomain]
从响应中找到主色调 — 在
colors
数组中查找标记为
"primary"
的颜色。记录该十六进制值为
expectedPrimaryColor
如果OpenBrand调用失败或未返回任何颜色,退回到手动检查公司官网HTML中的主导航/CTA按钮颜色。

2b3 — Get Demo Data via API

2b3 — 通过API获取演示数据

Fetch the demo's stored data to check the countdown configuration:
WebFetch: https://app.psquared.dev/api/demo/[demoId]
Extract the
demoId
from the opportunity's
demoUrl
(the
?id=
parameter or last path segment).
From the response, record:
  • offerText
    — the offer headline text
  • offerExpiresAt
    — the countdown deadline (ISO date, or null if missing)
  • agentId
    — needed for auto-fixes
获取演示项目的存储数据以检查倒计时配置:
WebFetch: https://app.psquared.dev/api/demo/[demoId]
从商机的
demoUrl
中提取
demoId
?id=
参数或最后一个路径段)。
从响应中记录:
  • offerText
    — 优惠标题文本
  • offerExpiresAt
    — 倒计时截止日期(ISO格式,若缺失则为null)
  • agentId
    — 自动修复所需的ID

2c — Quality Checklist

2c — 质量检查清单

Score each item as PASS or FAIL:
CheckWhat to verify
Company matchDemo mentions the correct company name
Language matchDemo language matches the company website language (DE/EN/both)
Greeting qualityGreeting is specific to the company, not generic ("Hi! How can I help?")
Quick questionsQuestions are relevant to this company's products/services
Color matchWidget primary color matches OpenBrand
expectedPrimaryColor
. Compare hex values — minor shade differences (e.g.
#1a365d
vs
#1e3a5f
) are OK, but completely different hues are a FAIL.
Countdown set
offerExpiresAt
is present AND is a future date (not null, not expired). The
offerText
should describe a time-limited offer that matches the deadline premise — NOT "Kostenlose Erstberatung" or generic text. If the CRM opportunity has a deadline mentioned in the notes, the countdown should match that deadline.
Content accuracyAny visible knowledge snippets reference real products/services from the website
No hallucinationsDemo doesn't mention products, pricing, or features not on the company website
为每个项目评分PASS或FAIL:
检查项验证内容
公司信息匹配演示项目中提及正确的公司名称
语言匹配演示项目的语言与公司官网语言一致(德语/英语/双语)
问候语质量问候语针对该公司定制,而非通用内容(如“嗨!我能帮你什么?”)
快速问题相关性问题与该公司的产品/服务相关
颜色匹配部件主色调与OpenBrand返回的
expectedPrimaryColor
匹配。对比十六进制值 — 细微色调差异(如
#1a365d
#1e3a5f
)可接受,但完全不同的色调则判定为FAIL。
倒计时设置
offerExpiresAt
已设置且为未来日期(非null,未过期)。
offerText
应描述与截止日期对应的限时优惠 — 不得使用“Kostenlose Erstberatung”(免费首次咨询)或通用文本。如果CRM商机的备注中提及截止日期,倒计时应与该日期一致。
内容准确性所有可见的知识片段均引用官网的真实产品/服务
无幻觉内容演示项目未提及官网中不存在的产品、定价或功能

2d — Auto-Fix: Colors

2d — 自动修复:颜色

If the Color match check FAILED (widget color doesn't match OpenBrand primary color):
  1. Call
    update_widget_style
    via the InboxMate MCP to fix the color:
bash
curl -s -X POST https://app.psquared.dev/api/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<MCP_TOKEN_VAR>" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"update_widget_style","arguments":{"agentId":"[agentId]","primaryColor":"[expectedPrimaryColor]"}}}'
  1. Republish the agent:
bash
curl -s -X POST https://app.psquared.dev/api/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<MCP_TOKEN_VAR>" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"publish_agent","arguments":{"agentId":"[agentId]"}}}'
Announce:
Auto-fixed: Updated [Company] widget color from [oldColor] to [expectedPrimaryColor]
After auto-fixing, mark the Color match check as PASS (fixed).
如果颜色匹配检查失败(部件颜色与OpenBrand主色调不匹配):
  1. 调用InboxMate MCP的
    update_widget_style
    接口修复颜色:
bash
curl -s -X POST https://app.psquared.dev/api/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<MCP_TOKEN_VAR>" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"update_widget_style","arguments":{"agentId":"[agentId]","primaryColor":"[expectedPrimaryColor]"}}}'
  1. 重新发布agent:
bash
curl -s -X POST https://app.psquared.dev/api/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<MCP_TOKEN_VAR>" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"publish_agent","arguments":{"agentId":"[agentId]"}}}'
通知:
自动修复完成:将[公司名称]的部件颜色从[旧颜色]更新为[expectedPrimaryColor]
自动修复完成后,将颜色匹配检查标记为PASS(已修复)。

2e — Auto-Fix: Countdown / Deadline

2e — 自动修复:倒计时/截止日期

If the Countdown set check FAILED (missing
offerExpiresAt
, expired date, or wrong
offerText
):
Determine the correct deadline:
  • If the CRM opportunity notes mention a specific deadline → use that date
  • Otherwise → set to 7 days from today (ISO 8601)
Determine the correct offer text:
  • The text should describe a time-limited offer that fits the countdown premise
  • Good examples (DE): "Jetzt starten und 50% Rabatt im ersten Jahr sichern", "Ihren KI-Assistenten jetzt aktivieren — Sonderkonditionen sichern"
  • Good examples (EN): "Start now and save 50% in your first year", "Activate your AI assistant now — special terms available"
  • Never use "Kostenlose Erstberatung" — the countdown is for an offer deadline, not a consultation
Apply the fix — update the
demo_pages
table directly via Supabase:
Use mcp__plugin_supabase_supabase__execute_sql with:
  project_id: "fevtfywriufbqnvbgyrm"
  query: UPDATE demo_pages SET offer_text = '[corrected offerText]', offer_expires_at = '[corrected ISO date]' WHERE id = '[demoId]'
Announce:
Auto-fixed: Updated [Company] countdown — expires [date], text: "[offerText]"
After auto-fixing, mark the Countdown set check as PASS (fixed).
如果倒计时设置检查失败(缺失
offerExpiresAt
、日期已过期或
offerText
不正确):
确定正确的截止日期:
  • 如果CRM商机的备注中提及具体截止日期 → 使用该日期
  • 否则 → 设置为当前日期后的7天(ISO 8601格式)
确定正确的优惠文本:
  • 文本应描述符合倒计时场景的限时优惠
  • 优秀示例(德语):"Jetzt starten und 50% Rabatt im ersten Jahr sichern"、"Ihren KI-Assistenten jetzt aktivieren — Sonderkonditionen sichern"
  • 优秀示例(英语):"Start now and save 50% in your first year"、"Activate your AI assistant now — special terms available"
  • 禁止使用"Kostenlose Erstberatung" — 倒计时用于优惠截止日期,而非咨询
应用修复 — 通过Supabase直接更新
demo_pages
表:
使用mcp__plugin_supabase_supabase__execute_sql,参数:
  project_id: "fevtfywriufbqnvbgyrm"
  query: UPDATE demo_pages SET offer_text = '[corrected offerText]', offer_expires_at = '[corrected ISO date]' WHERE id = '[demoId]'
通知:
自动修复完成:更新[公司名称]的倒计时 — 截止日期[date],文本:"[offerText]"
自动修复完成后,将倒计时设置检查标记为PASS(已修复)。

2f — Make a Decision

2f — 做出决策

  • 6+ PASS (including auto-fixed), 0 critical FAILs
    OK_TO_SEND
  • Any critical FAIL (wrong company, wrong language, hallucinated content) →
    NEEDS_FIX
  • Minor issues only (greeting could be better) →
    OK_TO_SEND
    with note about improvements
  • Auto-fixed items count as PASS but should be mentioned in the review note

  • 6项及以上PASS(包括自动修复项),无严重FAIL
    OK_TO_SEND
  • 存在任何严重FAIL(公司信息错误、语言错误、幻觉内容) →
    NEEDS_FIX
  • 仅存在 minor 问题(问候语可优化) →
    OK_TO_SEND
    ,并在备注中提及改进建议
  • 自动修复项计为PASS,但应在审核备注中提及

STEP 3 — Update CRM

步骤3 — 更新CRM

If OK_TO_SEND:

若标记为OK_TO_SEND:

bash
undefined
bash
undefined

Update demoStatus

更新demoStatus

curl -s -X POST https://crm.psquared.dev/graphql
-H "Content-Type: application/json"
-H "Authorization: Bearer $<CRM_TOKEN_VAR>"
-d '{"query":"mutation { updateOpportunity(id: "[opportunityId]", data: { demoStatus: OK_TO_SEND, demoReviewIssues: null }) { id } }"}'
undefined
curl -s -X POST https://crm.psquared.dev/graphql
-H "Content-Type: application/json"
-H "Authorization: Bearer $<CRM_TOKEN_VAR>"
-d '{"query":"mutation { updateOpportunity(id: "[opportunityId]", data: { demoStatus: OK_TO_SEND, demoReviewIssues: null }) { id } }"}'
undefined

If NEEDS_FIX:

若标记为NEEDS_FIX:

bash
curl -s -X POST https://crm.psquared.dev/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<CRM_TOKEN_VAR>" \
  -d '{"query":"mutation { updateOpportunity(id: \"[opportunityId]\", data: { demoStatus: NEEDS_FIX, demoReviewIssues: \"[Issue 1: description. Issue 2: description. Suggested fixes: ...]\" }) { id } }"}'

bash
curl -s -X POST https://crm.psquared.dev/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $<CRM_TOKEN_VAR>" \
  -d '{"query":"mutation { updateOpportunity(id: \"[opportunityId]\", data: { demoStatus: NEEDS_FIX, demoReviewIssues: \"[问题1:描述。问题2:描述。建议修复方案:...]\" }) { id } }"}'

STEP 4 — Report

步骤4 — 生成报告

Announce:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Demo Review complete.

✅ OK to send:
  - [Company A] — [brief reason]
  - [Company B] — [brief reason]

❌ Needs fix:
  - [Company C] — [issue summary]

Next step: Send approved demos to prospects
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

通知:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
演示审核完成。

✅ 可发送:
  - [公司A] — [简要原因]
  - [公司B] — [简要原因]

❌ 需要修复:
  - [公司C] — [问题摘要]

下一步:将已通过审核的演示项目发送给潜在客户
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

CRM Fields Updated by This Skill

本技能更新的CRM字段

StepFieldValueWhen
3 (OK)
demoStatus
OK_TO_SEND
Demo passed QA
3 (OK)
demoReviewIssues
null
Clear any previous issues
3 (FIX)
demoStatus
NEEDS_FIX
Demo failed QA
3 (FIX)
demoReviewIssues
"Issue 1: ... Issue 2: ..."
What's wrong and how to fix
Reads:
demoStatus
(filter PENDING_REVIEW),
demoUrl
(demo page link), company domain
Does NOT touch:
outreachSentAt
,
followupSentAt
,
agenthubAccountId
,
stage
Important:
demoStatus
is a GraphQL enum — use bare values (no quotes):
demoStatus: OK_TO_SEND
步骤字段触发条件
3(OK)
demoStatus
OK_TO_SEND
演示项目通过QA审核
3(OK)
demoReviewIssues
null
清除所有之前的问题记录
3(FIX)
demoStatus
NEEDS_FIX
演示项目未通过QA审核
3(FIX)
demoReviewIssues
"问题1:... 问题2:..."
问题描述及修复建议
读取字段:
demoStatus
(筛选PENDING_REVIEW)、
demoUrl
(演示页面链接)、公司域名
不修改字段:
outreachSentAt
followupSentAt
agenthubAccountId
stage
重要提示:
demoStatus
是GraphQL枚举类型 — 使用裸值(无需引号):
demoStatus: OK_TO_SEND