Orchestrates one narrated vertical short from idea
sk-pipeline: one video, idea to hand-off

Orchestrates one narrated vertical short (TikTok, YouTube Shorts, Reels) from idea to upload-ready hand-off files, in the fixed order idea, facts, flow and visual choice, brief, narration, TTS, lint, scenes, still review, render, cover,…
--- name: sk-pipeline description: Orchestrates one narrated vertical short (TikTok, YouTube Shorts, Reels) from idea to upload-ready hand-off files, in the fixed order idea, facts, flow and visual choice, brief, narration, TTS, lint, scenes, still review, render, cover, normalize, encode, hand-off. Use when the user says "make a video about X", "start a new short", "take this idea to a finished video", "what's the next step", "where was I on this video", or asks how the whole pipeline fits together. Also when the user gives a video or audio file (or a folder of clips) to edit: "edit this video", "dựng video này", a .mov/.mp4 path. Points at the skill and the SOUL section that governs each step. --- # sk-pipeline: one video, idea to hand-off **Announce:** "Using sk-pipeline for <id>." ## This skill is not the rules The rules live in `SOUL.md` and `docs/soul/`. This skill only fixes the **order** and points at the skill and § for each step. Where it disagrees with a §, the § wins and this file is the one to fix. Do not copy rules into skills: two copies drift and nobody knows which is current. Read `SOUL.md` first (index, three first rules, pipeline order, checklist). It holds this channel's editable defaults; changing them is `sk-improve`'s job. Then
Overview
The rules live in SOUL.md and docs/soul/. This skill only fixes the order and points at the skill and § for each step. Where it disagrees with a §, the § wins and this file is the one to fix. Do not copy rules into skills: two copies drift and nobody knows which is current.
Manual install (npx, ZIP)
npx skills add howznguyen/shorts-kit --skill sk-pipeline -g -a claude-codenpx degit howznguyen/shorts-kit/.claude/skills/sk-pipeline#main ~/.claude/skills/sk-pipelineConnects with Agent Alley MCP · agentalley.io/mcp
Files included
SKILL.md6.5 KB
Read SKILL.md here
Show the full text103 lines
sk-pipeline: one video, idea to hand-off
Announce: "Using sk-pipeline for <id>."
This skill is not the rules
The rules live in SOUL.md and docs/soul/. This skill only fixes the order
and points at the skill and § for each step. Where it disagrees with a §, the §
wins and this file is the one to fix. Do not copy rules into skills: two copies
drift and nobody knows which is current.
Read SOUL.md first (index, three first rules, pipeline order, checklist). It
holds this channel's editable defaults; changing them is sk-improve's job. Then
open only the § for the step you are on; do not load the whole of docs/soul/.
Exact commands per step are in docs/making-a-video.md.
The steps
| # | Step | Skill | Rules | Evidence on disk before moving on |
|---|---|---|---|---|
| 0 | If SOUL.md's change log has no entries, the rules were never adapted: offer first-run setup |
sk-improve |
SOUL.md |
change log has entries, or user declined |
| 1 | Idea: one sentence the viewer can repeat after watching | sk-brief |
§1 | sentence written in the brief |
| 2 | Facts: every claim sourced and recorded | sk-facts |
§9 | bun run facts clean |
| 3 | Flow + visual choice, image licences checked | sk-brief |
§2, §5, docs/flows/, docs/visuals/ |
bun run new <id> --flow <X> done |
| 4 | Brief | sk-brief |
§2, §5 | briefs/<id>.md with fact ids |
| 5 | Narration | sk-narration (polish: sk-style) |
§1, §3, §3b, §3c | src/videos/<id>/narration.json |
| 6 | TTS | sk-narration |
§4 | voice.json + public/audio/<id>/voice.mp3, listened to |
| 7 | Lint | sk-narration |
docs/soul/thresholds.json |
bun run lint <id> 0 errors, warnings read |
| 7b | Storyboard: one row per camera shot, approved by the user before any scene code | sk-scene |
§12, docs/storyboard.md |
bun run storyboard <id> clean, shots approved |
| 8 | Scenes (+ optional SFX, docs/sfx.md) |
sk-scene |
§5, §6, §7, §8, §12, §13 | bun run check clean |
| 9 | Still review | sk-scene |
§7 | stills in out/<id>/ opened and looked at |
| 10 | Render | sk-render |
§11 | out/<id>/<id>.mp4, frames checked |
| 11 | Cover | sk-handoff |
§10 | out/<id>/<id>-cover.png checked at 200 px |
| 12 | Normalize | sk-render |
§8 | out/<id>/<id>-loud.mp4, loudness measured |
| 13 | Encode | sk-render |
§11 | out/<id>/<id>-upload.mp4, ffprobe checked |
| 14 | Hand-off | sk-handoff |
§10, §11 | caption, pinned comment, credits in out/<id>/ |
A recorded voice instead of TTS (§5j)
When the user brings a recording (a filmed take, several clips, or a voice-only audio
file), the voice is what was said, not written. Start with bun run from <file|dir>...:
it does steps 3, 5a and 5b below in one go and prints what to ask the speaker. Steps 5 and 6 become ingest and cut; the rest
keeps its order:
| # | Step | Command | Evidence |
|---|---|---|---|
| 3 | Flow + visual: talking-head shows the take; any other visual uses only its audio |
bun run new <id> --flow <X> --visual talking-head or --visual <type> --voice recorded |
narration.json voice.engine recorded |
| 5a | Ingest: normalise, Whisper transcript, proposed cuts | bun run ingest <id> <file> --lang <code> [--prompt "names"] |
transcript.json, review read, every ⟪words missing?⟫ heard |
| 5b | Cut: edit cuts.json (reasons), fix misheard words with spelling, never retype a line |
bun run cut <id> |
footage.json, voice.mp3 listened to end to end |
| 2 | Facts, AFTER the transcript: every claim said is verified, cut, or "claim": false |
sk-facts |
lint has no "cites no fact" error |
Ask the user for the exact words wherever Whisper is unsure (? in the review, numbers,
names, ⟪words missing?⟫): an agent cannot hear the take, and Whisper writes what it
expects. Then regroup lines into the flow's beats, declare face for talking-head, and
continue at step 7.
The step list the preview shows lives in docs/pipeline.json. A channel that adds, removes or reorders a step changes it there (with sk-improve), and the preview follows.
After the user has posted and has numbers: sk-improve.
Three orderings that are rules, not habits
- Facts before words (step 2 before step 5). No sentence is written before
its claim has a
verifiedrecord. Writing first and sourcing later is how a good-sounding sentence survives with no source behind it. - Visual language before words (step 3 before step 5). Decide how each claim gets on screen, and check the licence of every image, before scripting. A script built around an image you may not use has to be rewritten.
- Script is final before TTS, TTS before scenes. Scene length comes from the real voice track, never set by hand. Editing text after TTS means running TTS again, or captions drift silently.
The cross-cutting principle
A step is done when there is evidence on disk, not when the command exits 0. This pipeline fails silently: an mp4 that exits 0 but is truncated, a still that renders but has text under the platform UI, a voice track that loops a phrase. Open the file, look at the frame, listen to the audio.
Hard limits
- Never auto-publish. The pipeline ends at files in
out/<id>/. The user uploads by hand. Do not write or run upload scripts. - Never hand-edit
voice.json. It is generated bybun run tts <id>(orbun run cut <id>for a recorded voice). - A video never imports another video. Shared code goes to
src/shared/.bun run checkenforces this.
Checklist
Use the pre-hand-off checklist in SOUL.md, not a copy of it anywhere else.
Resuming a video
Look at what exists: briefs/<id>.md, src/videos/<id>/narration.json,
voice.json, out/<id>/*. The first missing piece in the table above is the
next step. If narration.json is newer than voice.json, TTS is stale.
| 1 | |
| 2 | name sk-pipeline |
| 3 | description Orchestrates one narrated vertical short (TikTok, YouTube Shorts, Reels) from idea to upload-ready hand-off files, in the fixed order idea, facts, flow and visual choice, brief, narration, TTS, lint, scenes, still review, render, cover, normalize, encode, hand-off. Use when the user says "make a video about X", "start a new short", "take this idea to a finished video", "what's the next step", "where was I on this video", or asks how the whole pipeline fits together. Also when the user gives a video or audio file (or a folder of clips) to edit: "edit this video", "dựng video này", a .mov/.mp4 path. Points at the skill and the SOUL section that governs each step. |
| 4 | |
| 5 | |
| 6 | # sk-pipeline: one video, idea to hand-off |
| 7 | |
| 8 | **Announce:** "Using sk-pipeline for <id>." |
| 9 | |
| 10 | ## This skill is not the rules |
| 11 | |
| 12 | The rules live in `SOUL.md` and `docs/soul/`. This skill only fixes the **order** |
| 13 | and points at the skill and § for each step. Where it disagrees with a §, the § |
| 14 | wins and this file is the one to fix. Do not copy rules into skills: two copies |
| 15 | drift and nobody knows which is current. |
| 16 | |
| 17 | Read `SOUL.md` first (index, three first rules, pipeline order, checklist). It |
| 18 | holds this channel's editable defaults; changing them is `sk-improve`'s job. Then |
| 19 | open only the § for the step you are on; do not load the whole of `docs/soul/`. |
| 20 | Exact commands per step are in `docs/making-a-video.md`. |
| 21 | |
| 22 | ## The steps |
| 23 | |
| 24 | | # | Step | Skill | Rules | Evidence on disk before moving on | |
| 25 | |---|---|---|---|---| |
| 26 | | 0 | If `SOUL.md`'s change log has no entries, the rules were never adapted: offer first-run setup | `sk-improve` | `SOUL.md` | change log has entries, or user declined | |
| 27 | | 1 | Idea: one sentence the viewer can repeat after watching | `sk-brief` | §1 | sentence written in the brief | |
| 28 | | 2 | Facts: every claim sourced and recorded | `sk-facts` | §9 | `bun run facts` clean | |
| 29 | | 3 | Flow + visual choice, image licences checked | `sk-brief` | §2, §5, `docs/flows/`, `docs/visuals/` | `bun run new <id> --flow <X>` done | |
| 30 | | 4 | Brief | `sk-brief` | §2, §5 | `briefs/<id>.md` with fact ids | |
| 31 | | 5 | Narration | `sk-narration` (polish: `sk-style`) | §1, §3, §3b, §3c | `src/videos/<id>/narration.json` | |
| 32 | | 6 | TTS | `sk-narration` | §4 | `voice.json` + `public/audio/<id>/voice.mp3`, listened to | |
| 33 | | 7 | Lint | `sk-narration` | `docs/soul/thresholds.json` | `bun run lint <id>` 0 errors, warnings read | |
| 34 | | 7b | Storyboard: one row per camera shot, approved by the user before any scene code | `sk-scene` | §12, `docs/storyboard.md` | `bun run storyboard <id>` clean, shots `approved` | |
| 35 | | 8 | Scenes (+ optional SFX, `docs/sfx.md`) | `sk-scene` | §5, §6, §7, §8, §12, §13 | `bun run check` clean | |
| 36 | | 9 | Still review | `sk-scene` | §7 | stills in `out/<id>/` opened and looked at | |
| 37 | | 10 | Render | `sk-render` | §11 | `out/<id>/<id>.mp4`, frames checked | |
| 38 | | 11 | Cover | `sk-handoff` | §10 | `out/<id>/<id>-cover.png` checked at 200 px | |
| 39 | | 12 | Normalize | `sk-render` | §8 | `out/<id>/<id>-loud.mp4`, loudness measured | |
| 40 | | 13 | Encode | `sk-render` | §11 | `out/<id>/<id>-upload.mp4`, ffprobe checked | |
| 41 | | 14 | Hand-off | `sk-handoff` | §10, §11 | caption, pinned comment, credits in `out/<id>/` | |
| 42 | |
| 43 | ### A recorded voice instead of TTS (§5j) |
| 44 | |
| 45 | When the user brings a recording (a filmed take, several clips, or a voice-only audio |
| 46 | file), the voice is what was said, not written. Start with `bun run from <file|dir>...`: |
| 47 | it does steps 3, 5a and 5b below in one go and prints what to ask the speaker. Steps 5 and 6 become **ingest** and **cut**; the rest |
| 48 | keeps its order: |
| 49 | |
| 50 | | # | Step | Command | Evidence | |
| 51 | |---|---|---|---| |
| 52 | | 3 | Flow + visual: `talking-head` shows the take; any other visual uses only its audio | `bun run new <id> --flow <X> --visual talking-head` or `--visual <type> --voice recorded` | `narration.json` voice.engine `recorded` | |
| 53 | | 5a | Ingest: normalise, Whisper transcript, proposed cuts | `bun run ingest <id> <file> --lang <code> [--prompt "names"]` | `transcript.json`, review read, every `⟪words missing?⟫` heard | |
| 54 | | 5b | Cut: edit `cuts.json` (reasons), fix misheard words with `spelling`, never retype a line | `bun run cut <id>` | `footage.json`, `voice.mp3` listened to end to end | |
| 55 | | 2 | Facts, AFTER the transcript: every claim said is verified, cut, or `"claim": false` | `sk-facts` | lint has no "cites no fact" error | |
| 56 | |
| 57 | Ask the user for the exact words wherever Whisper is unsure (`?` in the review, numbers, |
| 58 | names, `⟪words missing?⟫`): an agent cannot hear the take, and Whisper writes what it |
| 59 | expects. Then regroup lines into the flow's beats, declare `face` for talking-head, and |
| 60 | continue at step 7. |
| 61 | |
| 62 | The step list the preview shows lives in `docs/pipeline.json`. A channel that adds, removes or reorders a step changes it there (with `sk-improve`), and the preview follows. |
| 63 | |
| 64 | After the user has posted and has numbers: `sk-improve`. |
| 65 | |
| 66 | ## Three orderings that are rules, not habits |
| 67 | |
| 68 | **Facts before words** (step 2 before step 5). No sentence is written before |
| 69 | its claim has a `verified` record. Writing first and sourcing later is how a |
| 70 | good-sounding sentence survives with no source behind it. |
| 71 | **Visual language before words** (step 3 before step 5). Decide how each |
| 72 | claim gets on screen, and check the licence of every image, before scripting. |
| 73 | A script built around an image you may not use has to be rewritten. |
| 74 | **Script is final before TTS, TTS before scenes.** Scene length comes from the |
| 75 | real voice track, never set by hand. Editing text after TTS means running TTS |
| 76 | again, or captions drift silently. |
| 77 | |
| 78 | ## The cross-cutting principle |
| 79 | |
| 80 | **A step is done when there is evidence on disk, not when the command exits 0.** |
| 81 | This pipeline fails silently: an mp4 that exits 0 but is truncated, a still that |
| 82 | renders but has text under the platform UI, a voice track that loops a phrase. |
| 83 | Open the file, look at the frame, listen to the audio. |
| 84 | |
| 85 | ## Hard limits |
| 86 | |
| 87 | **Never auto-publish.** The pipeline ends at files in `out/<id>/`. The user |
| 88 | uploads by hand. Do not write or run upload scripts. |
| 89 | **Never hand-edit `voice.json`.** It is generated by `bun run tts <id>` |
| 90 | (or `bun run cut <id>` for a recorded voice). |
| 91 | **A video never imports another video.** Shared code goes to `src/shared/`. |
| 92 | `bun run check` enforces this. |
| 93 | |
| 94 | ## Checklist |
| 95 | |
| 96 | Use the pre-hand-off checklist in `SOUL.md`, not a copy of it anywhere else. |
| 97 | |
| 98 | ## Resuming a video |
| 99 | |
| 100 | Look at what exists: `briefs/<id>.md`, `src/videos/<id>/narration.json`, |
| 101 | `voice.json`, `out/<id>/*`. The first missing piece in the table above is the |
| 102 | next step. If `narration.json` is newer than `voice.json`, TTS is stale. |
| 103 |
Details
- License
- MIT
- Stars on the repo
- ★ 69
- Checked
- Source
- howznguyen/shorts-kit ↗
- Creator
- howznguyen · 1 listing
Similar skills
See all →
MCPGet from zero to orchestrated multi-agent pipeline in 5⚡ NEXUS Quick-Start Guide
SkillStep 1 of the AI Video Editor pipelineclean-cut — the step-1 cut pipeline
SkillMake an original animated music videoVocaloid-style MV pipeline (手書き / 文字PV)
SkillConstruction company AI agentConstruction Agent — Email → Project Management Pipeline
SkillTracking customer interactions, managing leadsCRM-Lite — Lightweight SQLite CRM for Small Business
MCPReady-to-use prompt templates for activating any agent🎯 NEXUS Agent Activation Prompts