跳到正文
cccskills
免费在 GitHub 公开

cmo-studio-integration

When mktg-studio is running on this machine, /cmo proactively narrates work into the dashboard via Bash + curl against the localhost HTTP API. Detect via /api/health, then log every meaningful action — the user sees what /cmo is doing in real time.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(1)

  • SKILL.md8.5 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

/cmo ↔ mktg-studio integration

mktg-studio is the local dashboard that visualises everything you do. When it's running, the user has a browser open at http://localhost:3000 showing primary surfaces (Pulse, Signals, Publish, Brand) and an Activity panel on the right. Trend radar lives inside Signals. Audience summary and recommended next actions live inside Pulse.

This skill teaches you to drive that dashboard without being asked. No SDKs. No special tools. Every action is a curl you already know how to write.

1. Detect first

On every turn, before doing anything else marketing-y, run:

STUDIO=${STUDIO_BASE:-http://localhost:3001}
curl -fsS -m 2 "$STUDIO/api/health" >/dev/null 2>&1 && STUDIO_UP=1 || STUDIO_UP=0
  • STUDIO_UP=1 → studio is up, follow the rules below
  • STUDIO_UP=0 → studio is down, behave exactly as you would in a CLI-only setup. Don't surface the unreachable studio to the user — they probably don't have it open.

Cache the result for the rest of the turn — don't hammer health.

If you want to confirm the wire shapes you're about to send, fetch the schema once per session (it's static):

curl -fsS "$STUDIO/api/schema" | jq '.routes[].path'
curl -fsS "$STUDIO/api/schema?route=/api/activity/log" | jq
curl -fsS "$STUDIO/api/help" | jq '.data.entryPoints'

2. The five verbs

Every meaningful action you take should map to one or more of these endpoints. Skip them when they don't apply — don't be noisy.

VerbEndpointCall when
LogPOST /api/activity/logAfter running any skill, writing a brand file, sending a publish, calling out errors. One entry per discrete action.
NotePOST /api/brand/note or POST /api/brand/writeWhen you've created or edited a brand/*.md file. /write is the agent-native path (lock-protected); /note is the lightweight "fyi I edited this externally" path.
PushPOST /api/opportunities/pushWhen your analysis surfaces a recommended next action. Set priority 0-100 — be honest about urgency.
ToastPOST /api/toastInline confirmations the user should see immediately. level: "success" | "info" | "warn" | "error".
NavigatePOST /api/navigateWhen the result of your work lives on a specific surface and you want the user to look there. Valid tabs: pulse, signals, publish, brand. Use {"tab":"signals"} for Trend radar (filter.mode is dropped server-side; do not send it). Example: after landscape-scan finishes, switch to Signals/Trend radar; after brand-voice or voice-extraction, switch to brand.

Copy-paste recipes

# Log a skill run
curl -fsS -X POST "$STUDIO/api/activity/log" \
  -H 'content-type: application/json' \
  -d '{"kind":"skill-run","skill":"landscape-scan","summary":"Refreshed landscape, 5 new claims","filesChanged":["brand/landscape.md"]}'

# Note a brand-file write (excerpt is the first ~800 chars)
EXCERPT=$(head -c 800 brand/voice-profile.md | jq -Rs .)
curl -fsS -X POST "$STUDIO/api/brand/note" \
  -H 'content-type: application/json' \
  -d "{\"file\":\"brand/voice-profile.md\",\"excerpt\":$EXCERPT}"

# Push an opportunity
curl -fsS -X POST "$STUDIO/api/opportunities/push" \
  -H 'content-type: application/json' \
  -d '{"skill":"keyword-research","reason":"You have a landscape but no keyword-plan yet — that gates seo-content","priority":80}'

# Toast
curl -fsS -X POST "$STUDIO/api/toast" \
  -H 'content-type: application/json' \
  -d '{"level":"success","message":"Landscape refreshed — see Trend radar"}'

# Navigate
curl -fsS -X POST "$STUDIO/api/navigate" \
  -H 'content-type: application/json' \
  -d '{"tab":"signals"}'

3. Brand files are first-class

Writing a brand file directly with the Write tool works but doesn't update the studio. Prefer the HTTP path:

# 1. Read current content + grab the mtime for optimistic locking
RES=$(curl -fsS "$STUDIO/api/brand/read?file=voice-profile.md")
MTIME=$(echo "$RES" | jq -r '.data.mtime')

# 2. Build new content in-memory (your editing logic here)
CONTENT=$(jq -Rs . < new-voice-profile.md)

# 3. Atomic write — fires brand-file-changed SSE so dependent tabs refresh
curl -fsS -X POST "$STUDIO/api/brand/write" \
  -H 'content-type: application/json' \
  -d "{\"file\":\"voice-profile.md\",\"content\":$CONTENT,\"expectedMtime\":\"$MTIME\"}"

# 4. Log the activity
curl -fsS -X POST "$STUDIO/api/activity/log" \
  -H 'content-type: application/json' \
  -d '{"kind":"brand-write","filesChanged":["brand/voice-profile.md"],"summary":"Made the voice more casual — 3 anchor sentences swapped"}'

If the user edited the same file in their text editor while you were writing, the expectedMtime mismatch returns 409 CONFLICT with a fix hint pointing back to /api/brand/read to re-fetch + merge.

If you need to re-research a brand file, queue the owning skill:

curl -fsS -X POST "$STUDIO/api/brand/regenerate" \
  -H 'content-type: application/json' \
  -d '{"file":"landscape.md"}'
# → { ok: true, data: { jobId, skill, file } }
# poll via curl -fsS "$STUDIO/api/jobs/<jobId>" or watch /api/events

4. The idiomatic turn

A typical /cmo turn that runs a skill, writes a brand file, and recommends a next action:

STUDIO=${STUDIO_BASE:-http://localhost:3001}
curl -fsS -m 2 "$STUDIO/api/health" >/dev/null || exit 0   # 1. detect

curl -fsS -X POST "$STUDIO/api/activity/log" -H 'content-type: application/json' \
  -d '{"kind":"skill-run","skill":"landscape-scan","summary":"Refreshing landscape from 18 sources"}'

# 2. (do the actual work — Exa search, write brand/landscape.md)

EXCERPT=$(head -c 800 brand/landscape.md | jq -Rs .)
curl -fsS -X POST "$STUDIO/api/brand/note" -H 'content-type: application/json' \
  -d "{\"file\":\"brand/landscape.md\",\"excerpt\":$EXCERPT}"

curl -fsS -X POST "$STUDIO/api/activity/log" -H 'content-type: application/json' \
  -d '{"kind":"skill-run","skill":"landscape-scan","summary":"Done — 5 new claims, 2 deprecated","filesChanged":["brand/landscape.md"]}'

curl -fsS -X POST "$STUDIO/api/opportunities/push" -H 'content-type: application/json' \
  -d '{"skill":"competitor-alternatives","reason":"Fresh landscape — write 3 X vs Y pages","priority":75}'

curl -fsS -X POST "$STUDIO/api/navigate" -H 'content-type: application/json' \
  -d '{"tab":"signals"}'

curl -fsS -X POST "$STUDIO/api/toast" -H 'content-type: application/json' \
  -d '{"level":"success","message":"Landscape refreshed — see Trend radar"}'

Eight calls. Each one is fire-and-forget, returns under 50ms, and the dashboard updates in real time via SSE. The user watches the work happen.

5. Don't break

  • Every endpoint returns {ok: true, ...} or {ok: false, error: {code, message, fix?}}. Predictable envelope.
  • Three documented exceptions return bare tab-shaped objects (no ok/data wrapper): GET /api/opportunities, GET /api/audience/profiles, GET /api/briefs. Treat a 200 with the expected top-level keys (opportunities, profiles, briefs) as success; don't look for .ok on these three.
  • On connection failure (studio down), proceed as if the dashboard didn't exist. Don't retry.
  • On {ok: false} with a fix field, surface or follow it — it's agent-actionable by design.
  • /api/navigate and /api/toast are SSE-only (no DB write). Spamming them is harmless but ugly. Send one navigate per logical destination change, one toast per user-facing milestone.
  • All mutating endpoints accept ?dryRun=true — append it during development to validate request shape without side effects.

6. What NOT to do

  • Don't POST /api/navigate between every step of a multi-skill playbook — switch tabs once, at the end, when the user should look at the result.
  • Don't POST /api/toast for routine logs — that's what /api/activity/log is for. Toasts are for things the user should drop everything and notice.
  • Don't try to POST /api/brand/write outside brand/*.md — the path validator rejects everything else with BAD_INPUT.
  • Don't fetch /api/schema more than once per session — the wire shape is static within a server boot.

Reference

  • Full HTTP contract with copy-pasteable curls: docs/cmo-integration.md
  • Endpoint shapes (live, runtime-introspectable): GET /api/schema, GET /api/help
  • 5-minute reproducible demo: docs/DEMO.md

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Add a new expert to the Remotion experts page

中文简介正在准备中。当前显示原文说明。

MoizIbnYousaf/marketing-cli322026年10月20日 更新

add-sfx

免费

Add a new sound effect to @remotion/sfx

中文简介正在准备中。当前显示原文说明。

MoizIbnYousaf/marketing-cli322026年10月20日 更新

Use when setting up a secure email inbox for any AI agent — configuring inbound email via Resend, webhooks, tunneling for local development, and implementing security measures to prevent prompt injection attacks. Also use when someone mentions 'agent email', 'bot inbox', 'receive emails for agent', 'agent webhook', 'email security for AI', 'prompt injection via email', 'inbound email for bot', or wants their AI agent to receive and respond to emails securely.

中文简介正在准备中。当前显示原文说明。

MoizIbnYousaf/marketing-cli322026年10月20日 更新

ai-seo

免费

Builds, measures, and improves an Answer Engine Optimization program across ChatGPT, Perplexity, Claude, Gemini, Google AI Overviews, and Copilot. Use for AEO, GEO, LLMO, AI search visibility, AI citations, brand mentions, answer-engine monitoring, llms.txt, AI crawler audits, or questions like 'what does AI say about us?' and 'why are competitors cited instead of us?'. Produces a durable evidence report and prioritized gameplan, not a one-shot content checklist.

中文简介正在准备中。当前显示原文说明。

MoizIbnYousaf/marketing-cli322026年10月20日 更新

Generate Apple App Store screenshot pages as a Next.js app with html-to-image export at required resolutions. Screenshots are advertisements, not documentation — every screenshot sells one idea. Use when building App Store screenshots, generating exportable marketing screenshots for iOS apps, or creating programmatic screenshot generators. Triggers on 'app store screenshots', 'App Store', 'screenshot generator', 'iOS screenshots', 'marketing screenshots', 'phone mockup', 'ASO screenshots', 'app store assets', 'app listing', 'app store page', or 'app preview images'. Also use when someone is about to submit an app and needs store assets, or when they say 'make my app store page look good'. Includes iPhone and iPad mockup components with pre-measured dimensions.

中文简介正在准备中。当前显示原文说明。

MoizIbnYousaf/marketing-cli322026年10月20日 更新

Build detailed buyer personas and audience profiles from research. Use this skill whenever the user mentions audience, buyer persona, ideal customer, target market, ICP, watering holes, 'who am I selling to', customer research, or audience profile. Also use when content feels unfocused or generic (that's an audience problem), when conversion is low because messaging doesn't resonate, when starting any new project (audience should be first), or when any downstream skill needs audience.md but it doesn't exist yet. Even if the user doesn't explicitly ask for audience research, trigger this if they're writing copy or building a landing page without a clear audience defined. Three approaches: Quick Profile, Persona Build, Community Mining.

中文简介正在准备中。当前显示原文说明。

MoizIbnYousaf/marketing-cli322026年10月20日 更新

查看 MoizIbnYousaf 的全部技能

报告此技能的问题