Agent skill

Spec Promote

by leo-kuang-ai in leo-kuang-ai/spec-first

Draft launch or promotion copy for a shipped feature. An agent skill from leo-kuang-ai/spec-first.

MITAuto-check passedDevelopment

Install Spec Promote

skills CLI
$ npx skills add leo-kuang-ai/spec-first --skill spec-promote -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install leo-kuang-ai/spec-first spec-promote --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/leo-kuang-ai/spec-first.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/spec-promote .claude/skills/spec-promote && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
spec-promote
GitHub stars
107
Token cost
~2.8k tokens
SKILL.md length
1,521 words
Files
11 (incl. scripts, references)
Skills in repo
35
Repo updated
First seen
Licence
MIT

At a glance

Draft launch or promotion copy for a shipped feature. An agent skill from leo-kuang-ai/spec-first.

  • Works in 4 steps: Figure out what shipped → Pick channels → Draft the copy → …
  • Development work in your project
  • SKILL.md covers Purpose, Usage, Phase 1 — Figure out what… and Phase 2 — Pick channels, plus 3 more sections
  • Runs JavaScript and Shell scripts from its folder; calls gh, git and node

What it does

Spec Promote is an agent skill from leo-kuang-ai/spec-first. Draft launch or promotion copy for a shipped feature.

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 19 other files, including scripts and reference files (for example `evals/cases/no-publish-side-effects.yaml`, `evals/cases/nothing-shipped-asks.yaml` and `evals/eval.yaml`).

It sits in Development. The repository describes itself as: 仓库原生 AI Coding Harness —— 把一次性 AI 对话变成可治理、可验证、可沉淀的工程闭环 · spec-first.cn. The licence is MIT.

When your agent uses it

  • Development work in your project

Example prompts

  • “/spec-promote”

Requirements

  • Node.js
  • A Bash shell

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Figure out what shipped
  2. Pick channels
  3. Draft the copy
  4. Present the drafts

What it can do on your machine

Read from SKILL.md and the folder at commit 74655dc. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (JavaScript and Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • gh
    • git
    • node
    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh, git and npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Spec Promote loads about 2.8k tokens when it runs, and up to ~6k if it reads all its reference files. Until then it costs about 17 tokens; SKILL.md has 1,521 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~17
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from leo-kuang-ai/spec-first at commit 74655dc, republished under its MIT licence (© leo-kuang-ai). 1,521 words, ~2,782 tokens.

Download SKILL.mdSave it as .claude/skills/spec-promote/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.
name
spec-promote
description
Draft launch or promotion copy for a shipped feature.
disable-model-invocation
true
argument-hint
[optional: what shipped and/or channels, e.g. 'a tweet thread and a LinkedIn post']

spec-promote

Turn a feature that just shipped into copy-pasteable, user-facing announcement copy — right inside the engineering workflow.

Purpose

After you ship, the messaging shouldn't wait for a separate marketing pass. spec-promote figures out what shipped, picks the right channels, and drafts the copy. It is spiral-agnostic by default: with nothing installed it draws on a lite layer of editorial and social-media expertise to produce strong channel-specific copy. When the Spiral CLI (see references/spiral-cli.md) is present and authed, it uses Spiral so the drafts are voice-matched to your brand — a subtle enhancement, never a requirement.

The promotion output is draft-only. It never posts, publishes, commits, or opens PRs. Posting is a human action. The only durable local preference exception is the separately disclosed and authorized Spiral opt-out write described in Path 0; it is not promotion output and must remain local-only.

Usage

bash
spec-promote                                   # Derive what shipped from context, draft defaults
spec-promote [free-form description]           # You describe what shipped
spec-promote a tweet thread and a LinkedIn post   # Request specific channels
spec-promote 3 tweet options for the new export feature

Phase 1 — Figure out what shipped

If the user gave a free-form description of the feature, use it as the source of truth.

Otherwise, derive it from context (use what's available; don't block on any one source):

  • Merged/active PR — gh pr view --json title,body,url 2>/dev/null (and gh pr view for the current branch). The title and body usually state the user-facing value.
  • The diff — git diff main...HEAD --stat and skim notable changes to ground the claim in what actually changed.
  • Changelog — the top/[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. Describe the outcome, not the 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 the user one short question rather than guessing.

Phase 2 — Pick channels

Default to a small, sensible set:

  • An X post or short thread (lead with the value; thread only if the change warrants it)
  • A one-line changelog / release blurb

Scale to what the change warrants and to what the user asked for. If they named channels ("LinkedIn", "email", "a blog intro", "a short demo script"), draft those instead of or in addition to the defaults. A small fix needs one or two short drafts; a flagship feature can justify a cross-channel set. Don't force a fixed template.

Phase 3 — Draft the copy

First, detect Spiral's state with the Skill-owned bounded probe. Resolve SKILL_DIR from the spec-promote/SKILL.md you loaded; do not run spiral auth status directly because provider stdout/stderr may contain secret-like fields:

bash
SKILL_DIR="<absolute path of the directory containing this SKILL.md>"
node "$SKILL_DIR/scripts/check-spiral-auth.cjs"

Classify into one of three states:

  • Unavailable — status: unavailable → Path 0 (install), then Path A if set up, else Path B.
  • Ready — status: ready and authenticated: true → Path A (voice-matched).
  • Not ready / unverified — every other allowlisted status → Path 0 when interactive, else Path B. Treat non-JSON, timeout, non-zero, and malformed provider output as unverified without inspecting or surfacing the raw bytes.

Never let a Spiral failure, timeout, or odd output block or slow the skill — when in doubt, treat it as not-ready and continue.

Path 0 — Offer Spiral setup (first run, declinable)

When Spiral isn't ready, offer to set it up once — unless the user previously opted out. The point is one proactive nudge, never a recurring one, and never a blocker: a decline always proceeds to Path B. Any dismissal records the opt-out, so a single first-run decline stops the offer for good in this repo — the user is never asked twice.

Read references/spiral-cli.md for the exact setup prompt (built with the platform's blocking-question tool), the connect/install steps, and how the opt-out is recorded so later runs skip this. In short:

  • Unauthed → the agent runs spiral login --json (CLI >= 1.8.0; non-blocking, the API key never passes through the agent). On status: already_authenticated → use Path A. On status: pending → surface the auth_url, the user approves in their browser, then re-run the bounded auth probe after the user's confirmation; status: ready → Path A. Never have the user paste a key into chat. (Older CLI without agent login → suggest npm i -g @every-env/spiral-cli@latest, or have the user run spiral login themselves.) Escape hatch: "or the agent can just draft directly, without Spiral's personalization and humanization."
  • Absent → guide the user to install + connect in one step via the pairing-code command from Settings → Connect an Agent.
  • Decline → record the opt-out (best-effort) and go to Path B.

Skip Path 0 entirely — straight to Path B — when the opt-out is already recorded, or when running headless / non-interactive (no human to answer). If a human is present but no blocking-question tool is available, do not skip — fall back to a numbered list of the two options in chat and wait for a reply (per the Ask section of references/spiral-cli.md).

Path A — Spiral ready (voice-matched)

Use the Spiral CLI so drafts match the user's brand voice. Read references/spiral-cli.md before composing the prompt — multi-channel vs. single-channel-variations is phrasing-driven (channel keywords / cue words vs. --num-drafts) and getting it wrong silently returns the wrong number or shape of drafts. The exact phrasing rules live there; don't restate them from memory. Essentials:

Before sending feature context or promotion copy to Spiral, record provider_egress_authorization: authorized | missing. Authentication, installation, prior use, requested channels, and general drafting intent do not authorize a run-local content transfer. Display the provider, content categories being sent, persistence behavior, and local Path B alternative; proceed only when the current request or a new confirmation explicitly authorizes this transfer. Missing authority returns provider_egress_authorization_missing and uses Path B with zero spiral write calls.

  • 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 — multi-channel runs often return several per channel — so never assume one-per-channel or drop extras.

If the authorized spiral write call errors or returns no usable drafts, fall back to Path B for the affected channels, but do not describe the run as local-only. Return a safe provider receipt with provider_attempt: attempted, delivery_status: unknown, an allowlisted reason_code, persistence_status: possible-or-unknown, and fallback_used: true. Never copy raw Spiral stdout/stderr, exception text, internal commentary, or secret-like fields into chat, logs, or durable artifacts.

Show full SKILL.md (491 more words)Show less
Path B — Direct drafting (lite editorial & social expertise)

No Spiral needed — draft strong copy directly using a compact layer of editorial and social-media fundamentals. (The Spiral path goes further: brand-voice matching, humanization, saved styles, and cross-channel campaign orchestration.)

Editorial fundamentals — 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.
  • Be concrete and specific; show the value, don't assert it.
  • Plain, active language. Strip AI tells — "thrilled/excited to announce," "game-changer," "in today's fast-paced world," "unlock/leverage/seamless," em-dash padding.
  • Sanity check: read it as if saying it to one user. If a person wouldn't say it, rewrite it.

Social fundamentals — 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, only where the channel expects them — never a wall of tags.

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 strong 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.

Drafts per channel: one strong draft by default; produce more only when asked ("3 tweet options"), capped ~3.

Phase 4 — Present the drafts

Show every draft as a clean, copy-pasteable block, labeled by channel. For each:

### X post
<the copy>
  • If Spiral 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.
  • If Path 0 recorded the local preference exception, disclose that local-only write once and keep it separate from the draft-output claim.

Examples

Single-channel variations — "3 tweet options":

User: spec-promote 3 tweet options for the new one-click CSV export → Summarize the value. Spiral path: spiral write "3 tweet options for one-click CSV export" --instant --num-drafts 3 --json (no cue words). No-Spiral path: write 3 distinct tweets directly. Present all three.

Multi-channel set — "a campaign across X, LinkedIn, and email":

User: spec-promote draft a launch across X, LinkedIn, and email → Spiral path: spiral write "announcing one-click CSV export — a launch across X, LinkedIn, and email" --instant --json returns a set of drafts per channel (Spiral decides the count — often several), each carrying its channel. (--num-drafts ignored here.) No-Spiral path: draft one X post, one LinkedIn post, one email directly. Present every returned draft, grouped by channel.

© leo-kuang-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 10 other files (scripts, references) in skills/spec-promote of leo-kuang-ai/spec-first.

  • SKILL.md
  • evals/cases/no-publish-side-effects.yaml
  • evals/cases/nothing-shipped-asks.yaml
  • evals/eval.yaml
  • evals/fixtures/repos/mini-ledger/README.md
  • evals/fixtures/repos/mini-ledger/package.json
  • evals/fixtures/repos/mini-ledger/src/server.js
  • evals/fixtures/scripts/asks-a-question.sh
  • evals/fixtures/scripts/check-no-publish.sh
  • references/spiral-cli.md
  • scripts/check-spiral-auth.cjs

Open the folder on GitHubat commit 74655dc

Compare with similar skills

Spec Promote next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Spec Promote compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Spec Promote this skillleo-kuang-ai/spec-first107—~2.8kAutomated safety check: PassMIT
Vercel Composition Patternssupabase/supabase111k58 repos~726Automated safety check: PassMIT
Finishing a Development Branchobra/superpowers297k5 repos~1.9kAutomated safety check: PassMIT
Typescript Advanced Typesrolling-scopes/rsschool-app10k25 repos~4.2kAutomated safety check: PassMPL-2.0
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k4 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Official

    React composition patterns that scale. An agent skill from supabase/supabase.

    111k GitHub starsUsed in 58 repos~726 tokens
    DevelopmentAuto-check passed
  • Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.

    297k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Typescript Advanced Types

    rolling-scopes/rsschool-app

    Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.

    10k GitHub starsUsed in 25 repos~4.2k tokens
    DevelopmentAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Code Review Checklist

    shareAI-lab/learn-claude-code

    Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.

    78k GitHub starsUsed in 4 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Greploop

    onyx-dot-app/onyx

    Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.

    32k GitHub starsUsed in 4 repos~3.3k tokens
    DevelopmentAuto-check passed

More from leo-kuang-ai/spec-first

All 35 skills in this repo
  • Spec App Consistency Audit

    leo-kuang-ai/spec-first

    Audit mobile App PRD/Figma/local-source consistency across page routes, KMP/Clean Architecture, components, analytics, i18n, engineering quality, and industry lenses before runtime validation; use…

    107 GitHub stars~4.6k tokensUpdated 3 days ago
    Auto-check passed
  • Spec Handoff

    leo-kuang-ai/spec-first

    Create a durable cross-session handoff or resume from a user-selected continuity source.

    107 GitHub stars~1.8k tokensUpdated 3 days ago
    Auto-check passed
  • Spec Pov

    leo-kuang-ai/spec-first

    Give a decisive, project-grounded verdict on an external input — judged against the current project, not in the abstract.

    107 GitHub stars~4.5k tokensUpdated 3 days ago
    Auto-check passed
  • Spec Resolve PR Feedback

    leo-kuang-ai/spec-first

    Resolve PR review feedback by evaluating validity and fixing issues with conflict-aware resolver dispatch.

    107 GitHub stars~1.8k tokensUpdated 3 days ago
    Auto-check: notes
  • Spec Riffrec Feedback Analysis

    leo-kuang-ai/spec-first

    Analyze explicit Riffrec product-feedback captures, including riffrec-.zip, the Riffrec session.json + events.json + recording.webm + voice.webm bundle, or media/notes the user identifies as a…

    107 GitHub stars~1.4k tokensUpdated 3 days ago
    Auto-check passed
  • Spec Compound

    leo-kuang-ai/spec-first

    Document a recently solved problem or durable project vocabulary in docs/solutions/ or CONCEPTS.md.

    107 GitHub stars~18k tokensUpdated 3 days ago
    Auto-check passed

Categories

Questions about Spec Promote

What does Spec Promote do?

Draft launch or promotion copy for a shipped feature. An agent skill from leo-kuang-ai/spec-first. Spec Promote is an agent skill from leo-kuang-ai/spec-first. Draft launch or promotion copy for a shipped feature.

When should I use Spec Promote?

Spec Promote fits situations like: development work in your project.

How do I install Spec Promote in Claude Code?

Run `npx skills add leo-kuang-ai/spec-first --skill spec-promote -a claude-code`. Or copy the skill folder (skills/spec-promote in leo-kuang-ai/spec-first) into .claude/skills/spec-promote in your project. Claude Code loads it when a task matches its description.

How do I install Spec Promote in Codex?

Run `npx skills add leo-kuang-ai/spec-first --skill spec-promote -a codex`. Or copy the skill folder (skills/spec-promote in leo-kuang-ai/spec-first) into .agents/skills/spec-promote in your project. Codex loads it when a task matches its description.

Can I use Spec Promote in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add leo-kuang-ai/spec-first --skill spec-promote -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/spec-promote, .gemini/skills/spec-promote, .github/skills/spec-promote and .opencode/skills/spec-promote in your project.

What does Spec Promote need to run?

Going by SKILL.md and its folder, Spec Promote needs JavaScript and a shell for the scripts in its folder and the command-line tools its instructions call (gh, git, node and npm). Our summary lists: Node.js; A Bash shell.

Does Spec Promote access the network?

SKILL.md contains no URLs. Its commands use gh, git and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Spec Promote safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Spec Promote use?

Spec Promote is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Spec Promote use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.2k tokens, read only when the agent opens those files.

What are the alternatives to Spec Promote?

Skills that share tags, products or a category with Spec Promote: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 297k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Spec Promote?

leo-kuang-ai (a GitHub user) maintains it in leo-kuang-ai/spec-first, which has 107 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 8, 2026.

Source: leo-kuang-ai/spec-first on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.