/ship-it — develop → public, one command
Run from the product repo you want to ship. Studio root = ${CLAUDE_SKILL_DIR}/../..
(rendering). Its launch CLI lives at ${CLAUDE_SKILL_DIR}/../../launch (distribution) —
run subcommands via node "${CLAUDE_SKILL_DIR}/../../launch/dist/index.js" <cmd> or
npx --prefix "${CLAUDE_SKILL_DIR}/../../launch" launch <cmd>, from the product repo so
its .launch/ state lands there. This skill is the pipeline.
Steps
- Find the brand + kit. Brand id = the product's brand in
${CLAUDE_SKILL_DIR}/../../brands/<id>.json(ask only if ambiguous). Kit =<product>/marketing/assets/<brand>/postkit/manifest.json. - Render if needed. If the manifest is missing, run
/marketingfirst (full pipeline, its own approval gates). If it exists, show itsgeneratedAtand ask: reuse or re-render? Staleness is the user's judgment call, never a heuristic. - Launch flow. In the product repo, run the launch sequence —
launch init(if no.launch/launch.config.json), then research, copy scaffold/fill, validate. Wire the kit: either setpostkitDirin the config (the dashboard marketing tab does this with a picker) or pass--kit "<product>/marketing/assets/<brand>/postkit"tolaunch post. - Dry-run, then post.
launch post <dir> --all --dry-runand show the user the previews — X and LinkedIn must show the video upload step. Live posting only after the user confirms, through the normal gates (ledger, validation, typed confirmation in the dashboard). - Manual platforms. TikTok / Shorts / Instagram are manual by design. Point the
user at the dashboard marketing tab (Open folder per platform) or the kit's
POST.mdchecklists. YouTube is NOT manual any more:launch post --all --liveuploads to it whenever the three YOUTUBE_* keys are set. Uploads land private unlessYOUTUBE_PRIVACYsays otherwise -- say so out loud before any live run, and confirm it the same way as every other api-mode platform.
Rules
- Never skip the dry-run step. Never post live without explicit user confirmation.
- If the kit manifest promises a video whose file is missing, posting refuses — fix by re-running
render-matrix.mjs <brand> --project <product> --productionandbuild-postkit.mjs <brand> --project <product> --production, not by unwiring the kit. - Live publishing remains blocked until the current media, production plan, per-row evidence, and named full-film review are hash-bound and PASS. A dry run may preview an incomplete kit but never weakens the live gate.
- Drafts own the copy; the kit contributes media. Do not paste kit captions over validated drafts.