groups-compose
Designs and maintains semantic groupings and readable layouts on the filmmaking canvas — scenes, character-reference sets, act…
Handles explicit screenplay/story work on the filmmaking canvas. Triages screenplay (use verbatim), story/concept (iterate then rewrite), or neither (defer). Captures the final script note/title; on explicit command, splits into <=15s shot notes and extracts characters,
Claude Code
$ npx -y skills add utopai-research/pai-code --skill script-compose --agent claude-code
Codex
$ npx skills add utopai-research/pai-code --skill script-compose -a codex -y
Cursor
$ npx skills add utopai-research/pai-code --skill script-compose -a cursor -y
Gemini CLI
$ npx skills add utopai-research/pai-code --skill script-compose -a gemini-cli -y
GitHub Copilot
$ npx skills add utopai-research/pai-code --skill script-compose -a github-copilot -y
OpenCode
$ npx skills add utopai-research/pai-code --skill script-compose -a opencode -y
Windsurf
$ npx skills add utopai-research/pai-code --skill script-compose -a windsurf -y
name: script-compose description: >- Handles explicit screenplay/story work on the filmmaking canvas. Triages screenplay (use verbatim), story/concept (iterate then rewrite), or neither (defer). Captures the final script note/title; on explicit command, splits into <=15s shot notes and extracts characters, variants, locations, and speaking/VO needs. Use for writing, adapting, rewriting, splitting, analyzing, or breaking down scripts/stories. Preserves dialogue verbatim and returns multi-stage planning to story-to-video-workflow before media generation. Does not split/analyze on file drop or without explicit intent.
Run only on explicit user intent, never on file drop. Dropped text/PDF already exists as a note (`data.body`) and mirror (`./assets/notes/<note_id>.md`).
Defaults: a 30s beat is one moment; match the input language; with characters, prefer meaningful dialogue and let narration support rather than carry the scene, but let wordless action carry a beat instead of packing every one with dialogue.
Stop at script capture, shot notes, and anchor extraction. Route multi-stage work back to `story-to-video-workflow`.
Capture target duration when observable:
Store `target_duration_sec` and `duration_basis` when known. If implied runtime is >~3 minutes, call out scope before shot/video planning.
Classify the input, then capture as in §2. Never skip straight to §3.
Torn between screenplay and story? Prefer screenplay — safer than rewriting.
**Rewrite rules (story → screenplay):**
ONE note. No split. Canvas writes go through the mutator, never direct `workflow.json`.
1. `read` `./workflow.json` (read-only inspection — see if `title` is already set). 2. **Append the script note** via the mutator with `subtype: "script"`:
node "$PAI_REPO_ROOT/server/cli/canvas_mutate.js" \
--op addNode \
--payload-json '{"node":{"type":"note","data":{"subtype":"script","label":"Script: <title>","body":"<full screenplay verbatim>","metadata":{"author":"agent","timestamp":"<ISO>","target_duration_sec":45,"duration_basis":"estimated from script length"}}}}'Omit `target_duration_sec` / `duration_basis` only when there is no defensible signal. Stdout returns `assigned.node_id` — keep it for §3 (shots derive from this id). 3. **Set the workflow title if empty:**
node "$PAI_REPO_ROOT/server/cli/canvas_mutate.js" --op setTitle --payload-json '{"title":"<title>"}'4. Confirm with `Captured.`, then offer the next step as a choice rendered per the project `PROJECT_AGENT.md` § "Recommendation and choice shape". Recommended option: "Split it into <=15s shots and extract characters/locations/voices." Plus an escape to do something else.
STOP. Do NOT proceed to §3 without an explicit user command.
**Triggers** (judge intent): "split into shots / clips", "break this up", "pull the characters / locations", "who's in this", "analyze this script", "design the characters from this script". **Not triggers:** "what's in this", "summarize", "tell me about it" — those are read-and-reply.
When triggered:
1. **Slug** — kebab-case of the working title. Collision → suffix `-2`, `-3`. 2. **Shot splits** (≤15s each): use `metadata.target_duration_sec` or estimate. Split on natural beats (slug/dialogue/location/time/appearance changes). For >15s material, keep resulting shots as close to 15s as natural (default ≈ `ceil(total_seconds / 15)` shots); split shorter only for hard cuts, dialogue turns, continuity shifts, or strong beats — don't over-fragment just because the script's own time markers say so. Pace speech at ~2.2-2.5 words/sec plus reaction/action room; silent action ~3–5s. If dialogue cannot fit naturally, split it; reduce only when the user asked for compression. **Never rewrite** — shot bodies are verbatim slices. Each shot note has `subtype: "shot"`. Build one `addBatch` with N shot notes + N derived edges:
node "$PAI_REPO_ROOT/server/cli/canvas_mutate.js" \
--op addBatch \
--payload-json '{
"nodes": [
{"type":"note","data":{"subtype":"shot","label":"Shot 1 (0–15s)","body":"<slice>","metadata":{"author":"agent","timestamp":"<ISO>"}}},
{"type":"note","data":{"subtype":"shot","label":"Shot 2 (15–30s)","body":"<slice>","metadata":{"author":"agent","timestamp":"<ISO>"}}}
],
"edges": [
{"from":"<script_note_id>","to":"$0","kind":"derived"},
{"from":"<script_note_id>","to":"$1","kind":"derived"}
]
}'`$N` placeholders are 0-indexed positions in `nodes`; the mutator resolves them to the assigned ids after running. Reply's `assigned.n
The local AI filmmaking studio, driven from your coding agent. [![Codex supported](
Designs and maintains semantic groupings and readable layouts on the filmmaking canvas — scenes, character-reference sets, act…
Generates/edits filmmaking canvas images via generate_image.js and generate_image_pro.js. Use before image CLIs for…
Orchestrates story, script, screenplay, concept, product promo, and multi-shot idea work into finished video. Use first when the…
Generates and prompts video clips on the filmmaking canvas. Use when the user asks to generate, render, animate, continue,…
Designs and attaches voice samples or final narration/line audio on the filmmaking canvas via the local generate_voice.js CLI.…
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use…
AI-driven presentation workflow for generating editable PPTX decks and slides, reconstructing page visuals, creating reusable…
Use this skill when the user wants a .pptx with smooth cross-slide animation — PowerPoint Morph transitions, Keynote-style…
Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to…