ship-it · diff
git:20260812.9665e9c to git:20260915.793ae04
19 added, 10 removed. Audit A to A.
---
name: ship-it
- description: Ship a product end to end — render marketing assets with the animations studio, then run the launch-engine flow with videos attached to X and LinkedIn posts. Run from the product's repo.
+ description: Ship a product end to end — render marketing assets with the marketing studio (/marketing), then run the launch/ flow (/launch) with videos attached to X, LinkedIn, Bluesky and YouTube posts. Run from the product's repo.
---
# /ship-it — develop → public, one command
- Run from the product repo you want to ship. Engines: the animations studio at
- `C:\Projects\animations` (rendering) and launch-engine at `C:\Projects\launch-engine`
- (distribution). Repos stay separate; this skill is the pipeline.
+ Run from the product repo you want to ship. Studio root = `C:/Projects/animations`
+ (rendering). Its launch CLI lives at `C:/Projects/animations/launch` (distribution) —
+ run subcommands via `node "C:/Projects/animations/launch/dist/index.js" <cmd>` or
+ `npx --prefix "C:/Projects/animations/launch" launch <cmd>`, from the product repo so
+ its `.launch/` state lands there. This skill is the pipeline.
## Steps
- 1. **Find the brand + kit.** Brand id = the product's brand in `C:\Projects\animations\brands\<id>.json`
- (ask the user if ambiguous). Kit = `C:\Projects\animations\out\<brand>\postkit\manifest.json`.
+ 1. **Find the brand + kit.** Brand id = the product's brand in `C:/Projects/animations/brands/<id>.json`
+ (ask only if ambiguous). Kit = `<product>/marketing/assets/<brand>/postkit/manifest.json`.
2. **Render if needed.** If the manifest is missing, run `/marketing` first (full pipeline, its own
approval gates). If it exists, show its `generatedAt` and ask: reuse or re-render? Staleness is
the user's judgment call, never a heuristic.
- 3. **Launch flow.** In the product repo, run the launch-engine sequence — `launch init` (if no
+ 3. **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 set `postkitDir` in the config (the dashboard marketing tab does this with a picker) or
- pass `--kit C:\Projects\animations\out\<brand>\postkit` to `launch post`.
+ pass `--kit "<product>/marketing/assets/<brand>/postkit"` to `launch post`.
4. **Dry-run, then post.** `launch post <dir> --all --dry-run` and 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).
- 5. **Manual platforms.** TikTok / Shorts / YouTube / Instagram are manual by design. Point the
+ 5. **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.md` checklists.
+ YouTube is NOT manual any more: `launch post --all --live` uploads to it whenever the three
+ YOUTUBE_* keys are set. Uploads land private unless `YOUTUBE_PRIVACY` says 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` + `build-postkit.mjs` in the animations repo, not by unwiring the kit silently.
+ `render-matrix.mjs <brand> --project <product> --production` and
+ `build-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.