ce-promote

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Promotion Copy

推广文案

Turn a feature that just shipped into copy-pasteable, user-facing announcement copy, right inside the engineering workflow — so the messaging doesn't wait for a separate marketing pass.
Done when: every drafted channel is presented as a labeled, copy-pasteable block and the user has been offered a revision. This skill drafts only — it never posts, publishes, schedules, commits, or opens PRs. Posting is a human action.
It is spiral-agnostic: with nothing installed it drafts directly from the editorial and social fundamentals in Path B. When the Spiral CLI is present and authed, drafts come back voice-matched to the user's brand — an enhancement, never a requirement.
将刚上线的功能转化为可直接复制粘贴的面向用户的公告文案,直接在工程工作流内完成——这样无需等待单独的营销流程就能产出宣传内容。
完成标志: 每个撰写好的渠道文案都以带标签的可复制粘贴区块呈现,且已向用户提供修改选项。本技能仅负责撰写文案——绝不进行发布、推送、排期、提交或创建PR操作。 发布是人工操作。
它与Spiral无关:在未安装任何工具的情况下,它会直接基于Path B中的编辑和社交基础规则撰写文案。当Spiral CLI已安装并完成认证时,撰写的文案会匹配用户品牌的语气——这是一项增强功能,而非必需条件。

Phase 1 — Figure out what shipped

阶段1 — 明确已上线的内容

A free-form description in the arguments is the source of truth. Otherwise derive it from context, using what's available and blocking on no single source:
  • Merged/active PR —
    gh pr view --json title,body,url
    (the title and body usually state the user-facing value)
  • The diff —
    git diff main...HEAD --stat
    , skimming notable changes so the claim is grounded in what actually changed
  • Changelog — the top or
    [Unreleased]
    entry in
    docs/changelog.md
    ,
    CHANGELOG.md
    , or similar
  • Recent commits —
    git log --oneline -15
    for the arc of the change
Then write a 1-3 sentence summary of the user-facing value: what a user can now do that they couldn't before, and why they'd care. Outcome, not implementation — "You can now export any report to CSV in one click", not "Added a CsvSerializer and an export endpoint." If you can't confidently tell what shipped, ask one short question rather than guessing.
参数中的自由格式描述为信息来源。否则从上下文推导,利用可用信息,不依赖单一来源:
  • 已合并/活跃的PR —
    gh pr view --json title,body,url
    (标题和正文通常会说明面向用户的价值)
  • 代码差异 —
    git diff main...HEAD --stat
    ,浏览显著变更,确保文案基于实际发生的修改
  • 更新日志 —
    docs/changelog.md
    、
    CHANGELOG.md
    或类似文件中的顶部条目或
    [Unreleased]
    条目
  • 近期提交记录 —
    git log --oneline -15
    ,了解变更的整体脉络
然后撰写1-3句话的面向用户的价值总结:用户现在能做什么之前做不到的事,以及他们为什么关心。聚焦成果而非实现细节——比如“现在只需一键即可将任意报告导出为CSV格式”,而非“新增了CsvSerializer和导出端点”。如果无法确定已上线的内容,提出一个简短的问题而非猜测。

Phase 2 — Pick channels

阶段2 — 选择渠道

Default to an X post (or short thread) plus a one-line changelog / release blurb. If the user named channels — LinkedIn, email, a blog intro, a demo script — draft those instead of or in addition to the defaults. Scale to the change: a small fix warrants one or two short drafts, a flagship feature a cross-channel set. Don't force a fixed template.
默认生成X平台帖子(或短线程)加上一行更新日志/发布简介。如果用户指定了渠道——LinkedIn、邮件、博客引言、演示脚本——则撰写这些渠道的文案,替代或补充默认渠道。根据变更规模调整:小修复只需1-2篇短文案,旗舰功能则需要跨渠道的文案组合。不要强制使用固定模板。

Phase 3 — Draft the copy

阶段3 — 撰写文案

Detect Spiral's state with two quick, non-blocking commands:
bash
which spiral
spiral auth status --json 2>/dev/null
  • No binary -> Absent
  • "authenticated": true
    -> Ready
  • "authenticated": false
    -> Unauthed
  • Output isn't JSON (older CLI that ignores
    --json
    ) -> ready iff it contains
    spiral_sk_
    , else unauthed
Ready -> Path A. Absent or Unauthed -> Path 0, then Path A if setup completes, else Path B. Never let a Spiral failure, timeout, or odd output block or slow the skill — when in doubt, treat it as not-ready and continue.
通过两个快速、非阻塞的命令检测Spiral的状态:
bash
which spiral
spiral auth status --json 2>/dev/null
  • 无二进制文件 -> 未安装
  • "authenticated": true
    -> 已就绪
  • "authenticated": false
    -> 未认证
  • 输出不是JSON(忽略
    --json
    的旧版CLI)-> 若输出包含
    spiral_sk_
    则已就绪,否则未认证
已就绪 -> 路径A。未安装或未认证 -> 路径0,若设置完成则进入路径A,否则进入路径B。绝不要让Spiral的故障、超时或异常输出阻碍或减慢技能运行——如有疑问,视为未就绪并继续。

Path 0 — Offer Spiral setup (once, declinable)

路径0 — 提供Spiral设置(仅一次,可拒绝)

Go straight to Path B when running non-interactively — there is no human to answer. Otherwise offer setup once: read
references/spiral-cli.md
and follow its Path 0 section for the opt-out check, the blocking question, the agent-run
spiral login --json
flow (the API key never passes through the agent, and the user never pastes one into chat), the install path, and how the opt-out is recorded. Skip to Path B only when that check finds a recorded opt-out — it is the authority on what counts as recorded, and a naive config scan misreads
ce-setup
's commented template example as one, silently suppressing the offer.
Two properties that section depends on: any dismissal records the opt-out, so a single first-run decline stops the offer for good in this repo, and a decline always proceeds to Path B rather than blocking. If a human is present but no blocking-question tool is in the current tool list, fall back to a numbered list of the two options in chat and wait — do not skip the offer, and never call a user-facing question tool to discover whether one exists.
非交互式运行时直接进入路径B——没有人工用户可以回应。否则仅一次提供设置:阅读
references/spiral-cli.md
并遵循其路径0部分的内容,包括退出检查、阻塞式问题、由Agent执行的
spiral login --json
流程(API密钥绝不会经过Agent,用户也无需在聊天中粘贴密钥)、安装路径,以及如何记录退出选择。仅当该检查发现已记录退出选择时才跳转到路径B——该记录是权威依据,单纯的配置扫描会错误地将
ce-setup
的注释模板示例视为退出选择,从而静默取消提供设置。
该部分依赖两个特性:任何形式的拒绝都会记录退出选择,因此首次运行时的一次拒绝会永久停止在该仓库中提供设置,且拒绝后始终进入路径B而非阻塞。如果有人工用户但当前工具列表中没有阻塞式问题工具,则退回到在聊天中列出两个选项的编号列表并等待——不要跳过提供设置,也绝不要调用面向用户的问题工具来确认是否存在该工具。

Path A — Spiral ready (voice-matched)

路径A — Spiral已就绪(匹配品牌语气)

Read
references/spiral-cli.md
before composing the prompt.
Whether Spiral returns a multi-channel set or several variations of one channel is phrasing-driven (channel keywords and cue words vs.
--num-drafts
), and getting it wrong silently returns the wrong number or shape of drafts — don't restate those rules from memory.
Always pass
--instant
and
--json
; parse
drafts[]
(each carries its own
channel
) plus
session_id
. Present every returned draft, grouped by
channel
— Spiral decides how many drafts per channel, so never assume one-per-channel or drop extras. If the
spiral write
call errors or returns no usable drafts, fall back silently to Path B for the affected channels.
撰写提示前请阅读
references/spiral-cli.md
。
Spiral返回多渠道文案组合还是同一渠道的多个变体取决于措辞(渠道关键词和提示词 vs
--num-drafts
),如果出错会静默返回错误数量或格式的文案——不要凭记忆重述这些规则。
始终传递
--instant
和
--json
参数;解析
drafts[]
(每个条目包含自身的
channel
)以及
session_id
。展示所有返回的文案,按
channel
分组
——Spiral决定每个渠道的文案数量,因此不要假设每个渠道只有一篇或丢弃多余的文案。如果
spiral write
调用出错或未返回可用文案,则静默退回到路径B撰写受影响渠道的文案。

Path B — Direct drafting

路径B — 直接撰写文案

No Spiral needed; draft directly. (The Spiral path goes further: brand-voice matching, humanization, saved styles, and cross-channel campaign orchestration.)
Every channel:
  • Lead with the user-facing outcome — what someone can now do, not how it was built.
  • One idea per piece. Cut windup, hedges, and throat-clearing.
  • Plain, active language. Strip AI tells: "thrilled/excited to announce", "game-changer", "in today's fast-paced world", "unlock/leverage/seamless", em-dash padding.
  • Read it back as if saying it to one user. If a person wouldn't say it, rewrite it.
Distributed channels: the first line is the hook and has to earn the next line (feeds truncate) — no preamble. Match each channel's native shape and length; never reuse one draft verbatim across channels. One clear CTA where the channel supports it. Hashtags 0-2, and only where the channel expects them.
Per channel:
  • X — value in the first line; ~1-3 tight lines. Thread only when there's more than one beat worth its own line.
  • Changelog / release blurb — one declarative line naming the new capability. Plain, not promotional.
  • LinkedIn — a short paragraph: human angle (why it matters), then the what. Warmer than X.
  • Email — benefit-stating subject + 2-4 sentence body + one CTA.
  • Blog intro — one opening paragraph framing the problem and the new capability; leave the deep-dive to the author.
  • Demo script — 3-6 spoken beats: hook, problem, action, payoff.
One strong draft per channel by default; produce more only when asked ("3 tweet options"), capped at ~3.
无需Spiral;直接撰写文案。(Spiral路径的优势在于:匹配品牌语气、人性化处理、保存样式以及跨渠道活动编排。)
所有渠道通用规则:
  • 以面向用户的成果开篇——用户现在能做什么,而非功能如何构建。
  • 每篇文案聚焦一个核心观点。删除冗长的铺垫、含糊其辞和客套话。
  • 使用简洁、主动的语言。去除AI生成痕迹:如“激动地宣布”、“游戏规则改变者”、“在当今快节奏的世界中”、“解锁/利用/无缝”、破折号填充内容等。
  • 像对单个用户说话一样朗读文案。如果人不会这么说,就重写。
分布式渠道: 第一行是钩子,必须吸引用户继续阅读(信息流会截断内容)——不要有开场白。匹配每个渠道的原生格式和长度;绝不要在不同渠道间直接复用同一篇文案。在渠道支持的情况下添加一个清晰的CTA。使用0-2个话题标签,且仅在渠道适合的情况下使用。
各渠道具体规则:
  • X平台 — 第一行点明价值;约1-3行简洁内容。只有当有多个值得单独成线的要点时才使用线程。
  • 更新日志/发布简介 — 一句陈述性的话,点明新功能。简洁客观,无需宣传语气。
  • LinkedIn — 一小段文字:人性化角度(为什么重要),然后说明功能。比X平台的语气更亲切。
  • 邮件 — 点明收益的主题 + 2-4句正文 + 一个CTA。
  • 博客引言 — 一段开篇文字,阐述问题和新功能;深入内容留给作者。
  • 演示脚本 — 3-6个口语化要点:钩子、问题、操作、收益。
默认每个渠道撰写一篇优质文案;仅在用户要求时生成更多(如“3条推文选项”),上限约3篇。

Phase 4 — Present the drafts

阶段4 — 呈现文案

Show every draft as a clean, copy-pasteable block labeled by channel:
undefined
将所有文案展示为清晰的、可复制粘贴的区块,并标注渠道:
undefined

X post

X平台帖子

<the copy> ```
When Path A produced them, also surface the
session_id
and each draft's
url
so the user can open and tweak them in the Spiral web app. Offer to revise (tone, length, angle, more variations, another channel). Do not post, publish, schedule, commit, or open a PR — end by reminding the user the drafts are theirs to ship.
<文案内容>

如果是通过路径A生成的文案,还要显示`session_id`和每篇文案的`url`,以便用户在Spiral网页应用中打开并调整。提供修改选项(语气、长度、角度、更多变体、其他渠道)。**请勿发布、推送、排期、提交或创建PR**——最后提醒用户这些文案由他们自行发布。