QCut Shot
CLI-first shot planning and frame generation.
Usage
export QCUT_SHOT_ROOT="/Users/peter/Desktop/code/qcut/qcut/.claude/skills/qcut-toolkit/qcut-shot"
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --style cinematic --shots 8
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --medium live-action --format film
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --medium animation --format short-film --style custom --framing macro --movement slider --lighting bright --mood polished
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --style custom --framing macro --movement slider --lighting bright --mood polished
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --prompts-only
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" promo.md --promo --shots 8
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" promo.md --promo --shot-duration 2.8 \
--promo-presets entrance:laser-etch,loop:wave,exit:typewriter-out
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" shot-plan/my-story --images-only
npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" shot-plan/my-story --regenerate 2,5
Options
| Option |
Description |
--style <name> |
Preset style or custom |
--medium <name> |
live-action, animation, hybrid, cgi |
--format <name> |
film, tv-series, documentary, variety, short-film, short-video |
--framing <name> |
wide, medium, close, macro, overhead |
--movement <name> |
locked-off, handheld, dolly, slider, crane, dynamic |
--lighting <name> |
natural, bright, dramatic, low-key, neon, soft |
--mood <name> |
grounded, warm, tense, moody, polished, heightened |
--shots <number> |
Target shot count |
--lang <code> |
Output language |
--prompts-only |
Stop after writing prompts |
--images-only |
Render images from an existing shot plan |
--regenerate 2,5 |
Re-render selected shots |
--provider <name> |
Currently fal only |
--model <id> |
Override the fal model |
--output-dir <path> |
Write artifacts to a specific directory |
--project-id <id> |
Save into QCut project folder |
--dry-run |
Skip rendering work |
--promo |
Also write QCut timeline, pointer actions, and demo-run plans |
--shot-duration <seconds> |
Per-shot promo duration, 1–30 seconds (default 3) |
--promo-presets <phase:id,...> |
Cycle explicit entrance/exit/loop text presets across shots |
Output
Default save location (priority order):
--output-dir <path> — explicit override
--project-id <id> — ~/Documents/QCut/Projects/<id>/shot-plan/{slug}/
- No flags —
~/Documents/QCut/shot-plan/{slug}/
shot-plan/{topic-slug}/
├── source-{slug}.{ext}
├── analysis.md
├── shots.md
├── shots.json
├── shots.csv
├── manifest.csv
├── prompts/
│ └── 01-shot-opening.md
├── 01-shot-opening.png
├── promo-timeline.json
├── promo-actions.json
├── promo-demo.json
└── ...
--promo writes timeline, pointer-action, and demo-run plans alongside the shot
artifacts. It does not launch QCut, export video, or record the editor. After the
shot images exist and QCut is running, execute the generated demo plan:
bun run pipeline editor:demo:run \
--plan shot-plan/my-story/promo-demo.json \
--recording-quality 1440p \
--json
This follow-up applies the timeline, records the editor workflow, and exports the
final title reel.
The timeline manifest uses declarative textAnimationPreset requests. QCut
resolves them through its bundled preset catalog, so the skill does not copy or
freeze animation implementation details.
Promo Voiceover
When a promo needs narration, render the final voice with ByteDance Seed Audio:
bun run pipeline gen tts \
-m seed_audio \
-t "(用自然、自信、克制的产品宣传片语气,节奏明快,避免播音腔)<旁白正文>" \
--audio-format mp3 \
--sample-rate 48000 \
--multilingual \
-o shot-plan/my-story/audio
Quality rules:
- Generate one continuous narrator track when possible. Multiple independent
Seed Audio calls can select different speakers.
- Direct emotion and pace in the copy's language. Shorten copy before pushing
--speed beyond 1.15.
- Verify the rendered duration against the picture edit and inspect the final
mixed file for clipping, silence, and intelligibility over music.
- macOS
say, Windows SAPI, espeak, and similar system voices are timing
placeholders only. They must never appear in the delivered promo.
- If Seed Audio is unavailable, stop with an actionable error and preserve the
last valid deliverable. Never silently fall back to system TTS.
Notes
- References live in
qcut-shot/references/.
- Promo finals must pass frame-by-frame QA before delivery; the accumulated
playbook (dead-canvas splicing, tail-take re-recording, track ordering in
plan timelines, screen-recording permission/resolution traps) lives in
references/promo-iteration-lessons.md.
- Image rendering uses the local
qcut-shot/scripts/image-gen.ts renderer.
- If rendering cannot run, the command still produces
analysis.md, shots.md, shots.json, and prompt files.
1---2name: qcut-shot3description: CLI-first shot planning skill for QCut. Analyzes a script, article, or idea; builds a deterministic shot list; writes per-shot image prompts; and can render shot frames through its own local fal-backed renderer. Use when the user wants scene shots, storyboard frames, or a shot plan from the terminal.4---56# QCut Shot78CLI-first shot planning and frame generation.910## Usage1112```bash13export QCUT_SHOT_ROOT="/Users/peter/Desktop/code/qcut/qcut/.claude/skills/qcut-toolkit/qcut-shot"1415npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md16npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --style cinematic --shots 817npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --medium live-action --format film18npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --medium animation --format short-film --style custom --framing macro --movement slider --lighting bright --mood polished19npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --style custom --framing macro --movement slider --lighting bright --mood polished20npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" story.md --prompts-only21npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" promo.md --promo --shots 822npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" promo.md --promo --shot-duration 2.8 \23 --promo-presets entrance:laser-etch,loop:wave,exit:typewriter-out24npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" shot-plan/my-story --images-only25npx -y bun@1.3.10 "$QCUT_SHOT_ROOT/scripts/main.ts" shot-plan/my-story --regenerate 2,526```2728## Options2930| Option | Description |31|---|---|32| `--style <name>` | Preset style or `custom` |33| `--medium <name>` | `live-action`, `animation`, `hybrid`, `cgi` |34| `--format <name>` | `film`, `tv-series`, `documentary`, `variety`, `short-film`, `short-video` |35| `--framing <name>` | `wide`, `medium`, `close`, `macro`, `overhead` |36| `--movement <name>` | `locked-off`, `handheld`, `dolly`, `slider`, `crane`, `dynamic` |37| `--lighting <name>` | `natural`, `bright`, `dramatic`, `low-key`, `neon`, `soft` |38| `--mood <name>` | `grounded`, `warm`, `tense`, `moody`, `polished`, `heightened` |39| `--shots <number>` | Target shot count |40| `--lang <code>` | Output language |41| `--prompts-only` | Stop after writing prompts |42| `--images-only` | Render images from an existing shot plan |43| `--regenerate 2,5` | Re-render selected shots |44| `--provider <name>` | Currently `fal` only |45| `--model <id>` | Override the fal model |46| `--output-dir <path>` | Write artifacts to a specific directory |47| `--project-id <id>` | Save into QCut project folder |48| `--dry-run` | Skip rendering work |49| `--promo` | Also write QCut timeline, pointer actions, and demo-run plans |50| `--shot-duration <seconds>` | Per-shot promo duration, 1–30 seconds (default `3`) |51| `--promo-presets <phase:id,...>` | Cycle explicit entrance/exit/loop text presets across shots |5253## Output5455Default save location (priority order):56571. `--output-dir <path>` — explicit override582. `--project-id <id>` — `~/Documents/QCut/Projects/<id>/shot-plan/{slug}/`593. No flags — `~/Documents/QCut/shot-plan/{slug}/`6061```text62shot-plan/{topic-slug}/63├── source-{slug}.{ext}64├── analysis.md65├── shots.md66├── shots.json67├── shots.csv68├── manifest.csv69├── prompts/70│ └── 01-shot-opening.md71├── 01-shot-opening.png72├── promo-timeline.json73├── promo-actions.json74├── promo-demo.json75└── ...76```7778`--promo` writes timeline, pointer-action, and demo-run plans alongside the shot79artifacts. It does not launch QCut, export video, or record the editor. After the80shot images exist and QCut is running, execute the generated demo plan:8182```bash83bun run pipeline editor:demo:run \84 --plan shot-plan/my-story/promo-demo.json \85 --recording-quality 1440p \86 --json87```8889This follow-up applies the timeline, records the editor workflow, and exports the90final title reel.9192The timeline manifest uses declarative `textAnimationPreset` requests. QCut93resolves them through its bundled preset catalog, so the skill does not copy or94freeze animation implementation details.9596## Promo Voiceover9798When a promo needs narration, render the final voice with ByteDance Seed Audio:99100```bash101bun run pipeline gen tts \102 -m seed_audio \103 -t "(用自然、自信、克制的产品宣传片语气,节奏明快,避免播音腔)<旁白正文>" \104 --audio-format mp3 \105 --sample-rate 48000 \106 --multilingual \107 -o shot-plan/my-story/audio108```109110Quality rules:111112- Generate one continuous narrator track when possible. Multiple independent113 Seed Audio calls can select different speakers.114- Direct emotion and pace in the copy's language. Shorten copy before pushing115 `--speed` beyond `1.15`.116- Verify the rendered duration against the picture edit and inspect the final117 mixed file for clipping, silence, and intelligibility over music.118- macOS `say`, Windows SAPI, `espeak`, and similar system voices are timing119 placeholders only. They must never appear in the delivered promo.120- If Seed Audio is unavailable, stop with an actionable error and preserve the121 last valid deliverable. Never silently fall back to system TTS.122123## Notes124125- References live in `qcut-shot/references/`.126- Promo finals must pass frame-by-frame QA before delivery; the accumulated127 playbook (dead-canvas splicing, tail-take re-recording, track ordering in128 plan timelines, screen-recording permission/resolution traps) lives in129 `references/promo-iteration-lessons.md`.130- Image rendering uses the local `qcut-shot/scripts/image-gen.ts` renderer.131- If rendering cannot run, the command still produces `analysis.md`, `shots.md`, `shots.json`, and prompt files.