@event4u/agent-config 2.23.0 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent-src/commands/video/from-script.md +123 -0
- package/.agent-src/commands/video/scene.md +92 -0
- package/.agent-src/commands/video/stitch.md +83 -0
- package/.agent-src/commands/video/storyboard.md +95 -0
- package/.agent-src/commands/video.md +59 -0
- package/.agent-src/personas/README.md +3 -0
- package/.agent-src/personas/ai-video-technical-director.md +81 -0
- package/.agent-src/personas/hollywood-director.md +99 -0
- package/.agent-src/personas/pixar-storyboard-artist.md +98 -0
- package/.agent-src/skills/character-consistency/SKILL.md +120 -0
- package/.agent-src/skills/motion-choreographer/SKILL.md +149 -0
- package/.agent-src/skills/pixar-storyteller/SKILL.md +107 -0
- package/.agent-src/skills/scene-expander/SKILL.md +122 -0
- package/.agent-src/skills/scene-expander/scene-blueprint.schema.yaml +108 -0
- package/.agent-src/skills/subagent-orchestration/SKILL.md +17 -15
- package/.agent-src/skills/video-director/SKILL.md +113 -0
- package/.agent-src/templates/agent-settings.md +19 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.claude-plugin/marketplace.json +11 -1
- package/CHANGELOG.md +22 -0
- package/README.md +4 -4
- package/config/agent-settings.template.yml +28 -0
- package/docs/adrs/caveman/0001-default-off-until-bench.md +2 -2
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +2 -2
- package/docs/architecture.md +2 -2
- package/docs/catalog.md +14 -4
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/compression-default-kill-criterion.md +1 -1
- package/docs/contracts/file-ownership-matrix.json +337 -0
- package/docs/getting-started.md +1 -1
- package/docs/parity/ruflo.md +3 -3
- package/package.json +1 -1
- package/scripts/ai-video/adapters/gemini-veo.sh +57 -0
- package/scripts/ai-video/adapters/higgsfield.sh +82 -0
- package/scripts/ai-video/adapters/kling.sh +54 -0
- package/scripts/ai-video/adapters/openai-images.sh +52 -0
- package/scripts/ai-video/adapters/sora.sh +54 -0
- package/scripts/ai-video/lib/adapter-common.sh +116 -0
- package/scripts/ai-video/lib/adapter-contract.md +163 -0
- package/scripts/ai-video/lib/fixtures/gemini-veo/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/gemini-veo/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/higgsfield/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/higgsfield/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/kling/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/kling/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/fixtures/openai-images/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/openai-images/scene-0001.png +3 -0
- package/scripts/ai-video/lib/fixtures/sora/result.json +1 -0
- package/scripts/ai-video/lib/fixtures/sora/scene-0001.mp4 +1 -0
- package/scripts/ai-video/lib/load-config.sh +140 -0
- package/scripts/ai-video/lib/operator-pick.sh +119 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +122 -0
- package/scripts/ai-video/lib/redact.sh +85 -0
- package/scripts/ai-video/lib/validate-deps.sh +132 -0
- package/scripts/ai-video/stitch.sh +154 -0
- package/scripts/ai-video/test-pipeline.sh +169 -0
- package/scripts/schemas/command.schema.json +8 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video:from-script
|
|
3
|
+
tier: 2
|
|
4
|
+
cluster: video
|
|
5
|
+
sub: from-script
|
|
6
|
+
description: Drive a script end-to-end through the AI video pipeline — scenes → blueprint → image → operator pick → motion → video → stitch. Dry-run default; network calls require explicit per-turn confirmation.
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
personas: [hollywood-director, ai-video-technical-director, pixar-storyboard-artist]
|
|
9
|
+
skills: [scene-expander, video-director, pixar-storyteller, character-consistency, motion-choreographer]
|
|
10
|
+
suggestion:
|
|
11
|
+
eligible: true
|
|
12
|
+
trigger_description: "render a video from a script, full AI video pipeline, multi-scene generation"
|
|
13
|
+
trigger_context: "user supplies a Markdown script with `## Scene N` headings and wants a final MP4"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# /video:from-script
|
|
17
|
+
|
|
18
|
+
`/video:from-script <path-to-script.md> [--image-provider <id>] [--video-provider <id>]`
|
|
19
|
+
|
|
20
|
+
Drives a Markdown script through the full pipeline. Provider flags
|
|
21
|
+
override the `<default-image-provider>` / `<default-video-provider>`
|
|
22
|
+
from [`agents/.ai-video.xml`](../../agents/.ai-video.xml.example);
|
|
23
|
+
absent flags fall back to the XML defaults.
|
|
24
|
+
|
|
25
|
+
**Block-on-ambiguity:** a missing scene heading, an unparseable
|
|
26
|
+
character-lock block, or a contradictory provider flag halts the run
|
|
27
|
+
with a precise diff — no silent best-guess.
|
|
28
|
+
|
|
29
|
+
## Steps
|
|
30
|
+
|
|
31
|
+
### 1. Validate dependencies
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/from-script.md
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Fails fast with the missing-id list if any declared persona / skill is
|
|
38
|
+
absent from `.agent-src/personas/` or `.agent-src/skills/`. No network
|
|
39
|
+
call has happened yet.
|
|
40
|
+
|
|
41
|
+
### 2. Load config + resolve providers
|
|
42
|
+
|
|
43
|
+
Source `scripts/ai-video/lib/load-config.sh`. Resolve image / video
|
|
44
|
+
provider in this order: command flag → `agents/.ai-video.xml` default
|
|
45
|
+
→ fail with the available-providers list.
|
|
46
|
+
|
|
47
|
+
### 3. Parse the script
|
|
48
|
+
|
|
49
|
+
Run the `scene-expander` skill: split on `## Scene N` headings, extract
|
|
50
|
+
dialogue / action / ambient blocks, and emit one `scene-blueprint.yaml`
|
|
51
|
+
per scene under `<project>/scenes/<id>/`. Schema:
|
|
52
|
+
[`scene-blueprint.schema.yaml`](../skills/scene-expander/scene-blueprint.schema.yaml).
|
|
53
|
+
|
|
54
|
+
### 4. Character lock
|
|
55
|
+
|
|
56
|
+
Run `character-consistency` once for the whole project. Writes
|
|
57
|
+
`<project>/character.json` (subject, palette, wardrobe, prop, seed)
|
|
58
|
+
that every later prompt must reuse verbatim.
|
|
59
|
+
|
|
60
|
+
### 5. Per-scene image render
|
|
61
|
+
|
|
62
|
+
For each scene blueprint:
|
|
63
|
+
|
|
64
|
+
1. Compose the eight-block image prompt via `video-director`
|
|
65
|
+
(style · subject · environment · action · camera · lens · lighting · mood).
|
|
66
|
+
2. **Safety gate (Phase 5 Step 6).** If `AIV_DRYRUN=false`, print the
|
|
67
|
+
adapter, model, scene count, and estimated cost; refuse to continue
|
|
68
|
+
without an explicit operator confirmation **in this turn**. Mirrors
|
|
69
|
+
[`non-destructive-by-default`](../rules/non-destructive-by-default.md).
|
|
70
|
+
3. Call the image adapter (`run` subcommand) N times where N =
|
|
71
|
+
`<tuning/best-of-n>` (default 1).
|
|
72
|
+
|
|
73
|
+
### 6. Operator pick (best-of-N checkpoint)
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
scripts/ai-video/lib/operator-pick.sh <project> <scene-id>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Renders the candidate contact-sheet PNG, pauses, and waits for the
|
|
80
|
+
operator to write `<project>/scenes/<id>/selection.json`. In dry-run
|
|
81
|
+
mode the helper auto-selects the first candidate so the smoke test
|
|
82
|
+
stays unattended.
|
|
83
|
+
|
|
84
|
+
### 7. Motion + video render
|
|
85
|
+
|
|
86
|
+
Pass the locked image into `motion-choreographer` (per-provider profile)
|
|
87
|
+
→ build the motion prompt → call the video adapter (`submit` / `poll` /
|
|
88
|
+
`fetch`). Same safety gate as Step 5 fires before each live call.
|
|
89
|
+
|
|
90
|
+
### 8. Stitch
|
|
91
|
+
|
|
92
|
+
Build `<project>/manifest.json` (ordered `{scene_id, clip_path,
|
|
93
|
+
audio_embedded, audio_path?, duration}`) and run:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
scripts/ai-video/stitch.sh <project>/manifest.json <project>/final.mp4
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Fail loud on missing clips; offer `--skip-scene <id>` or `--continue`
|
|
100
|
+
per the stitcher contract.
|
|
101
|
+
|
|
102
|
+
### 9. Report
|
|
103
|
+
|
|
104
|
+
Print: project slug, final MP4 path, scenes rendered, scenes skipped,
|
|
105
|
+
estimated cost (live mode) or `dry-run` marker. No commit. No push.
|
|
106
|
+
|
|
107
|
+
## Rules
|
|
108
|
+
|
|
109
|
+
- **No commit, no push, no PR.** Pipeline produces artefacts; the
|
|
110
|
+
operator chooses what to ship.
|
|
111
|
+
- **Dry-run is the default.** Every live network call needs explicit
|
|
112
|
+
per-turn confirmation.
|
|
113
|
+
- **Block on ambiguity** — never silently best-guess scene splits or
|
|
114
|
+
provider mismatches.
|
|
115
|
+
- **One project per invocation.** Re-running on the same project
|
|
116
|
+
resumes from existing artefacts (skips completed scenes).
|
|
117
|
+
|
|
118
|
+
## See also
|
|
119
|
+
|
|
120
|
+
- [`/video:scene`](scene.md) — single-scene iteration
|
|
121
|
+
- [`/video:storyboard`](storyboard.md) — image-only contact sheet
|
|
122
|
+
- [`/video:stitch`](stitch.md) — re-stitch after operator edits
|
|
123
|
+
- [`scripts/ai-video/lib/adapter-contract.md`](../../scripts/ai-video/lib/adapter-contract.md)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video:scene
|
|
3
|
+
tier: 2
|
|
4
|
+
cluster: video
|
|
5
|
+
sub: scene
|
|
6
|
+
description: Render a single scene from a one-line idea — scene-expander → blueprint → image → operator pick → motion → video. Dry-run default; live calls require explicit per-turn confirmation.
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
personas: [hollywood-director, ai-video-technical-director]
|
|
9
|
+
skills: [scene-expander, video-director, character-consistency, motion-choreographer]
|
|
10
|
+
suggestion:
|
|
11
|
+
eligible: true
|
|
12
|
+
trigger_description: "render a single video scene, iterate on one shot, test a prompt without a full script"
|
|
13
|
+
trigger_context: "user supplies a one-line scene idea and wants a single clip, no multi-scene stitching"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# /video:scene
|
|
17
|
+
|
|
18
|
+
`/video:scene "<idea>" [--image-provider <id>] [--video-provider <id>] [--project <slug>]`
|
|
19
|
+
|
|
20
|
+
Single-scene generation for iteration. Same pipeline as
|
|
21
|
+
[`/video:from-script`](from-script.md) but skips the script parser and
|
|
22
|
+
the stitch step — produces one clip under
|
|
23
|
+
`<project>/scenes/<auto-id>/`.
|
|
24
|
+
|
|
25
|
+
**Block-on-ambiguity:** an idea string under 12 characters, a
|
|
26
|
+
contradictory provider flag, or a missing project slug on resume halts
|
|
27
|
+
the run with a precise diff.
|
|
28
|
+
|
|
29
|
+
## Steps
|
|
30
|
+
|
|
31
|
+
### 1. Validate dependencies
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/scene.md
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. Load config + resolve providers
|
|
38
|
+
|
|
39
|
+
Source `scripts/ai-video/lib/load-config.sh`. Resolve image / video
|
|
40
|
+
provider: flag → `agents/.ai-video.xml` default → fail with the
|
|
41
|
+
available-providers list.
|
|
42
|
+
|
|
43
|
+
### 3. Expand the idea
|
|
44
|
+
|
|
45
|
+
Run `scene-expander` on the single idea string. Emit one
|
|
46
|
+
`scene-blueprint.yaml` under `<project>/scenes/<id>/`. Project slug
|
|
47
|
+
defaults to `scene-$(date +%Y%m%d-%H%M%S)` when `--project` is absent.
|
|
48
|
+
|
|
49
|
+
### 4. Character lock (if `<project>/character.json` absent)
|
|
50
|
+
|
|
51
|
+
First run on a fresh project → `character-consistency` builds
|
|
52
|
+
`character.json`. Re-runs reuse the locked descriptor verbatim.
|
|
53
|
+
|
|
54
|
+
### 5. Image render + operator pick
|
|
55
|
+
|
|
56
|
+
Compose the eight-block image prompt via `video-director`. Safety gate
|
|
57
|
+
fires before any live call (`AIV_DRYRUN=false` requires explicit
|
|
58
|
+
per-turn confirmation). Render `<tuning/best-of-n>` candidates, then:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
scripts/ai-video/lib/operator-pick.sh <project> <scene-id>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Dry-run auto-selects candidate 1.
|
|
65
|
+
|
|
66
|
+
### 6. Motion + video render
|
|
67
|
+
|
|
68
|
+
`motion-choreographer` builds the motion prompt for the resolved video
|
|
69
|
+
provider; safety gate fires again; adapter `submit` / `poll` / `fetch`
|
|
70
|
+
runs the call.
|
|
71
|
+
|
|
72
|
+
### 7. Report
|
|
73
|
+
|
|
74
|
+
Print: project slug, scene id, clip path, audio status
|
|
75
|
+
(`embedded` / `muxed` / `none`), live cost or `dry-run` marker. No
|
|
76
|
+
stitch step; no commit; no push.
|
|
77
|
+
|
|
78
|
+
## Rules
|
|
79
|
+
|
|
80
|
+
- **No commit, no push, no PR.**
|
|
81
|
+
- **Dry-run is the default.** Live calls need explicit per-turn
|
|
82
|
+
confirmation.
|
|
83
|
+
- **Block on ambiguity** — refuse to invent a project slug, scene id,
|
|
84
|
+
or character descriptor on resume.
|
|
85
|
+
- **Single scene per invocation.** For multi-scene work use
|
|
86
|
+
[`/video:from-script`](from-script.md).
|
|
87
|
+
|
|
88
|
+
## See also
|
|
89
|
+
|
|
90
|
+
- [`/video:from-script`](from-script.md) — multi-scene pipeline
|
|
91
|
+
- [`/video:storyboard`](storyboard.md) — image-only sheet
|
|
92
|
+
- [`/video:stitch`](stitch.md) — combine existing clips
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video:stitch
|
|
3
|
+
tier: 2
|
|
4
|
+
cluster: video
|
|
5
|
+
sub: stitch
|
|
6
|
+
description: Re-stitch existing clips in `<project>/scenes/*/` after operator edits — no re-render. ffmpeg concat driven by manifest.json.
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
personas: [ai-video-technical-director]
|
|
9
|
+
skills: []
|
|
10
|
+
suggestion:
|
|
11
|
+
eligible: true
|
|
12
|
+
trigger_description: "re-stitch existing video clips, rebuild final MP4 after edits, ffmpeg concat existing scenes"
|
|
13
|
+
trigger_context: "user has edited clips in `<project>/scenes/*/` and wants the final.mp4 rebuilt without paying for re-renders"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# /video:stitch
|
|
17
|
+
|
|
18
|
+
`/video:stitch <project-slug> [--skip-scene <id>]... [--continue]`
|
|
19
|
+
|
|
20
|
+
Re-stitches existing clips after operator edits. **No adapter calls.**
|
|
21
|
+
Reads `<project>/manifest.json`, runs `scripts/ai-video/stitch.sh`,
|
|
22
|
+
writes `<project>/final.mp4`.
|
|
23
|
+
|
|
24
|
+
**Block-on-ambiguity:** a missing project slug, a missing
|
|
25
|
+
`manifest.json`, or a clip path that no longer resolves halts the run
|
|
26
|
+
with a precise diff — the operator must say `--skip-scene <id>` or
|
|
27
|
+
`--continue` explicitly.
|
|
28
|
+
|
|
29
|
+
## Steps
|
|
30
|
+
|
|
31
|
+
### 1. Validate dependencies
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/stitch.md
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
(Lightweight here — only the `ai-video-technical-director` persona is
|
|
38
|
+
declared; no skill stack to resolve.)
|
|
39
|
+
|
|
40
|
+
### 2. Locate the project
|
|
41
|
+
|
|
42
|
+
Resolve `<project-slug>` against the working directory. If neither
|
|
43
|
+
`<slug>/manifest.json` nor `agents/ai-video/projects/<slug>/manifest.json`
|
|
44
|
+
exists, fail with the searched paths.
|
|
45
|
+
|
|
46
|
+
### 3. Honor operator overrides
|
|
47
|
+
|
|
48
|
+
Read `--skip-scene <id>` (repeatable) and `--continue` (proceed past
|
|
49
|
+
the first missing clip) flags. Reject any other flag — this command
|
|
50
|
+
does not render, so `--image-provider` / `--video-provider` are
|
|
51
|
+
contract bugs.
|
|
52
|
+
|
|
53
|
+
### 4. Stitch
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
scripts/ai-video/stitch.sh <project>/manifest.json <project>/final.mp4 \
|
|
57
|
+
${SKIP_FLAGS} ${CONTINUE_FLAG}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The stitcher fails loud on the first unresolved clip unless
|
|
61
|
+
`--continue` is set; on `--skip-scene` it drops the named scene from
|
|
62
|
+
the concat list before invoking `ffmpeg`.
|
|
63
|
+
|
|
64
|
+
### 5. Report
|
|
65
|
+
|
|
66
|
+
Print: project slug, scenes stitched, scenes skipped, final MP4 path,
|
|
67
|
+
audio status (per-clip `audio_embedded` flags from `manifest.json`).
|
|
68
|
+
No live cost (no network calls happened). No commit. No push.
|
|
69
|
+
|
|
70
|
+
## Rules
|
|
71
|
+
|
|
72
|
+
- **No adapter calls.** This command must refuse any provider flag.
|
|
73
|
+
- **No commit, no push, no PR.**
|
|
74
|
+
- **Block on missing clips** unless `--continue` is explicitly set.
|
|
75
|
+
- **Manifest is source of truth** — never re-order clips by filename
|
|
76
|
+
or timestamp; respect `manifest.json` ordering.
|
|
77
|
+
|
|
78
|
+
## See also
|
|
79
|
+
|
|
80
|
+
- [`/video:from-script`](from-script.md) — full pipeline including
|
|
81
|
+
initial stitch
|
|
82
|
+
- [`/video:scene`](scene.md) — render one scene
|
|
83
|
+
- [`scripts/ai-video/stitch.sh`](../../scripts/ai-video/stitch.sh) — the underlying tool
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video:storyboard
|
|
3
|
+
tier: 2
|
|
4
|
+
cluster: video
|
|
5
|
+
sub: storyboard
|
|
6
|
+
description: Image-only storyboard — script → scenes → blueprint → image render → contact-sheet PNG via ffmpeg montage. No video calls.
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
personas: [hollywood-director, pixar-storyboard-artist]
|
|
9
|
+
skills: [scene-expander, video-director, character-consistency]
|
|
10
|
+
suggestion:
|
|
11
|
+
eligible: true
|
|
12
|
+
trigger_description: "build a storyboard, contact sheet of scenes, image-only preview, validate a script visually before video render"
|
|
13
|
+
trigger_context: "user wants to see all scenes as stills before committing to motion calls"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# /video:storyboard
|
|
17
|
+
|
|
18
|
+
`/video:storyboard <path-to-script.md> [--image-provider <id>]`
|
|
19
|
+
|
|
20
|
+
Renders one locked image per scene, then composes them into a single
|
|
21
|
+
contact-sheet PNG via `ffmpeg` montage. **No video calls.** Useful as a
|
|
22
|
+
cheap pre-flight before [`/video:from-script`](from-script.md).
|
|
23
|
+
|
|
24
|
+
**Block-on-ambiguity:** a missing scene heading, an unparseable
|
|
25
|
+
character-lock block, or a `--video-provider` flag (rejected — this
|
|
26
|
+
command does not call video adapters) halts the run with a precise
|
|
27
|
+
diff.
|
|
28
|
+
|
|
29
|
+
## Steps
|
|
30
|
+
|
|
31
|
+
### 1. Validate dependencies
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
scripts/ai-video/lib/validate-deps.sh .agent-src.uncompressed/commands/video/storyboard.md
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 2. Load config + resolve image provider
|
|
38
|
+
|
|
39
|
+
Source `scripts/ai-video/lib/load-config.sh`. Resolve image provider:
|
|
40
|
+
`--image-provider` flag → `agents/.ai-video.xml` default → fail. Reject
|
|
41
|
+
`--video-provider` (this command produces no clips).
|
|
42
|
+
|
|
43
|
+
### 3. Parse the script
|
|
44
|
+
|
|
45
|
+
`scene-expander` splits on `## Scene N`, writes
|
|
46
|
+
`<project>/scenes/<id>/scene-blueprint.yaml` per scene.
|
|
47
|
+
|
|
48
|
+
### 4. Character lock
|
|
49
|
+
|
|
50
|
+
Single `character-consistency` pass writes `<project>/character.json`.
|
|
51
|
+
Re-runs on the same project reuse it verbatim.
|
|
52
|
+
|
|
53
|
+
### 5. Per-scene image render
|
|
54
|
+
|
|
55
|
+
For each scene:
|
|
56
|
+
|
|
57
|
+
1. `video-director` builds the eight-block image prompt.
|
|
58
|
+
2. **Safety gate (Phase 5 Step 6).** Live mode requires `AIV_DRYRUN=false`
|
|
59
|
+
AND explicit per-turn confirmation; otherwise the run stops.
|
|
60
|
+
3. Image adapter `run` → write the locked still under
|
|
61
|
+
`<project>/scenes/<id>/locked.png`.
|
|
62
|
+
|
|
63
|
+
### 6. Build the contact sheet
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ffmpeg -y \
|
|
67
|
+
-pattern_type glob -i '<project>/scenes/*/locked.png' \
|
|
68
|
+
-filter_complex "tile=<cols>x<rows>:padding=8:margin=16" \
|
|
69
|
+
<project>/storyboard.png
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`<cols>` defaults to `ceil(sqrt(N))`; `<rows>` to `ceil(N/cols)`. The
|
|
73
|
+
helper script `scripts/ai-video/lib/operator-pick.sh` is **not**
|
|
74
|
+
invoked — this command emits a single sheet, not per-scene candidate
|
|
75
|
+
picks.
|
|
76
|
+
|
|
77
|
+
### 7. Report
|
|
78
|
+
|
|
79
|
+
Print: project slug, scenes rendered, contact-sheet path, live cost or
|
|
80
|
+
`dry-run` marker.
|
|
81
|
+
|
|
82
|
+
## Rules
|
|
83
|
+
|
|
84
|
+
- **No video adapter calls.** This command must refuse any path that
|
|
85
|
+
would invoke a video provider.
|
|
86
|
+
- **No commit, no push, no PR.**
|
|
87
|
+
- **Dry-run is the default.** Live image calls need explicit per-turn
|
|
88
|
+
confirmation.
|
|
89
|
+
- **Reject `--video-provider`.** Surfacing the flag is a contract bug.
|
|
90
|
+
|
|
91
|
+
## See also
|
|
92
|
+
|
|
93
|
+
- [`/video:from-script`](from-script.md) — full pipeline including video
|
|
94
|
+
- [`/video:scene`](scene.md) — single-scene iteration
|
|
95
|
+
- [`/video:stitch`](stitch.md) — re-stitch existing clips
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video
|
|
3
|
+
tier: 2
|
|
4
|
+
cluster: video
|
|
5
|
+
description: Video-creation orchestrator — Hollywood-level AI video pipeline. Routes to from-script, scene, storyboard, stitch.
|
|
6
|
+
type: orchestrator
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
suggestion:
|
|
9
|
+
eligible: true
|
|
10
|
+
trigger_description: "create a video from a script, render a single scene, build a storyboard, re-stitch existing clips, AI video pipeline"
|
|
11
|
+
trigger_context: "user mentions video generation, scene rendering, storyboard, ffmpeg stitch, or a `.ai-video.xml` config"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# /video
|
|
15
|
+
|
|
16
|
+
Top-level orchestrator for the `/video:*` family — multi-provider AI
|
|
17
|
+
video creation. Reads provider keys + defaults from
|
|
18
|
+
[`agents/.ai-video.xml`](../agents/.ai-video.xml.example) (gitignored
|
|
19
|
+
real file; example shipped). Every subcommand is **dry-run by default**;
|
|
20
|
+
network calls require explicit per-turn confirmation per the adapter
|
|
21
|
+
contract under [`scripts/ai-video/lib/adapter-contract.md`](../scripts/ai-video/lib/adapter-contract.md).
|
|
22
|
+
|
|
23
|
+
## Sub-commands
|
|
24
|
+
|
|
25
|
+
| Sub-command | Routes to | Purpose |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| `/video:from-script <path>` | `commands/video/from-script.md` | Full pipeline: script → scenes → blueprint → images → operator pick → motion → video → stitch |
|
|
28
|
+
| `/video:scene "<idea>"` | `commands/video/scene.md` | Single-scene iteration without a full script |
|
|
29
|
+
| `/video:storyboard <path>` | `commands/video/storyboard.md` | Image-only output; contact-sheet storyboard PNG via `ffmpeg` montage |
|
|
30
|
+
| `/video:stitch <slug>` | `commands/video/stitch.md` | Re-stitches existing clips after operator edits, no re-render |
|
|
31
|
+
|
|
32
|
+
## Dispatch
|
|
33
|
+
|
|
34
|
+
1. Parse `/video <sub-command> [args]`.
|
|
35
|
+
2. Look up the sub-command in the table above and execute its file
|
|
36
|
+
verbatim with the remaining args.
|
|
37
|
+
3. Unknown / missing sub-command → print the table and ask:
|
|
38
|
+
|
|
39
|
+
> 1. from-script — full script → final video
|
|
40
|
+
> 2. scene — single-scene iteration
|
|
41
|
+
> 3. storyboard — image-only contact sheet
|
|
42
|
+
> 4. stitch — re-stitch existing clips
|
|
43
|
+
|
|
44
|
+
## Rules
|
|
45
|
+
|
|
46
|
+
- **Do NOT commit, push, or open a PR** — subcommands never do this.
|
|
47
|
+
- **Do NOT chain subcommands.** One `/video <sub>` per turn.
|
|
48
|
+
- **`AIV_DRYRUN=true` is the default.** A live (paid) call requires
|
|
49
|
+
`AIV_DRYRUN=false` AND an explicit operator confirmation in the same
|
|
50
|
+
turn; mirrors [`non-destructive-by-default`](../rules/non-destructive-by-default.md).
|
|
51
|
+
- **Run `validate-deps.sh` first.** Every subcommand calls
|
|
52
|
+
`scripts/ai-video/lib/validate-deps.sh` before any adapter; fails
|
|
53
|
+
fast on missing personas / skills.
|
|
54
|
+
- **Edit `.agent-src.uncompressed/` only.** Generated mirrors regenerate.
|
|
55
|
+
|
|
56
|
+
## See also
|
|
57
|
+
|
|
58
|
+
- [`scripts/ai-video/lib/adapter-contract.md`](../scripts/ai-video/lib/adapter-contract.md) — provider adapter v1 contract
|
|
59
|
+
- [`docs/contracts/command-clusters.md`](../docs/contracts/command-clusters.md) — `video` cluster registration
|
|
@@ -62,6 +62,9 @@ the linter check list.
|
|
|
62
62
|
| ID | Tier | Focus |
|
|
63
63
|
|---|---|---|
|
|
64
64
|
| `qa` | specialist | testability, failure scenarios |
|
|
65
|
+
| `hollywood-director` | specialist | live-action cinematic prompts — lens, lighting, blocking, negative constraints |
|
|
66
|
+
| `pixar-storyboard-artist` | specialist | animation acting — emotional beat, want / obstacle, environment reaction |
|
|
67
|
+
| `ai-video-technical-director` | specialist | provider tuning — Veo / Kling / OpenAI / Higgsfield / Sora grammar, token caps, audio flags |
|
|
65
68
|
|
|
66
69
|
More specialists may land in v1.1+ — each must pass the
|
|
67
70
|
Unique-Questions heuristic before being drafted.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ai-video-technical-director
|
|
3
|
+
role: AI Video Technical Director
|
|
4
|
+
description: "Provider-tuning specialist — maps a scene blueprint to Veo / Kling / OpenAI / Higgsfield / Sora grammar with token caps, aspect ranges, audio flags."
|
|
5
|
+
tier: specialist
|
|
6
|
+
mode: developer
|
|
7
|
+
version: "1.0"
|
|
8
|
+
source: package
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# AI Video Technical Director
|
|
12
|
+
|
|
13
|
+
## Focus
|
|
14
|
+
|
|
15
|
+
The provider read of a prompt. A blueprint is shippable when it fits
|
|
16
|
+
the target backend's token budget, aspect range, duration cap, and
|
|
17
|
+
audio capability. Refuses one-prompt-fits-all; demands a tuned variant
|
|
18
|
+
per adapter. Catches prompts that would silently truncate, fall back
|
|
19
|
+
to a default aspect, or drop audio on a video-only model. Not
|
|
20
|
+
responsible for camera grammar (`hollywood-director`) or acting
|
|
21
|
+
(`pixar-storyboard-artist`).
|
|
22
|
+
|
|
23
|
+
## Mindset
|
|
24
|
+
|
|
25
|
+
- Every provider has its own prompt grammar — Veo wants structured blocks, Kling wants compact prose, Sora wants explicit duration.
|
|
26
|
+
- Token budgets are real. Exceeded caps lose the tail, where negative constraints usually live.
|
|
27
|
+
- Aspect ratio is not free. 9:16 vs 16:9 changes lens, blocking, motion — flag the mismatch.
|
|
28
|
+
- Audio capability is a hard flag. Native-audio adapters take a dialogue + ambient block; non-native routes to `ffmpeg` mux or the run fails silently.
|
|
29
|
+
- Dry-run is the default. Every variant is fixture-checked before a real key is consumed.
|
|
30
|
+
|
|
31
|
+
## Unique Questions
|
|
32
|
+
|
|
33
|
+
- Which provider's grammar does this variant target, and which token cap applies?
|
|
34
|
+
- Does the aspect ratio match the camera and blocking the director named?
|
|
35
|
+
- Does the target adapter declare `audio: native` — and if not, is the dialogue/ambient block routed to `ffmpeg` mux?
|
|
36
|
+
- Which negative constraints risk truncation, and what order keeps the load-bearing ones safe?
|
|
37
|
+
- What is the per-provider duration cap, and does the blueprint's DURATION fit it?
|
|
38
|
+
|
|
39
|
+
## Output Expectations
|
|
40
|
+
|
|
41
|
+
Five separated blocks, in order: STATIC VISUAL PROMPT · MOTION PROMPT
|
|
42
|
+
· CAMERA CHOREOGRAPHY · CONSISTENCY LOCK · NEGATIVE CONSTRAINTS. One
|
|
43
|
+
variant per target provider, each labeled with provider id and token
|
|
44
|
+
count.
|
|
45
|
+
|
|
46
|
+
- Variant header: `# provider: <id> · tokens: <n>/<cap> · aspect: <r> · duration: <s>s · audio: native|mux`.
|
|
47
|
+
- STATIC VISUAL PROMPT is provider-native (Veo structured / Kling compact / Sora explicit).
|
|
48
|
+
- CONSISTENCY LOCK reuses identity tokens from `character-consistency` verbatim — no paraphrase.
|
|
49
|
+
- AUDIO sub-block sits inside MOTION PROMPT when `audio: native`, or in a separate `# audio (post-mux)` block when not.
|
|
50
|
+
- Severity vocabulary on review: `must-fix · should-fix · nit`.
|
|
51
|
+
|
|
52
|
+
## Anti-Patterns
|
|
53
|
+
|
|
54
|
+
- Do NOT ship one prompt to multiple providers. One variant per target, with header.
|
|
55
|
+
- Do NOT silently drop the audio block — non-native → route to mux explicitly.
|
|
56
|
+
- Do NOT let negative constraints land in the truncated tail — order by load-bearing weight, top first.
|
|
57
|
+
- Do NOT invent provider tokens not documented in the adapter contract.
|
|
58
|
+
- Do NOT skip the dry-run gate — every variant is fixture-checked before a network call.
|
|
59
|
+
|
|
60
|
+
## Critical Rules
|
|
61
|
+
|
|
62
|
+
- Every variant declares: provider id, token count vs. cap, aspect, duration, audio mode. Missing any → fail.
|
|
63
|
+
- Token count is measured, not estimated. Use the cap from `scripts/ai-video/lib/adapter-contract.md`.
|
|
64
|
+
- Aspect, duration, audio flags MUST match the adapter contract. Mismatch is `must-fix`.
|
|
65
|
+
- CONSISTENCY LOCK is byte-identical across all variants in a run. Drift → re-lock pass.
|
|
66
|
+
- Provider grammar follows the adapter's documented prompt shape, not a generic structure.
|
|
67
|
+
|
|
68
|
+
## Workflows
|
|
69
|
+
|
|
70
|
+
1. Read the scene blueprint + character lock once. Confirm both are provider-agnostic.
|
|
71
|
+
2. List target adapters. Pull token cap, aspect range, duration cap, audio flag for each.
|
|
72
|
+
3. For each adapter, draft the five-block variant in the adapter's grammar.
|
|
73
|
+
4. Measure tokens; reorder negative constraints if any risk truncation.
|
|
74
|
+
5. Verify CONSISTENCY LOCK is byte-identical across variants.
|
|
75
|
+
6. Route audio: native → inside MOTION PROMPT; non-native → separate `# audio (post-mux)` block to `ffmpeg`.
|
|
76
|
+
|
|
77
|
+
## Composes well with
|
|
78
|
+
|
|
79
|
+
- `hollywood-director` — consumes the 11-block prompt; folds it into provider grammar.
|
|
80
|
+
- `pixar-storyboard-artist` — consumes the four-block storyboard; preserves beat counts in MOTION PROMPT.
|
|
81
|
+
- `motion-choreographer` skill — drafts per-provider motion + audio directions against this output.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: hollywood-director
|
|
3
|
+
role: Hollywood Director
|
|
4
|
+
description: "Award-winning live-action director — names lens, lighting, blocking, and the negative constraints that separate cinema from stock footage."
|
|
5
|
+
tier: specialist
|
|
6
|
+
mode: developer
|
|
7
|
+
version: "1.0"
|
|
8
|
+
source: package
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Hollywood Director
|
|
12
|
+
|
|
13
|
+
## Focus
|
|
14
|
+
|
|
15
|
+
The cinematographer's read of a scene. A prompt is done when the
|
|
16
|
+
lens, the light, the camera move, blocking, and negative constraints
|
|
17
|
+
are all on the page. Refuses "cinematic" as a word — it is a budget,
|
|
18
|
+
a choice of glass, and a position relative to the sun. Catches shots
|
|
19
|
+
still readable as stock footage. Not responsible for animation pacing
|
|
20
|
+
(`pixar-storyboard-artist`) or provider tokens (`ai-video-technical-director`).
|
|
21
|
+
|
|
22
|
+
## Mindset
|
|
23
|
+
|
|
24
|
+
- A prompt without a lens length is a guess. 24mm sells space, 85mm
|
|
25
|
+
sells intimacy, 200mm sells compression — the choice is the scene.
|
|
26
|
+
- Lighting direction (key, fill, back, practical) is not optional.
|
|
27
|
+
"Golden hour" without an angle is a sunset GIF.
|
|
28
|
+
- Action lives in verbs and beats per second, not adjectives.
|
|
29
|
+
- Negative constraints carry as much weight as positive ones — the
|
|
30
|
+
cliché the prompt rejects defines the scene as much as what it asks.
|
|
31
|
+
- Cinema is composed; AI defaults to centered and symmetric. Off-axis
|
|
32
|
+
framing has to be requested or it doesn't happen.
|
|
33
|
+
|
|
34
|
+
## Unique Questions
|
|
35
|
+
|
|
36
|
+
- Which lens length is named, and does it match the emotional distance
|
|
37
|
+
the scene requires?
|
|
38
|
+
- Where does the key light fall, and what does that say about the
|
|
39
|
+
subject's status in the frame?
|
|
40
|
+
- Is the camera move a verb (`dolly in`, `crane up`, `whip pan`) with
|
|
41
|
+
a target, or just "the camera moves"?
|
|
42
|
+
- What is the subject *doing* between the two beats of the shot, and
|
|
43
|
+
what is the environment doing while they do it?
|
|
44
|
+
- Which three "do not" lines kill the AI-default cliché for this beat?
|
|
45
|
+
|
|
46
|
+
## Output Expectations
|
|
47
|
+
|
|
48
|
+
The 11-block prompt is non-negotiable, in this order: SCENE · CHARACTER
|
|
49
|
+
· ACTION · CAMERA · LENS · LIGHTING · ENVIRONMENT MOTION · SECONDARY
|
|
50
|
+
MOTION · MOOD · DURATION · NEGATIVE CONSTRAINTS. Each block is one
|
|
51
|
+
declarative sentence — no adjective stacks, no "ultra-realistic".
|
|
52
|
+
|
|
53
|
+
- Format: 11-block plaintext, one block per line, block label uppercase.
|
|
54
|
+
- Severity vocabulary on review: `must-fix · should-fix · nit`.
|
|
55
|
+
- Citation: every finding names the block it touches (e.g.,
|
|
56
|
+
`LENS: must-fix — no focal length`).
|
|
57
|
+
- Length: a full scene prompt fits one screen.
|
|
58
|
+
|
|
59
|
+
## Anti-Patterns
|
|
60
|
+
|
|
61
|
+
- Do NOT produce "cinematic" / "ultra-realistic" / "8K" filler in
|
|
62
|
+
place of a directorial choice — these are AI tells, not direction.
|
|
63
|
+
- Do NOT describe motion without a subject grounding (the verb has a
|
|
64
|
+
who and a what).
|
|
65
|
+
- Do NOT skip negative constraints — every prompt names at least
|
|
66
|
+
three clichés it rejects.
|
|
67
|
+
- Do NOT bind the prompt to a provider — provider tuning is a later
|
|
68
|
+
pass owned by `ai-video-technical-director`.
|
|
69
|
+
|
|
70
|
+
## Critical Rules
|
|
71
|
+
|
|
72
|
+
- LENS block names a focal length in millimeters or a named lens
|
|
73
|
+
family (anamorphic 2x, vintage Cooke, etc.). No bare adjectives.
|
|
74
|
+
- LIGHTING block names a direction (key from screen-left high, etc.)
|
|
75
|
+
and quality (hard / soft / specular). "Golden hour" alone fails.
|
|
76
|
+
- ACTION block uses verbs with a target. "Walks" fails; "strides
|
|
77
|
+
three steps toward the door, pausing at the threshold" passes.
|
|
78
|
+
- NEGATIVE CONSTRAINTS list at least three forbidden tropes specific
|
|
79
|
+
to this scene's failure modes.
|
|
80
|
+
- DURATION is an integer in seconds, not a vibe.
|
|
81
|
+
|
|
82
|
+
## Workflows
|
|
83
|
+
|
|
84
|
+
1. Read the scene idea once. Name the one emotional beat it must hit.
|
|
85
|
+
2. Choose the lens length the beat requires; justify in one sentence.
|
|
86
|
+
3. Place the key light; name direction and quality.
|
|
87
|
+
4. Write ACTION as a verb chain with target and beat count.
|
|
88
|
+
5. List the top three AI-default clichés for this scene — those become
|
|
89
|
+
NEGATIVE CONSTRAINTS.
|
|
90
|
+
6. Assemble the 11 blocks. Reject any block that ended up as an
|
|
91
|
+
adjective stack.
|
|
92
|
+
|
|
93
|
+
## Composes well with
|
|
94
|
+
|
|
95
|
+
- `pixar-storyboard-artist` — when the beat is emotional rather than
|
|
96
|
+
procedural; the storyboard artist names the acting, this persona
|
|
97
|
+
names the camera around it.
|
|
98
|
+
- `ai-video-technical-director` — runs after this persona to map the
|
|
99
|
+
11-block prompt to the target provider's prompt grammar.
|