@nodetool-ai/agents 0.8.4-a24.3 → 0.8.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/.nodetool-build-stamp +1 -1
- package/dist/_skills/LICENSE-iart-motion-design-skills +21 -0
- package/dist/_skills/README.md +211 -0
- package/dist/_skills/api-agents/SKILL.md +58 -0
- package/dist/_skills/api-apps/SKILL.md +54 -0
- package/dist/_skills/api-assets/SKILL.md +66 -0
- package/dist/_skills/api-collections/SKILL.md +33 -0
- package/dist/_skills/api-games/SKILL.md +81 -0
- package/dist/_skills/api-media/SKILL.md +131 -0
- package/dist/_skills/api-memory/SKILL.md +72 -0
- package/dist/_skills/api-models/SKILL.md +78 -0
- package/dist/_skills/api-scripts/SKILL.md +79 -0
- package/dist/_skills/api-settings/SKILL.md +49 -0
- package/dist/_skills/api-sketches/SKILL.md +61 -0
- package/dist/_skills/api-storyboards/SKILL.md +94 -0
- package/dist/_skills/api-timelines/SKILL.md +151 -0
- package/dist/_skills/api-web/SKILL.md +57 -0
- package/dist/_skills/api-workflows/SKILL.md +123 -0
- package/dist/_skills/beat-sync-editing/SKILL.md +208 -0
- package/dist/_skills/caption-titles/SKILL.md +94 -0
- package/dist/_skills/color-motion/SKILL.md +185 -0
- package/dist/_skills/commercial-beat-sheet/SKILL.md +338 -0
- package/dist/_skills/elevenlabs-audio-prompting/SKILL.md +163 -0
- package/dist/_skills/explainer-storyboard/SKILL.md +63 -0
- package/dist/_skills/flux-2-klein-prompting/SKILL.md +107 -0
- package/dist/_skills/frame-composition/SKILL.md +291 -0
- package/dist/_skills/game-direction/SKILL.md +99 -0
- package/dist/_skills/gpt-image-2-prompting/SKILL.md +161 -0
- package/dist/_skills/hailuo-prompting/SKILL.md +107 -0
- package/dist/_skills/kling-video-prompting/SKILL.md +188 -0
- package/dist/_skills/launch-commercial/SKILL.md +267 -0
- package/dist/_skills/launch-kit/SKILL.md +120 -0
- package/dist/_skills/logo-reveal/SKILL.md +225 -0
- package/dist/_skills/manimgx/SKILL.md +123 -0
- package/dist/_skills/minimax-h3-prompting/SKILL.md +134 -0
- package/dist/_skills/motion-ad/SKILL.md +281 -0
- package/dist/_skills/motion-background/SKILL.md +145 -0
- package/dist/_skills/motion-curves/SKILL.md +302 -0
- package/dist/_skills/motion-direction/SKILL.md +259 -0
- package/dist/_skills/motion-graphics/SKILL.md +217 -0
- package/dist/_skills/motion-principles/SKILL.md +255 -0
- package/dist/_skills/music-video-treatment/SKILL.md +40 -0
- package/dist/_skills/nano-banana-pro-prompting/SKILL.md +133 -0
- package/dist/_skills/native-game/SKILL.md +310 -0
- package/dist/_skills/native-game-reference/SKILL.md +879 -0
- package/dist/_skills/nodetool-3d-scene/SKILL.md +110 -0
- package/dist/_skills/nodetool-api-reference/SKILL.md +338 -0
- package/dist/_skills/nodetool-app-builder/SKILL.md +291 -0
- package/dist/_skills/nodetool-browser-agent/SKILL.md +119 -0
- package/dist/_skills/nodetool-chat-cli/SKILL.md +184 -0
- package/dist/_skills/nodetool-custom-node-developer/SKILL.md +294 -0
- package/dist/_skills/nodetool-deployment/SKILL.md +195 -0
- package/dist/_skills/nodetool-js-scripting/SKILL.md +223 -0
- package/dist/_skills/nodetool-model-provider-config/SKILL.md +348 -0
- package/dist/_skills/nodetool-rag-indexing/SKILL.md +153 -0
- package/dist/_skills/nodetool-sketch/SKILL.md +138 -0
- package/dist/_skills/nodetool-skill-author/SKILL.md +125 -0
- package/dist/_skills/nodetool-troubleshooter/SKILL.md +370 -0
- package/dist/_skills/nodetool-video-post/SKILL.md +149 -0
- package/dist/_skills/nodetool-workflow-builder/SKILL.md +295 -0
- package/dist/_skills/product-commercial/SKILL.md +132 -0
- package/dist/_skills/qwen-image-prompting/SKILL.md +122 -0
- package/dist/_skills/script-video/SKILL.md +106 -0
- package/dist/_skills/seedance-2-prompting/SKILL.md +194 -0
- package/dist/_skills/seedream-prompting/SKILL.md +117 -0
- package/dist/_skills/short-film/SKILL.md +123 -0
- package/dist/_skills/stable-audio-prompting/SKILL.md +130 -0
- package/dist/_skills/storyboard-core/SKILL.md +716 -0
- package/dist/_skills/timeline-edit-ops/SKILL.md +736 -0
- package/dist/_skills/trailer-template/SKILL.md +291 -0
- package/dist/_skills/ugc-video/SKILL.md +186 -0
- package/dist/_skills/veo-3-prompting/SKILL.md +140 -0
- package/dist/_skills/video-audio-continuity/SKILL.md +90 -0
- package/dist/_skills/video-clone/SKILL.md +96 -0
- package/dist/_skills/video-workflow/SKILL.md +119 -0
- package/dist/_skills/wan-2-6-prompting/SKILL.md +107 -0
- package/dist/analysis/audio-dsp.d.ts +1 -60
- package/dist/analysis/audio-dsp.d.ts.map +1 -1
- package/dist/analysis/audio-dsp.js +3 -190
- package/dist/analysis/audio-dsp.js.map +1 -1
- package/dist/app-build/bridge.d.ts.map +1 -1
- package/dist/app-build/bridge.js +44 -17
- package/dist/app-build/bridge.js.map +1 -1
- package/dist/capabilities/analysis.d.ts.map +1 -1
- package/dist/capabilities/analysis.js +9 -35
- package/dist/capabilities/analysis.js.map +1 -1
- package/dist/capabilities/apps.d.ts.map +1 -1
- package/dist/capabilities/apps.js +55 -13
- package/dist/capabilities/apps.js.map +1 -1
- package/dist/capabilities/apps.specs.d.ts.map +1 -1
- package/dist/capabilities/apps.specs.js +5 -3
- package/dist/capabilities/apps.specs.js.map +1 -1
- package/dist/capabilities/assets.d.ts.map +1 -1
- package/dist/capabilities/assets.js +10 -6
- package/dist/capabilities/assets.js.map +1 -1
- package/dist/capabilities/game-asset-browser.d.ts.map +1 -1
- package/dist/capabilities/game-asset-browser.js +6 -1
- package/dist/capabilities/game-asset-browser.js.map +1 -1
- package/dist/capabilities/game.d.ts +1 -1
- package/dist/capabilities/game.d.ts.map +1 -1
- package/dist/capabilities/game.js +71 -56
- package/dist/capabilities/game.js.map +1 -1
- package/dist/capabilities/game.specs.js +1 -1
- package/dist/capabilities/game.specs.js.map +1 -1
- package/dist/capabilities/game3d.d.ts.map +1 -1
- package/dist/capabilities/game3d.js +14 -19
- package/dist/capabilities/game3d.js.map +1 -1
- package/dist/capabilities/gameAssertions.d.ts +52 -0
- package/dist/capabilities/gameAssertions.d.ts.map +1 -0
- package/dist/capabilities/gameAssertions.js +32 -0
- package/dist/capabilities/gameAssertions.js.map +1 -0
- package/dist/capabilities/models.d.ts.map +1 -1
- package/dist/capabilities/models.js +9 -0
- package/dist/capabilities/models.js.map +1 -1
- package/dist/capabilities/project-scope.d.ts +8 -0
- package/dist/capabilities/project-scope.d.ts.map +1 -1
- package/dist/capabilities/project-scope.js +16 -0
- package/dist/capabilities/project-scope.js.map +1 -1
- package/dist/capabilities/storyboards.d.ts.map +1 -1
- package/dist/capabilities/storyboards.js +36 -11
- package/dist/capabilities/storyboards.js.map +1 -1
- package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
- package/dist/capabilities/storyboards.specs.js +11 -1
- package/dist/capabilities/storyboards.specs.js.map +1 -1
- package/dist/capabilities/workflows.d.ts.map +1 -1
- package/dist/capabilities/workflows.js +1 -0
- package/dist/capabilities/workflows.js.map +1 -1
- package/dist/capabilities/workflows.specs.d.ts.map +1 -1
- package/dist/capabilities/workflows.specs.js +4 -3
- package/dist/capabilities/workflows.specs.js.map +1 -1
- package/dist/codeact/nodetool-api.d.ts.map +1 -1
- package/dist/codeact/nodetool-api.js +8 -2
- package/dist/codeact/nodetool-api.js.map +1 -1
- package/dist/evals/surfaces/game.d.ts.map +1 -1
- package/dist/evals/surfaces/game.js +29 -1
- package/dist/evals/surfaces/game.js.map +1 -1
- package/dist/game-authoring.d.ts +120 -0
- package/dist/game-authoring.d.ts.map +1 -1
- package/dist/game-build-integrity.d.ts +12 -0
- package/dist/game-build-integrity.d.ts.map +1 -0
- package/dist/game-build-integrity.js +78 -0
- package/dist/game-build-integrity.js.map +1 -0
- package/dist/game-examples.d.ts +44 -3
- package/dist/game-examples.d.ts.map +1 -1
- package/dist/game-examples.js +60 -10
- package/dist/game-examples.js.map +1 -1
- package/dist/system-skills.d.ts +1 -1
- package/dist/system-skills.js +1 -1
- package/dist/tools/builtin-tools.d.ts.map +1 -1
- package/dist/tools/builtin-tools.js +2 -0
- package/dist/tools/builtin-tools.js.map +1 -1
- package/dist/tools/external-mcp-tools.d.ts +6 -0
- package/dist/tools/external-mcp-tools.d.ts.map +1 -1
- package/dist/tools/external-mcp-tools.js +15 -4
- package/dist/tools/external-mcp-tools.js.map +1 -1
- package/package.json +19 -19
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: motion-principles
|
|
3
|
+
description: Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline. Use when motion feels stiff, floaty, busy, or late, or when an entrance, transition, or beat-bound animation needs a duration and curve. The op contract lives in timeline-edit-ops; the build loop is motion-graphics.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Motion Principles → the numbers before the call
|
|
7
|
+
|
|
8
|
+
`timeline-edit-ops` is how to write an animation onto a clip with
|
|
9
|
+
`edit_timeline`. This is how to decide what to write. Every number here is in
|
|
10
|
+
the units `animate_clip` takes: milliseconds, a normalized 0..1 distance, an
|
|
11
|
+
easing string.
|
|
12
|
+
|
|
13
|
+
## The same numbers, written as code
|
|
14
|
+
|
|
15
|
+
Building with `@nodetool-ai/sandbox-timeline` instead (`motion-graphics`
|
|
16
|
+
picks the surface)? Every number below still applies — only the unit
|
|
17
|
+
changes. `durationMs` becomes `dur` in seconds (divide by 1000: 400ms is
|
|
18
|
+
`dur: 0.4`). A normalized 0..1 distance becomes actual px, against the
|
|
19
|
+
frame's own `width`/`height` (0.3 on a 1920-wide frame is `offsetX: 576` in
|
|
20
|
+
`from`). Easing strings are identical — `ease: "outExpo"` or a raw curve —
|
|
21
|
+
and every role still means the same thing: `el.enter()` is `in`, `el.exit()`
|
|
22
|
+
is `out`, `el.animate()` covers `emphasis` and general keyframing,
|
|
23
|
+
`el.loop()` is `loop`. `el.count()`, `el.draw()`, `el.scramble()`,
|
|
24
|
+
`el.typewriter()`, `el.expr()` and `el.morph()` have no ops equivalent
|
|
25
|
+
below; they are shortcuts for a ticker, a `trimEnd` draw-on, a scramble
|
|
26
|
+
reveal, a whole-clip typewriter entrance, a hand-written keyframe function,
|
|
27
|
+
and a path outline morph.
|
|
28
|
+
|
|
29
|
+
## Settle three things before picking a number
|
|
30
|
+
|
|
31
|
+
| Pillar | The question | What it decides |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Emotional intent | What should the viewer feel? | Easing, duration, overshoot |
|
|
34
|
+
| Visual narrative | Setup, action, resolution — what enters when? | Sequencing, `delayMs`, stagger |
|
|
35
|
+
| Motion craft | Why does it look believable? | Anticipation, follow-through, arcs |
|
|
36
|
+
|
|
37
|
+
A number chosen before the intent is a number you will change twice.
|
|
38
|
+
|
|
39
|
+
## Three layers, or the frame reads flat
|
|
40
|
+
|
|
41
|
+
Plan three levels of attention. Track index controls their z-order, while
|
|
42
|
+
timing decides which one the eye follows:
|
|
43
|
+
|
|
44
|
+
- **Primary** — the one move the eye follows. The clip the shot is about.
|
|
45
|
+
- **Secondary** — supporting motion reacting to the primary: a scrim settling
|
|
46
|
+
late, a label arriving 80ms after the plate.
|
|
47
|
+
- **Ambient** — background life that never asks for attention. A `loop` preset
|
|
48
|
+
at low amplitude on the bed.
|
|
49
|
+
|
|
50
|
+
`motion-direction` ranks the same three as Hero / Support / Texture and decides
|
|
51
|
+
which elements earn each. Two clips carrying primary motion at once is the most
|
|
52
|
+
common cause of a busy frame.
|
|
53
|
+
|
|
54
|
+
## Easing is the biggest lever
|
|
55
|
+
|
|
56
|
+
`linear` reads as robotic. Keep it for motion that never lands: the `loop`
|
|
57
|
+
presets `float`, `rotate` and `hueShift`, and the `shake` emphasis, whose
|
|
58
|
+
zig-zag is linear by default. Everything the eye reads as an event decelerates
|
|
59
|
+
into rest.
|
|
60
|
+
|
|
61
|
+
| Action | Easing | Why |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| Entrance (`in`) | `easeOut`, or `cubic-bezier(0.16,1,0.3,1)` for a sharper landing | Arrives with energy, settles |
|
|
64
|
+
| Exit (`out`) | `easeIn`, or `cubic-bezier(0.7,0,0.84,0)` | Accelerates away |
|
|
65
|
+
| A move that stays on screen | `easeInOut`, or `cubic-bezier(0.65,0,0.35,1)` | Symmetric, no false weight |
|
|
66
|
+
| Playful landing | `easeOutBack`, or `cubic-bezier(0.34,1.56,0.64,1)` | The value past 1 is the overshoot |
|
|
67
|
+
| Physical settle | `spring(180,12,1)` one overshoot, `spring(180,26,1)` none | Solves a real spring; all three constants positive |
|
|
68
|
+
| Held pose, then jump | `hold` on the ending keyframe's segment | Keeps the prior value until the segment ends |
|
|
69
|
+
|
|
70
|
+
The role defaults already do the right thing: `in` gets `easeOut`, `out` gets
|
|
71
|
+
`easeIn`. Leave `easing` unset unless you want something the default is not.
|
|
72
|
+
A string the parser cannot read eases linearly and reports `unknown_easing` —
|
|
73
|
+
`easeOut`, never `ease-out`.
|
|
74
|
+
|
|
75
|
+
Overshoot reads as toy-like. Keep `easeOutBack`, `easeOutElastic` and
|
|
76
|
+
`easeOutBounce` off anything financial, medical or corporate.
|
|
77
|
+
|
|
78
|
+
## Duration carries weight
|
|
79
|
+
|
|
80
|
+
| Element | `durationMs` |
|
|
81
|
+
|---|---|
|
|
82
|
+
| Micro beat: a `flash`, a `pulse` on a small element | 150–250 |
|
|
83
|
+
| Title, lower third, overlay entrance | 300–500 |
|
|
84
|
+
| Hero element, full-frame plate, a `blur` rack | 500–800 |
|
|
85
|
+
| Camera move: a slow push or drift | 1500–4000 |
|
|
86
|
+
|
|
87
|
+
Distance and area scale it. A caption travelling `distance: 0.05` and a
|
|
88
|
+
full-bleed plate travelling `0.5` must not share 400ms — the plate looks
|
|
89
|
+
weightless. Add roughly 30–50% when the travel or the area doubles.
|
|
90
|
+
|
|
91
|
+
Two limits the engine enforces rather than warns about in prose:
|
|
92
|
+
|
|
93
|
+
- `in` + `out` must fit the clip with hold left over. Over-long windows report
|
|
94
|
+
`animation_exceeds_clip`.
|
|
95
|
+
- A `loop` cycle longer than the clip shows a fragment. `kenBurns` is the
|
|
96
|
+
exception: it ignores `durationMs` and always spans the whole clip, so the
|
|
97
|
+
clip's length is its duration. Give a Ken Burns move a clip in the camera-move
|
|
98
|
+
range above.
|
|
99
|
+
|
|
100
|
+
## Holds
|
|
101
|
+
|
|
102
|
+
These are the hold values every other motion skill defers to:
|
|
103
|
+
|
|
104
|
+
- **Read hold.** Anything meant to be read — a title, a lower third, an end
|
|
105
|
+
card, a logo — rests at least 1000ms between its `in` settling and its `out`
|
|
106
|
+
starting, or before the cut. A 3000ms title with 500ms each way holds 2000ms.
|
|
107
|
+
Under 1000ms the element never settles and reads as a glitch.
|
|
108
|
+
- **Rest between moves.** Two consecutive moves on the same hero or support
|
|
109
|
+
element leave at least 400ms with that element still. Ambient `loop` motion
|
|
110
|
+
on the bed does not count against it and keeps running.
|
|
111
|
+
|
|
112
|
+
## Stagger is rhythm, and it is clamped
|
|
113
|
+
|
|
114
|
+
Never reveal a group in one event. On a text clip, `stagger` splits the
|
|
115
|
+
animation per word, grapheme or wrapped line. Which `unit` counts what, and how
|
|
116
|
+
the count changes with the frame, is in `timeline-edit-ops`.
|
|
117
|
+
|
|
118
|
+
| Content | `offsetMs` |
|
|
119
|
+
|---|---|
|
|
120
|
+
| A short mark or word revealed per character | 30–50 |
|
|
121
|
+
| A phrase that should arrive with texture | 60–100 |
|
|
122
|
+
| A short punchline landing word by word | 150–250 |
|
|
123
|
+
| More than five words | do not stagger — the reader is waiting on the sentence |
|
|
124
|
+
|
|
125
|
+
The span is `durationMs + offsetMs × (units − 1)`, halved for `from: "center"`.
|
|
126
|
+
Work it out and compare it against the clip's `durationMs` minus `delayMs`. A
|
|
127
|
+
span that does not fit is **compressed silently**: the engine shrinks the offset,
|
|
128
|
+
never the per-unit duration, so the line lands flatter than written and only
|
|
129
|
+
`validate_timeline` says so, as `stagger_compressed`.
|
|
130
|
+
|
|
131
|
+
For a group of separate clips — three lower-third parts, five icons — stagger by
|
|
132
|
+
giving each clip's `in` animation a `delayMs` 60–80ms apart, and start the last
|
|
133
|
+
clip no more than about 700ms after the first. Past that the tail drags. This
|
|
134
|
+
step applies to every clip-to-clip build, including logo parts and strokes.
|
|
135
|
+
|
|
136
|
+
## The 1/3 rule, in both forms
|
|
137
|
+
|
|
138
|
+
- **Distance.** Nothing travels more than about a third of the frame in one
|
|
139
|
+
unbroken move. `slide` with `distance` above 0.35 reads as "the template
|
|
140
|
+
moved". Break it with a scale or opacity change on the same window, or shorten
|
|
141
|
+
the travel.
|
|
142
|
+
- **Simultaneity.** With three or more elements, keep at most a third in active
|
|
143
|
+
motion at any instant. The rest hold, or run ambient loops.
|
|
144
|
+
|
|
145
|
+
## Anticipation, follow-through, arcs
|
|
146
|
+
|
|
147
|
+
The three that separate animated from moved. None has a preset; each is a
|
|
148
|
+
`custom` animation, which is where a short `code` body earns its place.
|
|
149
|
+
|
|
150
|
+
**Anticipation** — a counter-move of 60–120ms before the main action. Ask for a
|
|
151
|
+
dip before a pop:
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{"role": "in", "preset": "custom", "durationMs": 520,
|
|
155
|
+
"curves": [{"property": "scale", "keyframes": [
|
|
156
|
+
{"t": 0, "value": 1}, {"t": 0.2, "value": 0.94, "easing": "easeInOut"},
|
|
157
|
+
{"t": 0.75, "value": 1.06, "easing": "easeOut"}, {"t": 1, "value": 1}]}]}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Follow-through** — attached parts settle 40–80ms after the body. Give the
|
|
161
|
+
child clip the same preset and a `delayMs` 60ms later, rather than animating the
|
|
162
|
+
whole group as one block.
|
|
163
|
+
|
|
164
|
+
**Arcs** — straight-line translation of anything organic looks mechanical. Drive
|
|
165
|
+
`offsetX` linearly and `offsetY` as a shallow curve over the same window; the
|
|
166
|
+
two fold as `add`, so they compose.
|
|
167
|
+
|
|
168
|
+
A decaying bounce, an arc, or a settle written as a function of time is a `code`
|
|
169
|
+
body returning `samples` — one bag per point, `{t, offsetY}`, at
|
|
170
|
+
`inputs.sampleCount` points. The body runs once at author time, hermetically, and
|
|
171
|
+
reads `role`, `durationMs`, `clipDurationMs`, `canvasWidth`, `canvasHeight`,
|
|
172
|
+
`params`, `staggerCount` and `sampleCount` off `inputs`:
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
// fragment
|
|
176
|
+
const n = inputs.sampleCount;
|
|
177
|
+
const h = 0.06 * inputs.canvasHeight;
|
|
178
|
+
const samples = [];
|
|
179
|
+
for (let i = 0; i < n; i++) {
|
|
180
|
+
const t = i / (n - 1);
|
|
181
|
+
// three decaying hops, ending exactly at rest
|
|
182
|
+
const y = -h * Math.abs(Math.sin(Math.PI * 3 * t)) * (1 - t);
|
|
183
|
+
samples.push({ t, offsetY: y });
|
|
184
|
+
}
|
|
185
|
+
return { samples };
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Land the last sample on the identity value — 0 for an offset, 1 for a scale or
|
|
189
|
+
an opacity — when the motion should settle. An `in` curve contributes nothing
|
|
190
|
+
after its window, an `out` curve holds its last value after the window, and an
|
|
191
|
+
`emphasis` curve returns to its base outside the window.
|
|
192
|
+
|
|
193
|
+
## Rhythm against audio
|
|
194
|
+
|
|
195
|
+
Land impact keyframes on the beat. At 120 BPM a beat is 500ms and the eighth
|
|
196
|
+
grid is 250ms. `beat-sync-editing` turns detected onsets into markers and
|
|
197
|
+
snaps. For motion that should follow later tempo edits, store `beat` on the
|
|
198
|
+
animation in the full timeline document. Its `index` is one-based, `scope`
|
|
199
|
+
is `clip` or `sequence`, and `offsetMs` can place anticipation before the hit.
|
|
200
|
+
`edit_timeline`'s `animate_clip` input does not author this field; use
|
|
201
|
+
`get_timeline` and `set_timeline_document` as described in `timeline-edit-ops`.
|
|
202
|
+
|
|
203
|
+
```json
|
|
204
|
+
{"id":"impact","role":"emphasis","preset":"pulse","durationMs":240,"beat":{"index":3,"scope":"sequence","offsetMs":-20}}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
A move ending 80ms after a hit reads late, and one ending 80ms before it can
|
|
208
|
+
weaken the impact. Use `offsetMs` deliberately for anticipation.
|
|
209
|
+
|
|
210
|
+
With no music, keep one major event per 500–800ms so the piece breathes at a
|
|
211
|
+
constant pulse.
|
|
212
|
+
|
|
213
|
+
## Spring or duration
|
|
214
|
+
|
|
215
|
+
`spring(stiffness,damping,mass)` shapes the motion inside the animation's
|
|
216
|
+
`durationMs`; it is scaled to settle near the end of that window. Use it for a
|
|
217
|
+
physical-looking landing, then set `durationMs` against the cut as you would
|
|
218
|
+
for any other easing. For a precise held pose or hard timecode, write
|
|
219
|
+
keyframes and put `hold` on the segment that should stay still.
|
|
220
|
+
|
|
221
|
+
## Frame texture
|
|
222
|
+
|
|
223
|
+
Use per-clip `motionBlur` when a fast move strobes. Start with a 180-degree
|
|
224
|
+
shutter and raise `samplesPerFrame` only as far as the frame needs; the highest
|
|
225
|
+
requested sample count is shared by the scene. Use `steppedTime.fps` for a
|
|
226
|
+
deliberate low-frame-rate look, or `temporalEcho` for delayed copies. These are
|
|
227
|
+
stored clip fields written through `set_timeline_document`, not
|
|
228
|
+
`animate_clip` parameters.
|
|
229
|
+
|
|
230
|
+
## Diagnosing
|
|
231
|
+
|
|
232
|
+
| It feels | Because | Fix |
|
|
233
|
+
|---|---|---|
|
|
234
|
+
| Stiff, robotic | `linear` or a symmetric curve on an entrance | `easeOut`, or drop `easing` and take the role default |
|
|
235
|
+
| Floaty, slow | Duration too long, curve too gentle | Cut 30%, sharpen to `cubic-bezier(0.16,1,0.3,1)` |
|
|
236
|
+
| Cheap, janky | Everything arrives at once, one duration for every size | Stagger, and scale duration with area |
|
|
237
|
+
| Mechanical despite easing | No anticipation, no overlap, straight-line paths | A `custom` dip before the move; 60ms offsets on attached parts |
|
|
238
|
+
| Busy | Two primary moves in one frame | Demote one to a loop or hold it still |
|
|
239
|
+
| Staggered text does not look staggered | Span exceeded the clip and was compressed | Lengthen the clip or lower `offsetMs` yourself |
|
|
240
|
+
|
|
241
|
+
## Quick reference
|
|
242
|
+
|
|
243
|
+
| Need | Value |
|
|
244
|
+
|---|---|
|
|
245
|
+
| Entrance | `easeOut` / `cubic-bezier(0.16,1,0.3,1)`, 300–500ms |
|
|
246
|
+
| Exit | `easeIn` / `cubic-bezier(0.7,0,0.84,0)`, 200–300ms |
|
|
247
|
+
| Move in place | `easeInOut`, 300–400ms |
|
|
248
|
+
| Playful landing | `easeOutBack`, 400–600ms |
|
|
249
|
+
| Word stagger | 60–100ms, five words or fewer |
|
|
250
|
+
| Character stagger | 30–50ms |
|
|
251
|
+
| Clip-to-clip stagger | 60–80ms `delayMs` steps, last clip starts ≤ 700ms after the first |
|
|
252
|
+
| Read hold | ≥ 1000ms at rest before the `out` or the cut |
|
|
253
|
+
| Rest between moves | ≥ 400ms still between two moves of one element |
|
|
254
|
+
| Continuous loop | `linear` when constant speed is intended |
|
|
255
|
+
| Travel cap | `distance` ≤ 0.35 without a second channel |
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: music-video-treatment
|
|
3
|
+
description: Turn confirmed track metadata into a shootable, beat-synced music-video treatment and NodeTool storyboard. Use for a music video cut to a track, not ads or promos (commercial-beat-sheet, motion-ad), workflows, pipelines, or finished renders.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Music Video Treatment → Storyboard Agent
|
|
7
|
+
|
|
8
|
+
Create a complete, shootable music-video treatment as a NodeTool storyboard. Work directly through storyboard and entity capabilities. Do not build a workflow or pipeline. Do not render or assemble a timeline unless asked.
|
|
9
|
+
|
|
10
|
+
## Brief and truthfulness
|
|
11
|
+
|
|
12
|
+
Require artist and persona, track title, genre, BPM, time signature, track length, a timecoded section map, performance-to-narrative ratio, platform, tone, and any mandatory or forbidden content. BPM and section map are hard inputs. If neither a section map nor audio is available, ask rather than invent bar counts. Mark unknown artist, label, release, lyric, or production facts as `[ARTIST INPUT NEEDED]`.
|
|
13
|
+
|
|
14
|
+
## Entity roster
|
|
15
|
+
|
|
16
|
+
Resolve the roster before drafting sections: user references first, then `list_entities`, then generate only missing references. The artist is always a character entity and a provided press image is never regenerated. Resolve style first; apply it to generated artist, locations, and props. Keep a typical roster to 4–7 entities: style, artist, 1–2 locations, and 0–2 signature props. Show the roster and flag a generated artist as a stand-in before treatment drafting.
|
|
17
|
+
|
|
18
|
+
## Music grid and treatment
|
|
19
|
+
|
|
20
|
+
Compute seconds per bar as `(60 / BPM) × beats per bar`, convert every section into bars and timecodes, and make every transition land on a bar, beat, or lyric. Build three distinct directions with a performance/narrative ratio, repeatable chorus hook shot, drop event, risk, and entity roster. Recommend one in two sentences or fewer.
|
|
21
|
+
|
|
22
|
+
For each section, provide timecode and bar range, musical and visual jobs, framing, lens/angle, movement, visual/action, sync point, entities, performance, lyric text when applicable, lighting, grade/effect, transition, and why it cuts. Interleave performance and narrative. The biggest event lands on the drop or first chorus downbeat; every chorus repeats the hook shot; include one deliberate rhythmic break before the final chorus; the outro echoes the intro.
|
|
23
|
+
|
|
24
|
+
## Persist the board
|
|
25
|
+
|
|
26
|
+
Create a storyboard with `create_storyboard({ name, brief, style, aspect_ratio })`, using `storyboard_id` from its result. Put the full brief, lyrics, section map, bar grid, and roster in `brief`. The call shapes every board skill shares — entity id equals the asset id you passed in, the fifteen `edit_storyboard` ops, what `set_board` accepts, what text the generator actually reads — are in `storyboard-core` § Tool contract.
|
|
27
|
+
|
|
28
|
+
Attach entity ids with `edit_storyboard({ storyboard_id, ops: [{ op: "set_board", entity_ids, image_model, video_model }] })` (`set_entities` is only an alias). The two models are the `.ref` of a `find_model` call each, for `text_to_image` and `image_to_video`; load the `prompting_skill` each one names before writing shot text, since `motion`, `action` and the camera movement are the keyframe clip prompt and a performance section is worded differently for Kling's shot list, Hailuo's ordered beats or Seedance's sound brief.
|
|
29
|
+
|
|
30
|
+
A section usually runs longer than one generated clip (a 20s chorus against a 5–10s clip), so give each section several `add_shot` ops, one per phrase or bar group, each with its slice of the section's duration rounded to 0.5 seconds and the section name in its `slug`. Each action names visible entities in brackets and includes its sync point. The render attaches the artist or a prop to a shot only when its name appears in that shot's text (style and location always apply), so the artist's name goes in every performance shot, or on that shot's own `entity_ids`. Lyric text on screen is a note for the cut and goes on as a text clip after assembly (`caption-titles`), not into the render prompt.
|
|
31
|
+
|
|
32
|
+
Stop at the planned board unless asked to render. Report the directions, selected treatment, and entity roster.
|
|
33
|
+
|
|
34
|
+
## Render (only on request)
|
|
35
|
+
|
|
36
|
+
Stills first with `render_storyboard_stills`; look at each with `view_image` asking what is wrong, and fix a drifting artist at the entity, never in one shot's prompt. Clips with `render_storyboard_clips` at each shot's own `duration_seconds`; the model snaps it to the lengths it offers, which usually leaves frames to trim on the beat. Asking for longer clips than the shots need buys footage the cut throws away: report the extra clip seconds and get the user's go-ahead first (`storyboard-core` § Fusing shots). A clip wrong where its still was right is one `revise_storyboard_clip`. Then `assemble_storyboard_timeline`.
|
|
37
|
+
|
|
38
|
+
## When the treatment becomes a cut
|
|
39
|
+
|
|
40
|
+
The bar grid computed above is the plan; `beat-sync-editing` derives the real one from the track with `detect_audio_events` and snaps the cuts to it, so the two must agree before anything is trimmed. The track is the continuity here, so section clips render separately and mute their own audio — `video-audio-continuity` for the case where a piece has no track of its own. `timeline-edit-ops` carries the timeline op contract, `motion-graphics` the build loop, `color-motion` the per-section grade and any colour that moves on the drop, `frame-composition` the repeated hook framing across choruses, and `caption-titles` any lyric or artist card on screen.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nano-banana-pro-prompting
|
|
3
|
+
description: Prompt Google's Nano Banana Pro image model — the art-director brief it plans against, the lock/change/amount/constraints shape every edit needs, and the patterns for typography, diagrams, product mockups and storyboards. Use whenever the model id contains nano-banana-pro (fal-ai/nano-banana-pro, fal-ai/nano-banana-pro/edit, google/nano-banana-pro/text-to-image, google/nano-banana-pro/edit, google/nano-banana-pro/edit-ultra, google/nano-banana-pro/text-to-image-ultra, kie's nano-banana-pro, and Gemini's own gemini-3-pro-image) on generate_image, edit_image or a TextToImage node. Not for Nano Banana 2 or plain Nano Banana.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Nano Banana Pro → write the brief, not the adjectives
|
|
7
|
+
|
|
8
|
+
Google describes Nano Banana Pro as planning a composition before it paints
|
|
9
|
+
one: it settles the layout and the lighting, and only then commits to pixels.
|
|
10
|
+
Two things follow. It can reason a picture out — a solved equation on a whiteboard, a process diagram in
|
|
11
|
+
the right order — and it gets sharper the more it knows about the job, so one
|
|
12
|
+
sentence of context beats one more adjective.
|
|
13
|
+
|
|
14
|
+
Reach it with `find_model` for `text_to_image` or `image_to_image`, then
|
|
15
|
+
`generate_image` / `edit_image`. Nothing below is a parameter; it is all prompt
|
|
16
|
+
text.
|
|
17
|
+
|
|
18
|
+
## The generation brief
|
|
19
|
+
|
|
20
|
+
Eight slots. Fill the ones the shot needs, in this order:
|
|
21
|
+
|
|
22
|
+
| Slot | What goes in it |
|
|
23
|
+
| :--- | :--- |
|
|
24
|
+
| Subject | Who or what, in concrete terms |
|
|
25
|
+
| Action | What the subject is doing |
|
|
26
|
+
| Setting | Place, time of day, the light in the room |
|
|
27
|
+
| Style | The finished look, photoreal through flat illustration |
|
|
28
|
+
| Composition and camera | Framing, angle, lens behaviour — brief it like a photographer |
|
|
29
|
+
| Lighting and colour | How it is lit, and the grade |
|
|
30
|
+
| Text | Any words on the image, in quotes |
|
|
31
|
+
| Constraints | What stays out of frame ("no hands, no logos, no hotspots") |
|
|
32
|
+
|
|
33
|
+
A filled brief:
|
|
34
|
+
|
|
35
|
+
> A matte-black stainless steel insulated water bottle, 750ml, slim cylindrical
|
|
36
|
+
> body, brushed metal cap. It stands upright on a wet slate countertop, a few
|
|
37
|
+
> condensation droplets sliding down its side, mid-morning, in a quiet kitchen
|
|
38
|
+
> by a north-facing window, soft overcast daylight from the left. Photoreal
|
|
39
|
+
> high-end commercial product photography. Tight three-quarter hero shot,
|
|
40
|
+
> slightly below eye level so the bottle reads tall, 85mm at f/8 so the whole
|
|
41
|
+
> product stays sharp while the background falls into soft blur. One large
|
|
42
|
+
> softbox left, a subtle reflector right to control falloff; cool desaturated
|
|
43
|
+
> grade, clean neutral whites, a faint blue cast in the shadows. The words
|
|
44
|
+
> "STAY COLD. 24 HOURS." in small caps along the lower third. No other props,
|
|
45
|
+
> no hands, no visible brand logos, no harsh specular hotspots on the metal.
|
|
46
|
+
|
|
47
|
+
Add a line about who the image is for when you have one. "This is for a
|
|
48
|
+
high-end cookbook" sends the planning step toward shallow focus and careful
|
|
49
|
+
plating on its own.
|
|
50
|
+
|
|
51
|
+
## The edit brief
|
|
52
|
+
|
|
53
|
+
Edits drift the moment you stop describing what stays. Four slots, and the
|
|
54
|
+
first one is the whole trick:
|
|
55
|
+
|
|
56
|
+
- **Lock** — everything that must not move. Face and layout first, then the
|
|
57
|
+
details you would notice missing: a finish, a text line, the droplets, the
|
|
58
|
+
angle.
|
|
59
|
+
- **Change** — the single thing you are altering.
|
|
60
|
+
- **Amount** — how far to take it.
|
|
61
|
+
- **Constraints** — what the edit must not break.
|
|
62
|
+
|
|
63
|
+
> Lock: the water bottle — matte-black finish, brushed cap, slim cylindrical
|
|
64
|
+
> body, the "STAY COLD. 24 HOURS." text, the condensation droplets, its size
|
|
65
|
+
> and position in frame, the three-quarter hero angle. Change: swap the
|
|
66
|
+
> kitchen-counter background for a flat grey boulder beside a sunlit mountain
|
|
67
|
+
> trail. Amount: full environment swap, understated — soft natural daylight,
|
|
68
|
+
> not golden hour; shot on location, not composited. Constraints: don't relight
|
|
69
|
+
> or recolour the bottle beyond the new ambient light; no new reflections or
|
|
70
|
+
> hotspots on the metal; keep the original cool grade; don't touch the cap,
|
|
71
|
+
> droplets or text; no hands, people or gear in frame.
|
|
72
|
+
|
|
73
|
+
**One change per call.** Ten edits in one sentence is how you lose track of
|
|
74
|
+
which one broke the image. Re-state the lock list on every pass.
|
|
75
|
+
|
|
76
|
+
## Rules that keep it from reading as AI
|
|
77
|
+
|
|
78
|
+
- Adjectives do not render. "Stunning" draws nothing; overcast light and
|
|
79
|
+
chipped paint draw something.
|
|
80
|
+
- Pin style words to something concrete. "Cinematic" drifts; "a teal-and-amber
|
|
81
|
+
grade with hard shadows" does not.
|
|
82
|
+
- Name the real thing. If the shot needs a boarding pass, the words "boarding
|
|
83
|
+
pass" beat any amount of mood language.
|
|
84
|
+
- Wrap on-image text in quotes and call out the typeface and its position. When
|
|
85
|
+
the model keeps dropping a letter, spell the word out. That is for a poster or
|
|
86
|
+
a mockup that ships as an image; a still headed for a timeline, or a
|
|
87
|
+
storyboard keyframe, keeps its copy off the picture and gets it as a text clip
|
|
88
|
+
afterwards (`caption-titles`), where it stays editable.
|
|
89
|
+
|
|
90
|
+
The contrast is the whole lesson. "A gorgeous hyper-detailed photo of a potter,
|
|
91
|
+
masterpiece, cinematic, 8k" gives the model nothing to decide against. "A
|
|
92
|
+
ceramicist in her 40s centering wet clay on a spinning wheel in a cluttered
|
|
93
|
+
studio, late-afternoon light raking across the workbench, grey slip drying on
|
|
94
|
+
her forearms, a row of unglazed bowls on the shelf behind her, eye-level at
|
|
95
|
+
50mm with shallow focus, muted earth tones" is a list of decisions the model no
|
|
96
|
+
longer has to invent.
|
|
97
|
+
|
|
98
|
+
## Patterns worth reaching for
|
|
99
|
+
|
|
100
|
+
- **Typography and posters** — name the print process, the ink colours, the
|
|
101
|
+
exact words in quotes, the type class and its position: "risograph gig
|
|
102
|
+
poster, two-colour overprinted teal and burnt orange, visible halftone,
|
|
103
|
+
'BLUE ROOM SESSIONS' large in a condensed slab serif across the top,
|
|
104
|
+
'Thursdays, 9pm' in small monospace at the bottom, slightly misregistered".
|
|
105
|
+
- **Infographics and diagrams** — this is where the planning step pays. Ask for
|
|
106
|
+
a labelled cross-section or a bar comparison, name the palette and the type
|
|
107
|
+
class, and end with "keep every label legible".
|
|
108
|
+
- **Directing the shot** — one hard light source, named falloff, a named lens:
|
|
109
|
+
"lit by one hard source from a window at camera left, deep falloff into
|
|
110
|
+
shadow, a thin rim along the fruit's edge, macro so the waxy skin reads".
|
|
111
|
+
- **Wireframe to screen (edit)** — "use the attached pencil wireframe as the
|
|
112
|
+
exact layout"; then the palette, the type class and the copy.
|
|
113
|
+
- **Storyboards** — ask for N panels in one image, name the medium ("loose
|
|
114
|
+
black-and-white marker sketches") and vary the framing across the panels.
|
|
115
|
+
- **Object swap (edit)** — swap the object, then list the scene, the light, the
|
|
116
|
+
depth of field, the palette and the existing shadows as unchanged, and ask
|
|
117
|
+
for matched scale, texture and contact shadows.
|
|
118
|
+
|
|
119
|
+
## What the model brings
|
|
120
|
+
|
|
121
|
+
The vendor's guide says resemblance holds for up to 5 people across
|
|
122
|
+
generations and edits, so recurring characters in a campaign or a storyboard
|
|
123
|
+
are workable. Several reference images combine in one generation for style or
|
|
124
|
+
a multi-image scene: Replicate's `google/nano-banana-pro` takes up to 14 and
|
|
125
|
+
kie's `nano-banana-pro` up to 8. Text-to-image and edit are the same model.
|
|
126
|
+
Google states that outputs carry SynthID watermarking.
|
|
127
|
+
|
|
128
|
+
Grade the result rather than eyeballing it: `critique_image` for a written
|
|
129
|
+
read, `score_image_adherence` when you need the prompt checked against the
|
|
130
|
+
render.
|
|
131
|
+
|
|
132
|
+
Adapted from fal's Nano Banana Pro prompting guide:
|
|
133
|
+
https://fal.ai/learn/tools/nano-banana-pro-prompting-guide
|