Publish a single demo to v0 and optionally create Typefully drafts. Use when the user says "publish", "publish to v0", or "create typefully draft" for a demo.
npx skills add https://github.com/vercel-labs/workflow-campaign-demos --skill publish
Publish a single workflow demo to v0 (and optionally Typefully) with pre-flight checks.
Present the user with a list of available demos. Discover them by listing directories in the project root that contain a package.json (skip directories starting with .).
Use AskUserQuestion with the demos as options so the user can pick one.
Before publishing, verify:
git status on the demo directory. If there are uncommitted changes touching the selected demo's prefix, warn the user and ask whether to continue. git fetch workflow-{slug} main
git rev-parse workflow-{slug}/main → remote SHA
git subtree split --prefix={slug} → local SHA
If the SHAs differ, the subtree is out of sync. Offer to push it:
bun .scripts/sync.ts push-one
Let the user pick the demo interactively, or run:
git subtree push --prefix={slug} workflow-{slug} main
V0_API_KEY is set. If publishing to Typefully, confirm TYPEFULLY_API_KEY exists in .env.local.Run:
bun .scripts/v0-publish-public.ts {slug} -y --skip-sync-check
Use --skip-sync-check because we already verified sync in step 2. Use -y to skip the interactive confirmation.
Report the v0 URL from the output.
Ask the user if they also want to create Typefully thread drafts for this demo.
If yes, check that .posts/{slug}.md exists. If it does, run:
bun .scripts/typefully-publish.ts {slug} --validate
If validation passes, ask which variant(s) to publish (A, B, C, or all), then run:
bun .scripts/typefully-publish.ts {slug} --variant {variant}
Or without --variant for all variants.
Report the Typefully draft URLs from the output.
.posts/ directory contains social media thread content (renamed from posts/)v0-sdk to create a public chat from the demo's GitHub repo (vercel-labs/workflow-{slug})Take vercel-labs/publish from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.