@slatesvideo/shared 0.6.3 → 0.6.5
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/dist/api-url.d.ts +11 -0
- package/dist/api-url.js +11 -0
- package/dist/auth.d.ts +13 -1
- package/dist/auth.js +9 -5
- package/dist/clients/cloud.d.ts +3 -0
- package/dist/clients/cloud.js +34 -3
- package/dist/clients/desktop.js +3 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +20 -2
- package/dist/manual/content.d.ts +2 -0
- package/dist/manual/content.js +3 -0
- package/dist/manual/index.d.ts +5 -0
- package/dist/manual/index.js +20 -0
- package/dist/operations/index.d.ts +253 -30
- package/dist/operations/index.js +1387 -141
- package/dist/operations/surface.d.ts +69 -0
- package/dist/operations/surface.js +227 -0
- package/dist/prompts/agent-doctrine.js +8 -0
- package/dist/prompts/asset-label.d.ts +23 -0
- package/dist/prompts/asset-label.js +70 -0
- package/dist/prompts/banned-tokens.d.ts +15 -3
- package/dist/prompts/banned-tokens.js +76 -9
- package/dist/prompts/character-sheet.d.ts +0 -2
- package/dist/prompts/character-sheet.js +0 -2
- package/dist/prompts/craft-cards.d.ts +20 -0
- package/dist/prompts/craft-cards.js +82 -0
- package/dist/prompts/environment-sheet.js +16 -0
- package/dist/prompts/index.d.ts +1 -0
- package/dist/prompts/index.js +4 -0
- package/dist/prompts/model-capabilities.d.ts +52 -0
- package/dist/prompts/model-capabilities.js +42 -0
- package/dist/prompts/model-facts.d.ts +0 -4
- package/dist/prompts/model-facts.js +8 -4
- package/dist/prompts/partials.generated.js +2 -1
- package/dist/prompts/prompting-tips.d.ts +1 -1
- package/dist/prompts/prompting-tips.js +58 -0
- package/dist/prompts/reference-composer.d.ts +36 -7
- package/dist/prompts/reference-composer.js +75 -20
- package/dist/prompts/reference-rules.d.ts +15 -26
- package/dist/prompts/reference-rules.js +15 -93
- package/dist/prompts/shot-grammar.d.ts +154 -0
- package/dist/prompts/shot-grammar.js +184 -0
- package/dist/prompts/shot-spec.d.ts +278 -0
- package/dist/prompts/shot-spec.js +319 -0
- package/dist/skills/content.js +25 -23
- package/exports/slates-prompt-builder/generated/reference-content-policy.md +6 -0
- package/exports/slates-prompt-builder/generated/reference-kling.md +22 -0
- package/exports/slates-prompt-builder/generated/reference-nano-banana.md +17 -0
- package/exports/slates-prompt-builder/generated/reference-seedance.md +17 -0
- package/exports/slates-prompt-builder/generated/slates-prompt-builder-manifest.json +15 -15
- package/exports/slates-prompt-builder/generated/slates-prompt-builder.skill +0 -0
- package/package.json +83 -73
- package/skills/_partials/decision-log.md +5 -4
- package/skills/_partials/thresholds.md +19 -0
- package/skills/slates-content-policy.md +15 -1
- package/skills/slates-cost-discipline.md +26 -4
- package/skills/slates-model-selection.md +4 -3
- package/skills/slates-one-prompt-film.md +20 -12
- package/skills/slates-project-organization.md +1 -1
- package/skills/slates-prompting-elevenlabs.md +61 -2
- package/skills/slates-prompting-flux-2-max.md +39 -0
- package/skills/slates-prompting-gpt-image-2.md +109 -70
- package/skills/slates-prompting-inworld-tts.md +174 -0
- package/skills/slates-prompting-kling-v3.md +39 -0
- package/skills/slates-prompting-lip-sync.md +38 -0
- package/skills/slates-prompting-ltx-2-5.md +38 -0
- package/skills/slates-prompting-minimax-h3.md +39 -0
- package/skills/slates-prompting-motion-transfer.md +38 -0
- package/skills/slates-prompting-nano-banana-2.md +26 -0
- package/skills/slates-prompting-omni-flash.md +41 -0
- package/skills/slates-prompting-seed-audio.md +39 -1
- package/skills/slates-prompting-seedance-2-5.md +38 -0
- package/skills/slates-prompting-seedance.md +26 -0
- package/skills/slates-prompting-seedream-5-lite.md +38 -0
- package/skills/slates-prompting-veo-3.md +39 -0
- package/skills/slates-shot-variety.md +53 -0
- package/skills/slates-storyboard-from-script.md +31 -15
- package/skills/slates-style-prompting.md +1 -1
- package/skills/slates-vision-feedback-loop.md +1 -1
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
# Content-policy-safe construction — read before any risk-surface prompt
|
|
6
6
|
|
|
7
|
+
**Never use** — each one is a filter tripwire with a substitution in the table above:
|
|
8
|
+
- `civilians in panic`, `crowds fleeing`, `blood`, `gore`, `corpse`
|
|
9
|
+
- `ignite`, `catch fire`, `on fire` applied to a person — frame body-contact effects as magical or harmless VFX
|
|
10
|
+
- `candle-like`, `flame-like` and any real object used as a metaphor for an effect
|
|
11
|
+
- a real, named public figure
|
|
12
|
+
|
|
7
13
|
Don't depict the harm — depict the energy, the aftermath, the threat, or the scale. Build the scene safe from the first word.
|
|
8
14
|
|
|
9
15
|
Write scenes that hit full cinematic impact without ever *needing* to depict prohibited content. This is a craft move, not a compromise — the substitutions below usually read as more cinematic, not less, and they keep your generation from getting silently rejected or degraded by the model's filter. A standoff is more tense than a massacre; an evacuated city is eerier than a crowd in panic; a roar lands harder than a kill. Load this whenever a prompt involves conflict, creatures, crowds, destruction, weapons, or young characters.
|
|
@@ -4,6 +4,28 @@
|
|
|
4
4
|
|
|
5
5
|
# Kling V3.0 — prompting
|
|
6
6
|
|
|
7
|
+
<!-- @card:start -->
|
|
8
|
+
**Card — Kling V3.0.** The general default. Define the core subjects clearly at the START and keep those descriptions identical across shots. Up to 15s, up to 6 cuts, and the strongest image-to-video identity hold in the catalogue.
|
|
9
|
+
|
|
10
|
+
**The five levers**
|
|
11
|
+
1. **Dialogue in quotes** — `Character says, "exact words here"`. On Omni, direct the voice with `Gender + Age + Voice quality + Speech rate + Emotional tone + Language`: `[Character A: Detective, mid-40s, raspy, slow cadence, weary]: "I've seen this before."`
|
|
12
|
+
2. **Unique speaker labels, no pronouns after the introduction.** `he`, `the agent`, any synonym causes voice drift.
|
|
13
|
+
3. **Sound has real syntax** — `SFX: heavy boots on wet pavement, distant siren wailing`, `Ambient noise: city traffic`, `Background music: low cello`. Always physical-cause specific; `SFX: footsteps` is not enough.
|
|
14
|
+
4. **Motion adverbs modulate energy directly** — `slowly`, `rapidly`, `gently`, `explosively`. One primary camera move per shot, never stacked.
|
|
15
|
+
5. **On image-to-video, do NOT re-describe the image.** It is an anchor; prompt how the scene EVOLVES from it — movement, camera, environmental change.
|
|
16
|
+
|
|
17
|
+
**Examples**
|
|
18
|
+
- `A detective in a wet grey overcoat stands under a stairwell light. He steps forward slowly as the light flickers. [Character A: Detective, mid-40s, raspy voice, slow cadence, weary]: "I've seen this before." SFX: heavy boots on wet concrete, distant siren wailing. Ambient noise: rain on metal.`
|
|
19
|
+
- `Camera tracks right alongside a cyclist crossing a bridge at dusk. She rises out of the saddle rapidly as the grade steepens. Ambient noise: wind, tyres on wet asphalt, distant traffic.`
|
|
20
|
+
|
|
21
|
+
**Hard constraint:** `Immediately` (Omni only) removes the natural conversational beat between speakers — use it when timing matters and leave it out when it does not. Kling has a real `negativePrompt` field, unlike Seedance; start from the standard block and layer scene-specific suppressions.
|
|
22
|
+
<!-- @card:end -->
|
|
23
|
+
|
|
24
|
+
**Never use:**
|
|
25
|
+
- `SFX: footsteps` and any label-only effect — physical-cause specificity or nothing
|
|
26
|
+
- a pronoun or synonym for a speaker after the first introduction (`he`, `the agent`) — it causes voice drift; repeat the full label
|
|
27
|
+
- `single continuous take` — Seedance's phrase, and it fights Kling's multi-shot
|
|
28
|
+
|
|
7
29
|
Kuaishou's video model. Three tiers: `kling-v3.0-std` (general use, no audio), `kling-v3.0-pro` (higher visual quality, no audio), `kling-v3.0-omni` (multi-character dialogue + audio-visual co-generation).
|
|
8
30
|
|
|
9
31
|
Up to 15s. Multi-shot supported (up to 6 cuts in 15s total). Strong on image-to-video — preserves identity, layout, and text from the input image well.
|
|
@@ -4,6 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
# Nano Banana 2 — cinematic & photorealistic prompting
|
|
6
6
|
|
|
7
|
+
<!-- @card:start -->
|
|
8
|
+
**Card — Nano Banana 2 (Gemini 3.1 Flash Image).** Brief it like a creative director, not a tag list. Structure: `Film still from [director] [genre]. Shot on [camera] with [lens]. [Subject and action]. [3-5 specific visual details]. [Lighting — direction + quality]. [Color palette]. [Film stock]. [1-2 word tone].`
|
|
9
|
+
|
|
10
|
+
**The five levers**
|
|
11
|
+
1. **Named lens + aperture** beats "shallow depth of field" — `85mm f/1.4`, `135mm f/2.8` (the cheat code for skin), `Panavision anamorphic`, `400mm telephoto`.
|
|
12
|
+
2. **Light by direction and quality**, never "good lighting" — `hard sidelight from a single window, deep falloff`, `overcast north light`, `practical tungsten spill`.
|
|
13
|
+
3. **A named film stock or sensor** carries a whole palette — `Kodak Portra 400`, `Cinestill 800T`, `ARRI Alexa 65`.
|
|
14
|
+
4. **Composition as a shot** — `low angle`, `aerial view`, `rule of thirds with the subject camera-left`, `foreground occlusion`.
|
|
15
|
+
5. **Positive framing only.** Describe what is there. "Empty street", never "no cars"; "unstaged documentary photography", never "not anime".
|
|
16
|
+
|
|
17
|
+
**Examples**
|
|
18
|
+
- `Film still from a Denis Villeneuve thriller. Shot on ARRI Alexa 65, 85mm f/1.4. A woman in a charcoal wool coat stands at a rain-slick bus stop, breath visible. Hard sodium light from a single overhead lamp, deep falloff into blue night. Kodak Vision3 500T. Isolated.`
|
|
19
|
+
- `Editorial still life on seamless bone paper. 100mm macro, f/8. A cracked ceramic bowl holding three figs. Soft north light from camera-left, one gentle shadow. Muted earth palette. Portra 400 grain. Quiet.`
|
|
20
|
+
|
|
21
|
+
**Hard constraint:** there is no `negativePrompt` field. Suppress by reframing positively, or inline `without` / `free of`. Knowledge cutoff January 2025 — anything later needs reference images.
|
|
22
|
+
<!-- @card:end -->
|
|
23
|
+
|
|
7
24
|
Nano Banana 2 is **Gemini 3.1 Flash Image**. It is **not** Gemini 3 Pro Image; that is Nano Banana **Pro** (`nano-banana-pro`), a separate model with its own seat. NB2 is a language model that outputs pixels — brief it like a creative director, not like a Stable-Diffusion tag-soup tool. The single biggest lever for realism: **specificity that mimics how real photographers and cinematographers describe their work**.
|
|
8
25
|
|
|
9
26
|
Knowledge cutoff: January 2025. Anything after needs explicit reference images.
|
|
@@ -4,6 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
# Seedance 2.0 — prompting
|
|
6
6
|
|
|
7
|
+
<!-- @card:start -->
|
|
8
|
+
**Card — Seedance 2.0.** Not copywriting — an ENGINEERING instruction to a spatial layer and a temporal layer: who, in what scene, doing what, how the camera moves, and in what order. Multi-beat work is a `Shot 1 / Shot 2 / Shot 3` storyboard.
|
|
9
|
+
|
|
10
|
+
**The five levers**
|
|
11
|
+
1. **Bind every subject to its reference** — `<Subject_1>@<Image_1>` — and keep the descriptions identical across shots. Unbound subjects are where twins come from.
|
|
12
|
+
2. **Shot sizes and camera MOVES, not lens data** — `medium close-up`, `slow push in`, `handheld follow`, `whip pan`. One primary move per shot.
|
|
13
|
+
3. **Externalise emotion as physical action.** Not "she is nervous": `she turns the ring on her finger twice, then stops`.
|
|
14
|
+
4. **Use the image-quality slot vocabulary** for quality — `HD`, `rich details`, `cinematic texture`, `natural colors`, `soft lighting`. That is the officially sanctioned way to ask.
|
|
15
|
+
5. **Constraints go INLINE**, led by the official templates — `keep it subtitle-free`, `do not generate a watermark`, `avoid jitter and bent limbs`, `avoid temporal flicker`.
|
|
16
|
+
|
|
17
|
+
**Examples**
|
|
18
|
+
- `Shot 1: medium shot, <Subject_1>@<Image_1> steps out of the freight lift into a wet loading bay, slow push in. Shot 2: close-up, she turns the ring on her finger twice and stops, handheld. Rich details, cinematic texture, natural colors. Keep it subtitle-free.`
|
|
19
|
+
- `Single continuous take. Wide shot of a fishing skiff crossing a grey swell, camera tracks from the starboard rail. Spray hits the lens once. Soft lighting, natural colors, film-grain texture. Avoid jitter and bent limbs.`
|
|
20
|
+
|
|
21
|
+
**Hard constraint:** NO timestamps — 2.0 ignores them and answers only to shot numbers (2.5 acts on them). No lens, aperture, film stock or camera body: that is image-model vocabulary and a Seedance anti-pattern. There is no negativePrompt field.
|
|
22
|
+
<!-- @card:end -->
|
|
23
|
+
|
|
7
24
|
ByteDance's video model — first-party via **BytePlus ModelArk** (credits only, no BYOK). Audio always generated alongside the video. Single model `seedance-2` across the full resolution ladder (480p / 720p / 1080p / native 4K — 4K video is Pro-only, default 1080p), 4–15s, first+last frame, and up to 9 reference images / 3 videos / 3 audio clips.
|
|
8
25
|
|
|
9
26
|
> **How to read this file.**
|
|
@@ -12,23 +12,23 @@
|
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"path": "skills/slates-prompting-seedance.md",
|
|
15
|
-
"sha256": "
|
|
15
|
+
"sha256": "46d1657b967e2b518bf350e4ad937b45ee0f8253c18d017f3df06ff8ec642244"
|
|
16
16
|
},
|
|
17
17
|
{
|
|
18
18
|
"path": "skills/slates-prompting-kling-v3.md",
|
|
19
|
-
"sha256": "
|
|
19
|
+
"sha256": "81edd7b060648c97d914017101345b0f0e122660a2050389c80f58f24b48aa9c"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"path": "skills/slates-prompting-nano-banana-2.md",
|
|
23
|
-
"sha256": "
|
|
23
|
+
"sha256": "824499adf1188cd86a84fff1de6a02311f87ffb4d1dda73ef46e813c7ef89000"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"path": "skills/slates-content-policy.md",
|
|
27
|
-
"sha256": "
|
|
27
|
+
"sha256": "68566e6431864f075f6397013f040fb41e0559b19b11a15e860a4da80068a9a6"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"path": "src/prompts/model-facts.ts",
|
|
31
|
-
"sha256": "
|
|
31
|
+
"sha256": "b098e77bc1c8574f826be80ca701aa024920f31a7b51a3c15c7f03d59e573fc5"
|
|
32
32
|
}
|
|
33
33
|
],
|
|
34
34
|
"outputs": [
|
|
@@ -44,29 +44,29 @@
|
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
"path": "reference-seedance.md",
|
|
47
|
-
"bytes":
|
|
48
|
-
"sha256": "
|
|
47
|
+
"bytes": 34423,
|
|
48
|
+
"sha256": "50c3f1fc54fa1229f3dcadb9e0af1a070e0fbfa4f42bfc024460762bb56d2a1b"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"path": "reference-kling.md",
|
|
52
|
-
"bytes":
|
|
53
|
-
"sha256": "
|
|
52
|
+
"bytes": 15908,
|
|
53
|
+
"sha256": "99430d96af4461404bb55a6e56e1c3581a2cae817f0e337d0046cbee41dbb0bf"
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"path": "reference-nano-banana.md",
|
|
57
|
-
"bytes":
|
|
58
|
-
"sha256": "
|
|
57
|
+
"bytes": 18239,
|
|
58
|
+
"sha256": "7efcaed812a39ddb5a88ba6f7029f975640b5ccc166002d620324d214944125b"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"path": "reference-content-policy.md",
|
|
62
|
-
"bytes":
|
|
63
|
-
"sha256": "
|
|
62
|
+
"bytes": 7169,
|
|
63
|
+
"sha256": "26439b2948313ee9eed10cbbe9e3ede60d53a453c41af96c3928840b0a4f6212"
|
|
64
64
|
}
|
|
65
65
|
],
|
|
66
66
|
"archive": {
|
|
67
67
|
"path": "slates-prompt-builder.skill",
|
|
68
|
-
"bytes":
|
|
69
|
-
"sha256": "
|
|
68
|
+
"bytes": 40145,
|
|
69
|
+
"sha256": "69ddf61a8e056df58b27f9a0332d4f0a50506f0296d21ce00302a2bb0adfa209",
|
|
70
70
|
"entries": [
|
|
71
71
|
"SKILL.md",
|
|
72
72
|
"reference-character.md",
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,73 +1,83 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@slatesvideo/shared",
|
|
3
|
-
"version": "0.6.
|
|
4
|
-
"description": "Shared operations layer for the Slates MCP server and CLI: auth, cloud/desktop clients, and the single tool surface both consume. Most users want @slatesvideo/mcp-server or @slatesvideo/cli instead.",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"main": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"import": "./dist/index.js",
|
|
12
|
-
"types": "./dist/index.d.ts"
|
|
13
|
-
},
|
|
14
|
-
"./auth": "./dist/auth.js",
|
|
15
|
-
"./clients/cloud": "./dist/clients/cloud.js",
|
|
16
|
-
"./clients/desktop": "./dist/clients/desktop.js",
|
|
17
|
-
"./operations": "./dist/operations/index.js",
|
|
18
|
-
"./prompts": {
|
|
19
|
-
"import": "./dist/prompts/index.js",
|
|
20
|
-
"types": "./dist/prompts/index.d.ts"
|
|
21
|
-
},
|
|
22
|
-
"./model-capabilities": {
|
|
23
|
-
"types": "./dist/prompts/model-capabilities.d.ts",
|
|
24
|
-
"default": "./dist/prompts/model-capabilities.js"
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
},
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"mcp",
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@slatesvideo/shared",
|
|
3
|
+
"version": "0.6.5",
|
|
4
|
+
"description": "Shared operations layer for the Slates MCP server and CLI: auth, cloud/desktop clients, and the single tool surface both consume. Most users want @slatesvideo/mcp-server or @slatesvideo/cli instead.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./auth": "./dist/auth.js",
|
|
15
|
+
"./clients/cloud": "./dist/clients/cloud.js",
|
|
16
|
+
"./clients/desktop": "./dist/clients/desktop.js",
|
|
17
|
+
"./operations": "./dist/operations/index.js",
|
|
18
|
+
"./prompts": {
|
|
19
|
+
"import": "./dist/prompts/index.js",
|
|
20
|
+
"types": "./dist/prompts/index.d.ts"
|
|
21
|
+
},
|
|
22
|
+
"./model-capabilities": {
|
|
23
|
+
"types": "./dist/prompts/model-capabilities.d.ts",
|
|
24
|
+
"default": "./dist/prompts/model-capabilities.js"
|
|
25
|
+
},
|
|
26
|
+
"./shot-grammar": {
|
|
27
|
+
"types": "./dist/prompts/shot-grammar.d.ts",
|
|
28
|
+
"default": "./dist/prompts/shot-grammar.js"
|
|
29
|
+
},
|
|
30
|
+
"./asset-label": {
|
|
31
|
+
"types": "./dist/prompts/asset-label.d.ts",
|
|
32
|
+
"default": "./dist/prompts/asset-label.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"!dist/**/*.map",
|
|
38
|
+
"skills",
|
|
39
|
+
"exports/slates-prompt-builder/generated",
|
|
40
|
+
"README.md"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"sync-partials": "node scripts/sync-partials.mjs",
|
|
44
|
+
"build-prompt-builder": "node scripts/build-prompt-builder.mjs",
|
|
45
|
+
"check-prompt-builder": "node scripts/build-prompt-builder.mjs --check",
|
|
46
|
+
"build": "node scripts/sync-partials.mjs --check && node scripts/build-prompt-builder.mjs --check && node scripts/embed-skills.mjs && tsc && node scripts/render-capability-partials.mjs --check",
|
|
47
|
+
"typecheck": "node scripts/sync-partials.mjs --check && node scripts/build-prompt-builder.mjs --check && node scripts/embed-skills.mjs && tsc --noEmit",
|
|
48
|
+
"prepublishOnly": "npm run build",
|
|
49
|
+
"render-partials": "node scripts/render-capability-partials.mjs"
|
|
50
|
+
},
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/EricDisero/slates-mcp.git",
|
|
54
|
+
"directory": "packages/shared"
|
|
55
|
+
},
|
|
56
|
+
"homepage": "https://slates.video",
|
|
57
|
+
"bugs": {
|
|
58
|
+
"url": "https://github.com/EricDisero/slates-mcp/issues"
|
|
59
|
+
},
|
|
60
|
+
"keywords": [
|
|
61
|
+
"slates",
|
|
62
|
+
"mcp",
|
|
63
|
+
"model-context-protocol",
|
|
64
|
+
"ai-video",
|
|
65
|
+
"video-generation",
|
|
66
|
+
"image-generation",
|
|
67
|
+
"claude",
|
|
68
|
+
"veo",
|
|
69
|
+
"kling",
|
|
70
|
+
"seedance"
|
|
71
|
+
],
|
|
72
|
+
"engines": {
|
|
73
|
+
"node": ">=18"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"zod": "^3.23.0",
|
|
77
|
+
"zod-to-json-schema": "^3.23.0"
|
|
78
|
+
},
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"fflate": "^0.8.3",
|
|
81
|
+
"typescript": "^5.7.0"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
When you surface the plan, include a short **decision log** — one line per decision *you* made that the user did not specify
|
|
1
|
+
When you surface the plan, include a short **decision log** — one line per decision *you* made that the user did not specify **and that no row already records**:
|
|
2
2
|
|
|
3
3
|
```
|
|
4
4
|
source phrase or declared default → what you wrote → what it resolves
|
|
5
|
-
"in a diner" →
|
|
5
|
+
"in a diner" → warm, and the light is the reason → why the anchor was chosen, not what it is
|
|
6
6
|
(no time of day) → late afternoon, low warm key → default; say the word and it changes
|
|
7
|
-
(no camera) → slow push-in, single move → one move per shot; stacking increases instability
|
|
8
7
|
```
|
|
9
8
|
|
|
10
|
-
**
|
|
9
|
+
🚨 **Keep it to what is NOT already data — and almost everything now IS.** A Shot holds the references and their roles, the model, every param, the shot size, the camera, the prop, the action and the spoken line, and `slates_list_shots` reads the whole board back in order with its variety counts. Narrating any of those is retelling a row the user can open. **Write the Shot, and let the log carry only the judgement no field holds** — why this world, why this light, why this register.
|
|
10
|
+
|
|
11
|
+
**Hard rule: never silently add weather, props, style, or camera movement.** Four of those are now FIELDS: put the value on the Shot (`prop`, `camera`, `shotSize`, `action`) so the user can read and change it, and put the *reason* in the log only when you invented it rather than being told it. The rule has not softened — it moved from narration into data, which is stronger, because a field can be corrected and a sentence in chat cannot.
|
|
11
12
|
|
|
12
13
|
> ❌ **Do NOT turn this into a question gate.** Clarifying questions before optimizing directly fight the locked fast-path rule: *if intent is clear, generate immediately with sane defaults, don't ask questions; only ask for production intent, and batch every question into one message.* Log the decisions, then go. The log is an **output**, not an interrogation — surfaced alongside the plan, never as a separate ceremony, and never as a reason to wait.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!-- GENERATED from @slatesvideo/shared — do not edit between the markers.
|
|
2
|
+
Source: CONFIRM_CREDITS, DEVIATION_FACTOR and the audio bounds in
|
|
3
|
+
packages/shared/src/operations/index.ts. Every number here is REFUSED by an
|
|
4
|
+
op when a prompt gets it wrong, which is why none of them is typed by hand
|
|
5
|
+
any more: this block replaced four claims that contradicted the code. -->
|
|
6
|
+
|
|
7
|
+
**The thresholds, from the code that enforces them:**
|
|
8
|
+
|
|
9
|
+
- **Confirm gate:** above **17 credits** an op returns `requires_confirm` and will not
|
|
10
|
+
proceed until you re-call with `confirm: true`. Below it, announce the cost once and go.
|
|
11
|
+
- **Deviation pause:** the desktop Studio Agent stops and re-asks when projected generation spend
|
|
12
|
+
exceeds the approved plan by more than **20%**. You do not trigger this; the app does.
|
|
13
|
+
- **Seed Audio duration:** **3–120 seconds.** There is no duration
|
|
14
|
+
parameter on the model — the number you pass is written into the prompt AND is what the user is
|
|
15
|
+
billed. Outside that range the op refuses rather than clamping.
|
|
16
|
+
- **Sound Effects duration:** **1–22 seconds**, billed per second, never left for the
|
|
17
|
+
model to pick.
|
|
18
|
+
|
|
19
|
+
Never quote a credit figure from memory: `slates_estimate_generation_cost` returns the real one.
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-content-policy
|
|
3
|
-
description:
|
|
3
|
+
description: Read before writing any prompt involving conflict, creatures, crowds, destruction, weapons, or young characters. Builds the scene safe from the first word, so it hits full cinematic impact without depicting prohibited content — and without being silently rejected or degraded by the model's filter. Mirror of @slatesvideo/shared/prompts content-policy fragment — SSOT: second-brain business/projects/slates/product/prompting-ssot.md.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Content-policy-safe construction — read before any risk-surface prompt
|
|
7
7
|
|
|
8
|
+
<!-- @banned:start -->
|
|
9
|
+
<!-- slates-only -->
|
|
10
|
+
<!-- MACHINE-READ. Every `backticked` token between the @banned markers is
|
|
11
|
+
extracted by src/prompts/banned-tokens.ts and returned on this model's cost
|
|
12
|
+
estimate, and every submitted prompt is matched against it. Keep entries
|
|
13
|
+
backticked and prose outside the backticks. -->
|
|
14
|
+
<!-- /slates-only -->
|
|
15
|
+
**Never use** — each one is a filter tripwire with a substitution in the table above:
|
|
16
|
+
- `civilians in panic`, `crowds fleeing`, `blood`, `gore`, `corpse`
|
|
17
|
+
- `ignite`, `catch fire`, `on fire` applied to a person — frame body-contact effects as magical or harmless VFX
|
|
18
|
+
- `candle-like`, `flame-like` and any real object used as a metaphor for an effect
|
|
19
|
+
- a real, named public figure
|
|
20
|
+
<!-- @banned:end -->
|
|
21
|
+
|
|
8
22
|
Don't depict the harm — depict the energy, the aftermath, the threat, or the scale. Build the scene safe from the first word.
|
|
9
23
|
|
|
10
24
|
Write scenes that hit full cinematic impact without ever *needing* to depict prohibited content. This is a craft move, not a compromise — the substitutions below usually read as more cinematic, not less, and they keep your generation from getting silently rejected or degraded by the model's filter. A standoff is more tense than a massacre; an evacuated city is eerier than a crowd in panic; a roar lands harder than a kill. Load this whenever a prompt involves conflict, creatures, crowds, destruction, weapons, or young characters.
|
|
@@ -13,7 +13,7 @@ Generation costs real money. Every call is on the user's credits. The user can't
|
|
|
13
13
|
|
|
14
14
|
Before ANY `slates_generate_*` call, run `slates_estimate_generation_cost` first. Inputs you must lock before estimating:
|
|
15
15
|
|
|
16
|
-
- **Model** —
|
|
16
|
+
- **Model** — the id you are about to pass, whatever it is. `slates_estimate_generation_cost` takes the same base ids the generate ops take and resolves the billing key itself; do not build one by hand.
|
|
17
17
|
- **Resolution** — never let the op default. Pick deliberately. Drafts → 1k. Hero → 2k. Print → 4k.
|
|
18
18
|
- **Aspect ratio** — never let the op default to 1:1. Pick from the use case (cinematic → 16:9, mobile vertical → 9:16, square feed → 1:1).
|
|
19
19
|
- **Count** — explicit. Don't generate 4 when 1 will tell you if the prompt works.
|
|
@@ -30,7 +30,29 @@ Examples:
|
|
|
30
30
|
- `About to spend 4 credits on 1 image at 1k 16:9. Proceed?`
|
|
31
31
|
- `About to spend 24 credits on 4 images at 2k 9:16 (variants). Proceed?`
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Announce the cost once, then proceed for anything small. For anything the user would notice on their balance, wait for an explicit yes. Where the LINE is, exactly:
|
|
34
|
+
|
|
35
|
+
<!-- @inject:thresholds -->
|
|
36
|
+
<!-- GENERATED from @slatesvideo/shared — do not edit between the markers.
|
|
37
|
+
Source: CONFIRM_CREDITS, DEVIATION_FACTOR and the audio bounds in
|
|
38
|
+
packages/shared/src/operations/index.ts. Every number here is REFUSED by an
|
|
39
|
+
op when a prompt gets it wrong, which is why none of them is typed by hand
|
|
40
|
+
any more: this block replaced four claims that contradicted the code. -->
|
|
41
|
+
|
|
42
|
+
**The thresholds, from the code that enforces them:**
|
|
43
|
+
|
|
44
|
+
- **Confirm gate:** above **17 credits** an op returns `requires_confirm` and will not
|
|
45
|
+
proceed until you re-call with `confirm: true`. Below it, announce the cost once and go.
|
|
46
|
+
- **Deviation pause:** the desktop Studio Agent stops and re-asks when projected generation spend
|
|
47
|
+
exceeds the approved plan by more than **20%**. You do not trigger this; the app does.
|
|
48
|
+
- **Seed Audio duration:** **3–120 seconds.** There is no duration
|
|
49
|
+
parameter on the model — the number you pass is written into the prompt AND is what the user is
|
|
50
|
+
billed. Outside that range the op refuses rather than clamping.
|
|
51
|
+
- **Sound Effects duration:** **1–22 seconds**, billed per second, never left for the
|
|
52
|
+
model to pick.
|
|
53
|
+
|
|
54
|
+
Never quote a credit figure from memory: `slates_estimate_generation_cost` returns the real one.
|
|
55
|
+
<!-- @end:thresholds -->
|
|
34
56
|
|
|
35
57
|
### 3. Aggregate batches into ONE upfront announcement
|
|
36
58
|
|
|
@@ -46,7 +68,7 @@ When the user approves a batch plan with one aggregated cost total up front ("8
|
|
|
46
68
|
|
|
47
69
|
Boundaries that re-trigger confirmation:
|
|
48
70
|
|
|
49
|
-
- Any call's actual estimate exceeds what the announced plan implied
|
|
71
|
+
- Any call's actual estimate exceeds what the announced plan implied → stop, surface the delta, get a fresh OK. The app enforces its own ceiling on top of this (see the thresholds above); do not wait for it to catch you.
|
|
50
72
|
- New calls are added that weren't in the enumerated plan (extra variants, retries beyond the plan, a new scene) → those are NOT covered. Announce and confirm separately.
|
|
51
73
|
- The batch scope changes (different model, resolution, or duration than announced) → re-announce, re-confirm.
|
|
52
74
|
|
|
@@ -87,7 +109,7 @@ If the user prompt mixes signals (e.g. "cinematic Instagram post"), ask. Don't g
|
|
|
87
109
|
|
|
88
110
|
## When the gate fires
|
|
89
111
|
|
|
90
|
-
The server returns `requires_clarification` when aspect ratio or resolution is missing
|
|
112
|
+
The server returns `requires_clarification` when aspect ratio or resolution is missing, and `requires_confirm` when total spend crosses the gate above. In both cases:
|
|
91
113
|
|
|
92
114
|
1. Surface the gate response to the user
|
|
93
115
|
2. Get a clean answer
|
|
@@ -105,10 +105,11 @@ Both tools are **Kling-only**. Every entry in them is a real Kling endpoint that
|
|
|
105
105
|
|
|
106
106
|
| Job | Model | Why |
|
|
107
107
|
|---|---|---|
|
|
108
|
-
| **Default — a whole audio scene in one pass**: room tone, ambience beds, crowds, nature, layered dialogue + effects, spoken lines | **Seed Audio 1.0** (`seed-audio`) | One plain sentence in, a complete scene out.
|
|
109
|
-
| **One
|
|
108
|
+
| **Default — a whole audio scene in one pass**: room tone, ambience beds, crowds, nature, layered dialogue + effects, spoken lines inside a scene | **Seed Audio 1.0** (`seed-audio`) | One plain sentence in, a complete scene out. The continuity-bed workhorse; dialogue is performed inside the room, not cast. |
|
|
109
|
+
| **One named voice saying one line** — a character's own voice, a narrator, a clean VO to lip-sync against | **Inworld TTS-2** (`inworld-tts-2`) | The prompt IS the words, spoken verbatim and billed per character. Voice = the character's clip (cloned for the take), a description, or a preset. No room tone — mix it on the timeline. |
|
|
110
|
+
| **One effect that lands on a known frame**, or a seamless loop | **Sound Effects v2** (`eleven-sfx`) | The only surface with an exact duration control and a real loop mode. |
|
|
110
111
|
|
|
111
|
-
**There is no music model
|
|
112
|
+
**There is no music model.** A song is imported (Slates reads audio files and puts them on the timeline), not generated. A line that has to be spoken in a SPECIFIC voice is generated on Inworld TTS-2 and lip-synced against; a line that belongs to a scene is performed by Seed Audio inside it.
|
|
112
113
|
|
|
113
114
|
### Named audio escalation triggers
|
|
114
115
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-one-prompt-film
|
|
3
|
-
description:
|
|
3
|
+
description: Use when the user gives ONE idea and wants a finished video out the other end — "make me a video about X", "turn this idea into an ad", "make a short film from this". The full pipeline: script, project, characters, storyboard, frame images, video generation, timeline assembly, MP4 export. This is the master recipe; the other Slates skills are its sub-steps.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# One prompt → finished film — Slates master pipeline
|
|
@@ -12,19 +12,22 @@ The user gives an idea. You hand back an MP4 on disk. Everything in between is y
|
|
|
12
12
|
### 1. Script the beats
|
|
13
13
|
Turn the idea into a beat-level script: 4-10 shots, each with subject, action, setting, camera, and duration (4-8s per shot). Surface it as a tight table. Get the user's nod on the plan, format (aspect ratio — 16:9 vs 9:16 decides everything downstream), and rough budget appetite before touching any op.
|
|
14
14
|
|
|
15
|
+
🚨 **Before you fire the set, read its variety counts.** `slates_list_shots` returns the distribution with every listing — shot sizes, camera moves, durations, and any bucket repeating three or more times in a row. Read the table as a COLUMN, not as rows: if push-in is the plurality or every row says wide, the batch is wrong before a credit is spent. The craft is `slates-shot-variety`.
|
|
16
|
+
|
|
15
17
|
**Surface a decision log with the plan.**
|
|
16
18
|
|
|
17
19
|
<!-- @inject:decision-log -->
|
|
18
|
-
When you surface the plan, include a short **decision log** — one line per decision *you* made that the user did not specify
|
|
20
|
+
When you surface the plan, include a short **decision log** — one line per decision *you* made that the user did not specify **and that no row already records**:
|
|
19
21
|
|
|
20
22
|
```
|
|
21
23
|
source phrase or declared default → what you wrote → what it resolves
|
|
22
|
-
"in a diner" →
|
|
24
|
+
"in a diner" → warm, and the light is the reason → why the anchor was chosen, not what it is
|
|
23
25
|
(no time of day) → late afternoon, low warm key → default; say the word and it changes
|
|
24
|
-
(no camera) → slow push-in, single move → one move per shot; stacking increases instability
|
|
25
26
|
```
|
|
26
27
|
|
|
27
|
-
**
|
|
28
|
+
🚨 **Keep it to what is NOT already data — and almost everything now IS.** A Shot holds the references and their roles, the model, every param, the shot size, the camera, the prop, the action and the spoken line, and `slates_list_shots` reads the whole board back in order with its variety counts. Narrating any of those is retelling a row the user can open. **Write the Shot, and let the log carry only the judgement no field holds** — why this world, why this light, why this register.
|
|
29
|
+
|
|
30
|
+
**Hard rule: never silently add weather, props, style, or camera movement.** Four of those are now FIELDS: put the value on the Shot (`prop`, `camera`, `shotSize`, `action`) so the user can read and change it, and put the *reason* in the log only when you invented it rather than being told it. The rule has not softened — it moved from narration into data, which is stronger, because a field can be corrected and a sentence in chat cannot.
|
|
28
31
|
|
|
29
32
|
> ❌ **Do NOT turn this into a question gate.** Clarifying questions before optimizing directly fight the locked fast-path rule: *if intent is clear, generate immediately with sane defaults, don't ask questions; only ask for production intent, and batch every question into one message.* Log the decisions, then go. The log is an **output**, not an interrogation — surfaced alongside the plan, never as a separate ceremony, and never as a reason to wait.
|
|
30
33
|
<!-- @end:decision-log -->
|
|
@@ -37,24 +40,28 @@ A 4-10 shot script is where you invent the most on the user's behalf — time of
|
|
|
37
40
|
- Recurring location? `slates_create_environment`.
|
|
38
41
|
- One-off shots don't need character/environment records; skip the ceremony.
|
|
39
42
|
|
|
40
|
-
### 3. Storyboard skeleton (no generation yet)
|
|
43
|
+
### 3. Storyboard skeleton and the Shots (no generation yet)
|
|
41
44
|
- `slates_create_storyboard`, `slates_add_scene` per script scene.
|
|
45
|
+
- `slates_create_shot` per beat — the prompt, the model, the params and the references, with the roles they carry. **A Shot needs no image**, so the entire film exists as rows before anything is paid for.
|
|
46
|
+
- `slates_get_shot` reads one back COMPOSED: the prompt the model will actually receive, its numbered references, and its exact quote. Audit your own work there — you cannot approve something the request will not contain.
|
|
42
47
|
- Structure first, spend second — the user catches script problems on the free skeleton, not on burned credits.
|
|
43
48
|
|
|
44
49
|
### 4. ONE aggregated cost approval — then hands-off
|
|
45
|
-
|
|
50
|
+
The Shots ARE the quote. `slates_generate_from_shots` without `confirm` returns one itemised total for the set plus the largest single item — no hand arithmetic, no `slates_estimate_generation_cost` per call:
|
|
46
51
|
|
|
47
|
-
> Plan: 6 frames at 1k 16:9 + 5 × 8s Kling 3.0 std + 1 × 8s Seedance 2 hero shot ≈
|
|
52
|
+
> Plan: 6 frames at 1k 16:9 + 5 × 8s Kling 3.0 std + 1 × 8s Seedance 2 hero shot ≈ N credits total, largest single N. Proceed with the batch?
|
|
48
53
|
|
|
49
54
|
Per `slates-cost-discipline` 3b: that single OK authorizes `confirm=true` for **every enumerated call in the batch** — no per-call re-asking. Re-confirm only if a call's price overruns the plan >25% or new calls get added (extra retakes, new shots).
|
|
50
55
|
|
|
51
56
|
### 5. Generate frame images
|
|
52
|
-
|
|
57
|
+
Fire the image Shots with `slates_generate_from_shots` (`confirm: true` — step 4 authorized it). Slates names each reference inline as "image N"; you never hand-write a role label or a number. Evaluate every result inline against the beat. Bind keepers via `slates_add_frame`, then `slates_update_shot` with `attachFrameId` so the recipe travels with the picture.
|
|
53
58
|
|
|
54
59
|
**Multi-take where it matters:** for the hook shot and any shot the whole film hangs on, generate 2-4 variants (cheap model or 1k), pull them back with `slates_get_assets_batch`, pick the strongest on composition + identity, discard the rest. Don't multi-take filler shots.
|
|
55
60
|
|
|
56
|
-
### 6. Generate video per
|
|
57
|
-
|
|
61
|
+
### 6. Generate video per Shot
|
|
62
|
+
Fork each bound frame's image Shot with `slates_duplicate_shot` (`model:` the video model — that is the A/B lever the op takes inline), then `slates_update_shot` the copy with `firstFrameAssetId` = the bound frame. Two calls, because `slates_duplicate_shot` forks the prompt, the model and the params; **attachments are changed with `slates_update_shot`.** Then fire the set with `slates_generate_from_shots`.
|
|
63
|
+
|
|
64
|
+
⚠️ **It runs SEQUENTIALLY and blocks until the last clip lands** — a 6-shot film is one long wait, and it will usually outlast the HTTP timeout while the run keeps going. When that happens, poll `slates_get_shot` for each Shot's `generationIds` and then `slates_get_generation_status`; **never re-fire, that double-spends.** (Concurrent batch firing needs a real queue — concurrency limiting, per-item failure isolation, partial-billing semantics — and is deliberately not built yet.)
|
|
58
65
|
|
|
59
66
|
**Model mixing — route per `slates-model-selection`** (details in the per-model guides):
|
|
60
67
|
- **Kling V3** (`slates-prompting-kling-v3`): the DEFAULT for most shots — 16:9 / 9:16 / 1:1, 3-15s, strong start-frame adherence; std is the workhorse, Omni for multi-character dialogue.
|
|
@@ -62,7 +69,7 @@ Per shot: `slates_generate_image` with `referenceAssetIds` pointing at the chara
|
|
|
62
69
|
- **MiniMax H3** (`slates-prompting-minimax-h3`): route here when a shot's SOUND is part of the writing — a line delivered a particular way, scene sound under it, score that must stay outside the characters' world. It authors all three in one pass, which **collapses a shot's audio pass into its video pass** and removes the separate `slates_generate_audio` step for that shot. 5-15s, 480p/768p/2K/4K. Its sibling `minimax-h3-max` is faster but capped at 768p, takes no references, and costs MORE at 768p — a deliberate speed pick, never a saving.
|
|
63
70
|
- **Veo 3.1** (`slates-prompting-veo-3`): niche, never the default — only when native synced audio must generate WITH the video in one gen; 16:9 or 9:16, 4/6/8s (8s only at 1080p/4K or with reference images).
|
|
64
71
|
|
|
65
|
-
Failed gen?
|
|
72
|
+
Failed gen? The run continues past it and **nothing is retried automatically**. Read the per-Shot error in the result, fix that Shot with `slates_update_shot`, and re-fire only it (a retry beyond the plan = announce the delta cost).
|
|
66
73
|
|
|
67
74
|
### 7. Assemble the timeline
|
|
68
75
|
- `slates_get_timeline` once to get the lay of the land.
|
|
@@ -85,3 +92,4 @@ Shots delivered, total spent vs. approved plan, the export path, and the single
|
|
|
85
92
|
- **Look at everything.** Every image inline, every video via `slates_get_asset_video_frames` if a clip seems off. Never assemble a timeline from clips you haven't evaluated.
|
|
86
93
|
- **3-strike rule per shot.** Three failed takes on one shot = stop, show the user what you tried, ask.
|
|
87
94
|
- **Consistency comes from references, not luck.** Same identity asset on every character frame; same environment refs across a location's shots.
|
|
95
|
+
- **Plan in Shots, not in chat.** Every decision that ends up in a sentence you have to remember is a decision the user cannot see, price, fork or re-fire. A Shot is a row: it survives the conversation, and the user can open it in the app and fix one reference without you.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-project-organization
|
|
3
|
-
description:
|
|
3
|
+
description: Use when the user names an asset by code ("use IMG-A36"), asks what a code means, or is organizing or navigating a project. Covers the asset short-code system (IMG-A12 / VID-V3 / AUD-S1 badges on every gallery card), folders for film STRUCTURE, and the typed tabs for reusable references.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Organizing a Slates project
|