flomotion 0.2.0 → 0.4.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/CHANGELOG.md +58 -2
- package/LICENSE +1 -1
- package/README.md +29 -20
- package/dist/bin.mjs +6279 -2582
- package/dist/chunks/{chunk-QG2MOGKO.mjs → chunk-IGG2VZB6.mjs} +178 -14
- package/dist/chunks/{chunk-AVP5XX4G.mjs → chunk-PEC2UVQY.mjs} +138 -108
- package/dist/chunks/{chunk-IUSYVGP6.mjs → chunk-TTHAZGRG.mjs} +7 -7
- package/dist/chunks/{chunk-JCLRAREG.mjs → chunk-XWY6CUY6.mjs} +16 -16
- package/dist/chunks/{lock-MLQUU7X3.mjs → lock-WGPR7CJ2.mjs} +3 -3
- package/dist/components.mjs +19 -13
- package/dist/core.mjs +12 -12
- package/dist/hooks.mjs +8 -12
- package/dist/jsx-dev-runtime.mjs +1 -1
- package/dist/jsx-runtime.mjs +1 -1
- package/docs/components/Adjustment.md +2 -2
- package/docs/components/Audio.md +2 -2
- package/docs/components/B.md +3 -3
- package/docs/components/Captions.md +2 -2
- package/docs/components/Card.md +2 -2
- package/docs/components/Center.md +2 -2
- package/docs/components/Chart.md +2 -2
- package/docs/components/Chip.md +2 -2
- package/docs/components/Circle.md +2 -2
- package/docs/components/Clip.md +2 -2
- package/docs/components/CodeBlock.md +2 -2
- package/docs/components/Composition.md +2 -2
- package/docs/components/Counter.md +2 -2
- package/docs/components/Cursor.md +2 -2
- package/docs/components/Fonts.md +2 -2
- package/docs/components/GlassCard.md +2 -2
- package/docs/components/Grid.md +2 -2
- package/docs/components/Group.md +2 -2
- package/docs/components/Highlight.md +3 -3
- package/docs/components/I.md +3 -3
- package/docs/components/Image.md +2 -2
- package/docs/components/Line.md +2 -2
- package/docs/components/Marker.md +2 -2
- package/docs/components/Path.md +2 -2
- package/docs/components/Polygon.md +2 -2
- package/docs/components/Precomp.md +2 -2
- package/docs/components/ProgressRing.md +2 -2
- package/docs/components/Rect.md +2 -2
- package/docs/components/RoundRect.md +2 -2
- package/docs/components/SafeArea.md +2 -2
- package/docs/components/Scene.md +2 -2
- package/docs/components/Sequence.md +2 -2
- package/docs/components/Span.md +3 -3
- package/docs/components/SplitText.md +2 -2
- package/docs/components/Stack.md +2 -2
- package/docs/components/Stagger.md +2 -2
- package/docs/components/Strike.md +3 -3
- package/docs/components/Svg.md +2 -2
- package/docs/components/Text.md +2 -2
- package/docs/components/Title.md +2 -2
- package/docs/components/Track.md +2 -2
- package/docs/components/UIMock.md +2 -2
- package/docs/components/Underline.md +3 -3
- package/docs/components/Video.md +2 -2
- package/docs/gate2-manual-checklist.md +10 -9
- package/docs/hyperframes-notes.md +20 -20
- package/docs/later.md +23 -16
- package/docs/spec.md +83 -22
- package/package.json +1 -2
- package/skills/flomotion-studio/CHANGELOG.md +39 -0
- package/skills/flomotion-studio/README.md +81 -0
- package/skills/flomotion-studio/SKILL.md +90 -0
- package/skills/flomotion-studio/config/thresholds.md +191 -0
- package/skills/flomotion-studio/dataset/annotations/ansarada.md +53 -0
- package/skills/flomotion-studio/dataset/annotations/canva.md +49 -0
- package/skills/flomotion-studio/dataset/annotations/clickup.md +60 -0
- package/skills/flomotion-studio/dataset/annotations/gemini-stub.md +39 -0
- package/skills/flomotion-studio/dataset/annotations/monday.md +51 -0
- package/skills/flomotion-studio/dataset/annotations/phantom.md +53 -0
- package/skills/flomotion-studio/dataset/annotations/slack.md +54 -0
- package/skills/flomotion-studio/dataset/annotations/unknown-7.md +39 -0
- package/skills/flomotion-studio/dataset/annotations/vaylens.md +53 -0
- package/skills/flomotion-studio/dataset/brief-template.md +110 -0
- package/skills/flomotion-studio/dataset/rating-sheet.md +28 -0
- package/skills/flomotion-studio/dataset/schema.md +44 -0
- package/skills/flomotion-studio/evals/README.md +33 -0
- package/skills/flomotion-studio/evals/briefs/briefs.md +25 -0
- package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/kinetic.scene.tsx +1 -1
- package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/minimal.scene.tsx +1 -1
- package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/sketch.scene.tsx +1 -1
- package/skills/flomotion-studio/examples/flomotion-ad/LOG.md +39 -0
- package/skills/flomotion-studio/examples/flomotion-ad/brief.md +41 -0
- package/skills/flomotion-studio/examples/flomotion-ad/ideas.md +12 -0
- package/skills/flomotion-studio/examples/flomotion-ad/project.tsx +1694 -0
- package/skills/flomotion-studio/examples/flomotion-ad/script.md +28 -0
- package/skills/flomotion-studio/examples/flomotion-ad/storyboard.md +93 -0
- package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/README.md +1 -1
- package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/make-assets.sh +1 -1
- package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/project.tsx +3 -3
- package/skills/flomotion-studio/looks/bold-kinetic.md +122 -0
- package/skills/flomotion-studio/looks/clean-light.md +122 -0
- package/skills/flomotion-studio/looks/dark-product.md +120 -0
- package/skills/flomotion-studio/references/anti-patterns.md +36 -0
- package/skills/flomotion-studio/references/assets.md +42 -0
- package/skills/flomotion-studio/references/block-recipes.md +249 -0
- package/skills/flomotion-studio/references/blocks.md +114 -0
- package/skills/flomotion-studio/references/catalogue.md +53 -0
- package/skills/flomotion-studio/references/checks.md +87 -0
- package/skills/flomotion-studio/references/clean-styles.md +56 -0
- package/skills/{motion-studio → flomotion-studio}/references/components.md +94 -94
- package/skills/flomotion-studio/references/copywriting.md +64 -0
- package/skills/flomotion-studio/references/decision-tables.md +80 -0
- package/skills/flomotion-studio/references/interview.md +145 -0
- package/skills/flomotion-studio/references/looks.md +45 -0
- package/skills/flomotion-studio/references/mcp-tools.md +70 -0
- package/skills/flomotion-studio/references/motion.md +68 -0
- package/skills/flomotion-studio/references/patterns.md +45 -0
- package/skills/flomotion-studio/references/review.md +56 -0
- package/skills/flomotion-studio/references/script-craft.md +59 -0
- package/skills/flomotion-studio/references/sound.md +57 -0
- package/skills/flomotion-studio/references/story-templates.md +52 -0
- package/skills/flomotion-studio/references/storyboard.md +62 -0
- package/skills/flomotion-studio/references/styles.md +70 -0
- package/skills/flomotion-studio/references/transitions.md +62 -0
- package/skills/flomotion-studio/references/typography.md +46 -0
- package/skills/flomotion-studio/references/workflow.md +96 -0
- package/skills/motion-studio/SKILL.md +0 -87
- package/skills/motion-studio/looks/kinetic.json +0 -89
- package/skills/motion-studio/looks/minimal.json +0 -91
- package/skills/motion-studio/looks/sketch.json +0 -83
- package/skills/motion-studio/references/motion.md +0 -73
- package/skills/motion-studio/references/review.md +0 -32
- package/skills/motion-studio/references/saas-promo.md +0 -29
- package/skills/motion-studio/references/sound.md +0 -47
- package/skills/motion-studio/references/typography.md +0 -50
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Gate 2: manual checklist (a real Claude Code session)
|
|
2
2
|
|
|
3
|
-
**Status: unverified.** Nothing in this repository has been run in a real Claude Code session with the `
|
|
3
|
+
**Status: unverified.** Nothing in this repository has been run in a real Claude Code session with the `flomotion-studio` skill. The automated flow test (`tests/e2e/gate2-flow.test.ts`) plays the skill's steps through the MCP SDK client against test doubles. It proves the tools compose in the skill's order and enforce its gates. It does not prove that Claude follows the skill, writes good scenes, or that the live services behave like the doubles. Run this checklist to find out, and tell me what breaks.
|
|
4
4
|
|
|
5
5
|
Allow about an hour and a cheap amount of money: the only paid step is the optional ElevenLabs voice.
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ Without a Freesound key the server falls back to `sounds/catalog.json` (your own
|
|
|
20
20
|
|
|
21
21
|
Optional environment for ElevenLabs quotes: `ELEVENLABS_USD_PER_1K_CREDITS` (your plan's price per 1000 credits, so the quote can show money), `ELEVENLABS_CREDITS_PER_CHAR` (default 1; about 0.5 for flash models), `ELEVENLABS_COMMERCIAL_OK=1` (only if your plan allows commercial use, so the ledger records the voice as cleared).
|
|
22
22
|
|
|
23
|
-
## 1. Install
|
|
23
|
+
## 1. Install flomotion and the skill
|
|
24
24
|
|
|
25
25
|
From a checkout of this repo:
|
|
26
26
|
|
|
@@ -28,22 +28,22 @@ From a checkout of this repo:
|
|
|
28
28
|
pnpm i && pnpm build
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
After it is published to npm you can use `npx -y flomotion …`
|
|
31
|
+
After it is published to npm you can use `npx -y flomotion …` instead of the path below.
|
|
32
32
|
|
|
33
33
|
Make an empty folder for the video and register the server **in that folder's scope**:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
mkdir ~/videos/pulse && cd ~/videos/pulse
|
|
37
|
-
claude mcp add
|
|
37
|
+
claude mcp add flomotion \
|
|
38
38
|
-e FREESOUND_API_KEY=$FREESOUND_API_KEY \
|
|
39
39
|
-e ELEVENLABS_API_KEY=$ELEVENLABS_API_KEY \
|
|
40
|
-
-- node /ABSOLUTE/PATH/TO/
|
|
41
|
-
node /ABSOLUTE/PATH/TO/
|
|
40
|
+
-- node /ABSOLUTE/PATH/TO/flomotion/packages/cli/dist/bin.mjs mcp --dir . --ui
|
|
41
|
+
node /ABSOLUTE/PATH/TO/flomotion/packages/cli/dist/bin.mjs install skill # copies the skill to ~/.claude/skills/flomotion-studio (add --project for ./.claude/skills)
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
Leave out the `-e` lines for keys you do not have. Then start `claude` in that folder and run `/mcp`: the `
|
|
44
|
+
Leave out the `-e` lines for keys you do not have. Then start `claude` in that folder and run `/mcp`: the `flomotion` server must be connected and list 39 tools. Run `/skills` (or ask "what skills do you have?"): `flomotion-studio` must be there. The server was started with `--ui`: its stderr line `live view: http://127.0.0.1:4317` (also in the `ui` field of `project_read`) is the live view address; open it before you start and keep it beside the terminal.
|
|
45
45
|
|
|
46
|
-
Pass: server connected,
|
|
46
|
+
Pass: server connected, 39 tools, skill listed. If the server is not connected, run the command after `mcp` by hand in a terminal and read its stderr.
|
|
47
47
|
|
|
48
48
|
## 2. The session
|
|
49
49
|
|
|
@@ -73,6 +73,7 @@ Watch for each item. Write "pass", "fail" or "n/a" and a note.
|
|
|
73
73
|
4. **Check `renders/<id>-final.licenses.json`** for `problems`. A generated ElevenLabs voice shows "not cleared for commercial use" unless you set `ELEVENLABS_COMMERCIAL_OK=1`; confirm your plan before publishing.
|
|
74
74
|
5. **Open `project.tsx`.** Is it readable? Would it diff cleanly in git? Run `git init && git add . && git commit` and make a one-line change by hand; render again.
|
|
75
75
|
6. **Undo works:** ask Claude to undo its last change (it uses `history_restore`), check the file went back.
|
|
76
|
+
7. **The live view tells the truth.** While Claude works, the activity list should show each tool call within about a second, with the same description Claude reports; the progress list should follow the gate files Claude writes (`brief.md`, `script.md`, `storyboard.md`); the preview scrubber should render the current file; the Restore button on the History tab should put an earlier version back. Note anything that lags, shows stale data, or disagrees with what Claude says it did.
|
|
76
77
|
|
|
77
78
|
## 4. Live services: what each test double hides
|
|
78
79
|
|
|
@@ -86,4 +87,4 @@ Watch for each item. Write "pass", "fail" or "n/a" and a note.
|
|
|
86
87
|
|
|
87
88
|
## 5. Report back
|
|
88
89
|
|
|
89
|
-
Send me: which table rows failed and the tool error text (every error has a `code` and a `fix`), the `.
|
|
90
|
+
Send me: which table rows failed and the tool error text (every error has a `code` and a `fix`), the `.flomotion/history/index.json`, and the final MP4's duration. I will fix what broke and re-run the gate.
|
|
@@ -5,7 +5,7 @@ FFmpeg 7.1.1). Sources: `npx hyperframes --help`, `docs <topic>`, scaffold from
|
|
|
5
5
|
skills in `node_modules/hyperframes/dist/skills/` (`hyperframes`, `hyperframes-cli`, `media-use`),
|
|
6
6
|
and real test renders. **Installed version wins over the prompt.** Differences are listed at the end.
|
|
7
7
|
|
|
8
|
-
## CLI used by
|
|
8
|
+
## CLI used by flomotion
|
|
9
9
|
|
|
10
10
|
| Need | Command |
|
|
11
11
|
| ------------------------ | ---------------------------------------------------------------------------------------- |
|
|
@@ -17,7 +17,7 @@ and real test renders. **Installed version wins over the prompt.** Differences a
|
|
|
17
17
|
| Env health | `hyperframes doctor` (reports FFmpeg, Chrome, whisper-cpp, memory) |
|
|
18
18
|
|
|
19
19
|
Render writes `renders/<name>.mp4` by default; `-o` overrides. Telemetry: set
|
|
20
|
-
`HYPERFRAMES_NO_TELEMETRY=1` and `DO_NOT_TRACK=1` for child processes (
|
|
20
|
+
`HYPERFRAMES_NO_TELEMETRY=1` and `DO_NOT_TRACK=1` for child processes (flomotion does).
|
|
21
21
|
|
|
22
22
|
## Project / composition contract
|
|
23
23
|
|
|
@@ -38,7 +38,7 @@ Render writes `renders/<name>.mp4` by default; `-o` overrides. Telemetry: set
|
|
|
38
38
|
element (`gsap_css_transform_conflict`), tween of the `.clip` element itself
|
|
39
39
|
(`gsap_animates_clip_element`: animate a child or its `opacity`).
|
|
40
40
|
- Nested timed clips: a clip inside another timed element takes `data-start` from the
|
|
41
|
-
_composition_, not the parent, and shows only while the parent shows.
|
|
41
|
+
_composition_, not the parent, and shows only while the parent shows. flomotion avoids this:
|
|
42
42
|
timed wrappers (scenes) have _untimed_ children, or all layers are flat siblings.
|
|
43
43
|
- Seek protocol for non-GSAP drawing: `window.addEventListener("hf-seek", e => draw(e.detail.time))`
|
|
44
44
|
(`e.detail.waitUntil(promise)` for async). No rAF clock. Heavy setup:
|
|
@@ -48,17 +48,17 @@ Render writes `renders/<name>.mp4` by default; `-o` overrides. Telemetry: set
|
|
|
48
48
|
`data-volume` 1 = 0 dB, up to 3.98. Edge fades `data-fade-in/out`.
|
|
49
49
|
- Asset paths root-relative (`assets/...`). Images without `data-duration` last 3 s.
|
|
50
50
|
- Variables: `data-composition-variables` on `<html>`, `--variables '{}'` on render.
|
|
51
|
-
(
|
|
51
|
+
(flomotion does not use these in phase 1/2.)
|
|
52
52
|
- Sub-compositions: files in `compositions/` wrapped in `<template>`, mounted with
|
|
53
53
|
`data-composition-src`. Host id == scene root id == timeline key, else 45 s wait per scene.
|
|
54
|
-
|
|
54
|
+
flomotion phase 1 emits one flat `index.html` and does not use sub-compositions.
|
|
55
55
|
|
|
56
56
|
## GSAP loading
|
|
57
57
|
|
|
58
|
-
The scaffold loads GSAP from jsDelivr CDN. **
|
|
58
|
+
The scaffold loads GSAP from jsDelivr CDN. **flomotion instead vendors the file**:
|
|
59
59
|
`<script src="vendor/gsap.min.js">` with a copy of `gsap@3.14.2/dist/gsap.min.js` written into the
|
|
60
60
|
project at compile time (render verified with a local script, no CDN). The `gsap` npm package is
|
|
61
|
-
a `@
|
|
61
|
+
a `@flomotion/render` dependency.
|
|
62
62
|
|
|
63
63
|
## Fonts (important for determinism)
|
|
64
64
|
|
|
@@ -67,17 +67,17 @@ a `@codecut/render` dependency.
|
|
|
67
67
|
Source Code Pro, Noto Sans JP, Roboto, Open Sans, Lato, Poppins.
|
|
68
68
|
- **For bundled names HyperFrames fetches from Google Fonts at render and caches in
|
|
69
69
|
`~/.cache/hyperframes/fonts/<family>/`** (observed log: `Fetched 11 font face(s) for "Inter"
|
|
70
|
-
from Google Fonts`). This is network use at render, so
|
|
70
|
+
from Google Fonts`). This is network use at render, so flomotion always emits its own
|
|
71
71
|
`@font-face` for every used family and refuses bare-name use of bundled families.
|
|
72
72
|
- A local `@font-face` with `src:url('assets/fonts/x.woff2')` is embedded as a data URI
|
|
73
73
|
(`Embedded local font file ... → data URI`) and makes no network request. Verified.
|
|
74
74
|
- **A missing font file does NOT fail HyperFrames**: the render succeeds (exit 0) with a
|
|
75
75
|
fallback face and only logs `[FileServer] 404 Not Found: /assets/fonts/x.woff2`. Therefore
|
|
76
|
-
|
|
77
|
-
succeeds in headless Chrome). Implemented in `@
|
|
76
|
+
flomotion must do its own pre-render font gate (file exists, hash matches lock, `document.fonts.load`
|
|
77
|
+
succeeds in headless Chrome). Implemented in `@flomotion/render` (`fontGate`).
|
|
78
78
|
- `hyperframes lint` rule `font_family_without_font_face` fires for unbundled families without
|
|
79
79
|
`@font-face`.
|
|
80
|
-
- `window.__hyperframes.fitTextFontSize(...)` and `.pretext` exist;
|
|
80
|
+
- `window.__hyperframes.fitTextFontSize(...)` and `.pretext` exist; flomotion uses its own
|
|
81
81
|
Chrome measurement instead so results are cached/hashed.
|
|
82
82
|
|
|
83
83
|
## Rendering behaviours observed
|
|
@@ -90,20 +90,20 @@ from Google Fonts`). This is network use at render, so CodeCut always emits its
|
|
|
90
90
|
First render downloads/caches fonts and takes ~1.5 min; warm render of 2 s took ~5 s.
|
|
91
91
|
- Static-frame dedup reuses identical frames (speeds up holds).
|
|
92
92
|
- `check` runs lint + runtime + layout + contrast; warns `first_frame_empty`, `line_unread`,
|
|
93
|
-
`sweep_static` etc. (useful input for
|
|
93
|
+
`sweep_static` etc. (useful input for flomotion `review`.)
|
|
94
94
|
- Chrome: uses system Chrome if found, GPU probe `hardware` (Metal) on this machine.
|
|
95
95
|
`--no-browser-gpu` forces SwiftShader (more deterministic across machines).
|
|
96
96
|
|
|
97
97
|
## Differences from the prompt
|
|
98
98
|
|
|
99
|
-
| Prompt | Installed reality |
|
|
99
|
+
| Prompt | Installed reality | flomotion decision |
|
|
100
100
|
| ------------------------------------------ | ---------------------------------------------- | ------------------------------------------------------------------------------ |
|
|
101
101
|
| `data-track-index` positions layers | Studio lane only; z-index paints | Compiler emits both; z-index from track order |
|
|
102
102
|
| Fonts from `document.fonts.load` fail-hard | HF itself silently falls back | Own `fontGate` pre-render step |
|
|
103
103
|
| GSAP "loaded the way HF expects" (CDN) | CDN in scaffold; local script works | Vendor GSAP locally |
|
|
104
104
|
| No network at render | HF auto-fetches Google fonts for bundled names | Always emit own `@font-face`, lint bare bundled names |
|
|
105
105
|
| Byte-identical double render | True on same machine (no timestamps) | Compare bytes; fall back to frame hashes if a future version embeds timestamps |
|
|
106
|
-
| Audio mix by HF | HF mixes `<audio>` tags itself |
|
|
106
|
+
| Audio mix by HF | HF mixes `<audio>` tags itself | flomotion mixes offline with FFmpeg and emits one `<audio id="mix">` |
|
|
107
107
|
| Transcribe | `hyperframes transcribe` (whisper-cpp) exists | Prefer `whisper-cpp` via HF; error if missing |
|
|
108
108
|
|
|
109
109
|
## Verified later while building
|
|
@@ -113,7 +113,7 @@ from Google Fonts`). This is network use at render, so CodeCut always emits its
|
|
|
113
113
|
tuples sorted numerically, ranges `300..700`. A modern Chrome User-Agent returns woff2 split into `/* subset */`
|
|
114
114
|
`@font-face` blocks with `unicode-range`. Developer API: `https://www.googleapis.com/webfonts/v1/webfonts?key=…`
|
|
115
115
|
(`capability=VF` adds `axes`). No quotas are documented.
|
|
116
|
-
- Google serves woff2 with the licence text **stripped** (only a copyright string remains), so
|
|
116
|
+
- Google serves woff2 with the licence text **stripped** (only a copyright string remains), so flomotion reads the
|
|
117
117
|
family's real licence from `github.com/google/fonts/<ofl|apache|ufl>/<family>/METADATA.pb`.
|
|
118
118
|
- **CSS `mask: url(#svgMask)` is not applied to HTML elements in headless Chrome 152** (the golden frames showed no
|
|
119
119
|
masking). Masks are implemented as a data-URI SVG `mask-image` instead.
|
|
@@ -127,10 +127,10 @@ from Google Fonts`). This is network use at render, so CodeCut always emits its
|
|
|
127
127
|
- `hyperframes check <dir> --json` prints a banner line, then one JSON object with `lint`, `runtime`, `layout`,
|
|
128
128
|
`motion` and `contrast`, each `{ ok, errorCount, warningCount, findings[] }`. `layout.samples` lists the times
|
|
129
129
|
it measured (about nine for 30 s); contrast findings carry `text`, `fg`, `bg`, `ratio`, `time`. A 30 s check takes
|
|
130
|
-
about a minute on this machine. The `lint` block warns `nested_structure_needs_subcomposition` for
|
|
131
|
-
track wrappers;
|
|
130
|
+
about a minute on this machine. The `lint` block warns `nested_structure_needs_subcomposition` for flomotion's
|
|
131
|
+
track wrappers; flomotion ignores it (renders are correct).
|
|
132
132
|
- `hyperframes transcribe <audio|transcript> -d <dir> --json [--no-runtime-install] [-l lang] [-m model]` writes
|
|
133
|
-
`transcript.
|
|
133
|
+
`transcript.md` in `<dir>`; with `--json` it prints `{ ok, engine, wordCount, transcriptPath, … }` or
|
|
134
134
|
`{ ok:false, error }` (`--optional` returns `{ skipped, reason:"whisper_unavailable", install }`). Engines: Parakeet
|
|
135
135
|
if installed, else whisper.cpp. Not run here (no whisper-cpp installed); the word shape is read tolerantly
|
|
136
136
|
(`text|word|w`, `start`, `end`).
|
|
@@ -145,5 +145,5 @@ from Google Fonts`). This is network use at render, so CodeCut always emits its
|
|
|
145
145
|
character_end_times_seconds } }`. The docs fetched did not state the auth header or per-character credit cost:
|
|
146
146
|
`xi-api-key` is used and the credit estimate is an assumption. **No live call has been made.**
|
|
147
147
|
- `tsx` applies a tsconfig only to files under the tsconfig's directory and reads it at registration, so a
|
|
148
|
-
published
|
|
149
|
-
from `@
|
|
148
|
+
published flomotion cannot rely on it. The bundled CLI compiles project TSX itself (esbuild, automatic JSX runtime
|
|
149
|
+
from `@flomotion/core`) and maps `@flomotion/*` imports with a Node resolve hook.
|
package/docs/later.md
CHANGED
|
@@ -2,19 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
Nothing here is implemented. Each item has a typed field or component so projects can already carry it.
|
|
4
4
|
|
|
5
|
-
| Item
|
|
6
|
-
|
|
|
7
|
-
| `Precomp`, `Adjustment`
|
|
8
|
-
| `shader(name)` transition
|
|
9
|
-
| `.cube` LUTs
|
|
10
|
-
| Text `extrude` (3D)
|
|
11
|
-
| Dashed text stroke, `stroke.align="inside"`
|
|
12
|
-
| Video fill clipped to letters
|
|
13
|
-
| `Video.reverse`
|
|
14
|
-
| Sidecar `*.keys.json`
|
|
15
|
-
| Phases 3–5
|
|
16
|
-
| `render` `variants` (9:16, 16:9, 1:1, 4:5)
|
|
17
|
-
| Editor type hints for `@
|
|
18
|
-
| Local TTS off macOS
|
|
19
|
-
| Original-quality Freesound files
|
|
20
|
-
| Voice cost in money
|
|
5
|
+
| Item | Where | Behaviour now | Issue note |
|
|
6
|
+
| ----------------------------------------------------------- | -------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------ |
|
|
7
|
+
| `Precomp`, `Adjustment` | structure | Schema only; compile reports `stub-not-rendered` | issue: nested timelines and adjustment layers |
|
|
8
|
+
| `shader(name)` transition | `Scene.transition.type="shader"` | Falls back to dissolve with a warning | issue: WebGL shader transitions |
|
|
9
|
+
| `.cube` LUTs | `ColorGrade.lut` | Ignored with a warning | issue: WebGL grading pass + LUT loader |
|
|
10
|
+
| Text `extrude` (3D) | text style | Ignored with a warning | issue: 3D text (phase 4) |
|
|
11
|
+
| Dashed text stroke, `stroke.align="inside"` | text style | Dash ignored; inside = centre | issue: SVG text rendering |
|
|
12
|
+
| Video fill clipped to letters | text `fill` | Falls back to white with a warning | issue: SVG clipPath + video |
|
|
13
|
+
| `Video.reverse` | media | Plays forward with a warning | issue: pre-rendered reversed copies |
|
|
14
|
+
| Sidecar `*.keys.json` | keyframes `keys=` | Field accepted, file not read | issue: sidecar keyframe files |
|
|
15
|
+
| Phases 3–5 | UI, 3D, pro layer | Not started | see brief §12 |
|
|
16
|
+
| `render` `variants` (9:16, 16:9, 1:1, 4:5) | MCP `render` | Rejected with `invalid_edit` | issue: format variants (phase 5) |
|
|
17
|
+
| Editor type hints for `@flomotion/*` in a published install | `flomotion` package | Not shipped: projects run, editors show no types | issue: emit `.d.ts` for core and components |
|
|
18
|
+
| Local TTS off macOS | `voice_quote local-tts` | `missing_dependency` with install steps | issue: piper / espeak-ng provider |
|
|
19
|
+
| Original-quality Freesound files | `sound_get` | HQ MP3 preview (needs only an API key) | issue: OAuth2 download flow |
|
|
20
|
+
| Voice cost in money | `voice_quote elevenlabs` | Credits estimate; USD only if you set a rate | issue: read the account's plan from the API |
|
|
21
|
+
| Editing in the live view | `flomotion ui` | Viewer with undo (Restore); no property editing | issue: phase 3 editor (inspector from schemas, patches via the same ops) |
|
|
22
|
+
| Skill checks not measured | `references/checks.md` | `palette-adherence` and `determinism` are reported as not run | issue: frame colour sampling; double render of sample frames in `review` |
|
|
23
|
+
| Pattern blocks (B) | `references/blocks.md` | Described, no recipes; build as custom scenes | issue: recipes for the 13 pattern blocks |
|
|
24
|
+
| AI image generation | `asset_*` | Not built | issue: a generation provider with quote then confirm, like voice |
|
|
25
|
+
| Unsplash and Pixabay photos | `asset_search` | Openverse and Pexels only | issue: more stock sources |
|
|
26
|
+
| Capturing pages behind a login | `asset_capture` | Public pages only; use `asset_import` for your own screenshots | issue: cookies or a recorded session |
|
|
27
|
+
| Freesound original files | `sound_get` | HQ MP3 preview with only an API key | issue: OAuth2 download flow |
|
package/docs/spec.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# flomotion spec (condensed, as implemented)
|
|
2
2
|
|
|
3
3
|
Sections 5–9 of the project brief, with the decisions made while building. Reference pages for every
|
|
4
4
|
component are generated from the schemas into `docs/components/` (`pnpm run gen:docs`).
|
|
@@ -34,7 +34,7 @@ internals. Constants become static styles.
|
|
|
34
34
|
|
|
35
35
|
## 3. Syntax and timing rules (§5.3)
|
|
36
36
|
|
|
37
|
-
- Every element has an `id`. A missing id is a lint warning and gets a stable `
|
|
37
|
+
- Every element has an `id`. A missing id is a lint warning and gets a stable `fm_` id (hash of its path).
|
|
38
38
|
- Effects are children of the layer they affect and apply in source order.
|
|
39
39
|
- **Child timing is relative to the parent Scene/Group/Sequence start.** `start="@12s"` is absolute.
|
|
40
40
|
Keyframe times are relative to the parent (the spec's "parent's local time"); expression `t` is relative to
|
|
@@ -93,7 +93,7 @@ rippleDelete snap lockTrack muteTrack soloTrack addMarker removeMarker`, as `edi
|
|
|
93
93
|
|
|
94
94
|
## 8. MCP server (§10.1)
|
|
95
95
|
|
|
96
|
-
`
|
|
96
|
+
`flomotion mcp --dir <project>` (or `npx -y flomotion mcp`) serves 39 tools over stdio for one project folder. All
|
|
97
97
|
paths are checked to stay inside it (`path_outside_project`). Every write returns `{ description, patches,
|
|
98
98
|
undoToken }`; the undo token is the id of the history snapshot taken before the write (`history_restore`).
|
|
99
99
|
Errors are `{ error: { code, message, fix, details } }` with `isError: true`. Codes: `schema_violation`,
|
|
@@ -101,23 +101,26 @@ Errors are `{ error: { code, message, fix, details } }` with `isError: true`. Co
|
|
|
101
101
|
`unknown_element`, `duplicate_keyframe`, `invalid_time`, `impure_expression`, `missing_dependency`,
|
|
102
102
|
`path_outside_project`, `font_error`, `render_failed`, `invalid_edit`.
|
|
103
103
|
|
|
104
|
-
| Tool | Does
|
|
105
|
-
| ------------------------------------------------------------------------ |
|
|
106
|
-
| `project_create` `project_read` | scaffold (blank, saas-promo) and outline (`path` = element id, `depth`); first read writes stable `
|
|
107
|
-
| `element_add` `element_set` `element_remove` `element_move` `effect_add` | structured edits, props validated by the component schema
|
|
108
|
-
| `keyframe_set` | replaces all keys of an animatable prop; times snap to the frame grid
|
|
109
|
-
| `edit` | any timeline op (§7) or keyframe op (§6)
|
|
110
|
-
| `scene_write` | replace an element with TSX you write: parsed, impurity-scanned, imports added, linted; restored if it fails
|
|
111
|
-
| `lint` | schema, determinism, fonts, ledger, text rules; `scope` limits to a subtree
|
|
112
|
-
| `frame_render` `contact_sheet` | exact-time PNG, tiled JPG (images are returned to the model)
|
|
113
|
-
| `sound_search` `sound_get` `sound_auto` | Freesound (key) or `sounds/catalog.json`; CC0/CC-BY by default; peak measured; ledger
|
|
114
|
-
| `font_search` `font_get` `font_list` `font_preview` `font_check` | Google Fonts metadata (key), download + lock + ledger, usage, PNG sample, glyph coverage
|
|
115
|
-
| `transcribe` `voice_quote` `voice_generate` `align_to_voice` | whisper.cpp via hyperframes, quote then `confirm:true`, retime to spoken words
|
|
116
|
-
| `mix_preview` `render` `review` | offline mix with measured loudness; presets draft/social/final with credits + licence report; 17-point checklist
|
|
117
|
-
| `history_list` `history_restore` | snapshots of the TSX file
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
`
|
|
104
|
+
| Tool | Does |
|
|
105
|
+
| ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
106
|
+
| `project_create` `project_read` | scaffold (blank, saas-promo) and outline (`path` = element id, `depth`); first read writes stable `fm_` ids |
|
|
107
|
+
| `element_add` `element_set` `element_remove` `element_move` `effect_add` | structured edits, props validated by the component schema |
|
|
108
|
+
| `keyframe_set` | replaces all keys of an animatable prop; times snap to the frame grid |
|
|
109
|
+
| `edit` | any timeline op (§7) or keyframe op (§6) |
|
|
110
|
+
| `scene_write` | replace an element with TSX you write: parsed, impurity-scanned, imports added, linted; restored if it fails |
|
|
111
|
+
| `lint` | schema, determinism, fonts, ledger, text rules; `scope` limits to a subtree |
|
|
112
|
+
| `frame_render` `contact_sheet` | exact-time PNG, tiled JPG (images are returned to the model) |
|
|
113
|
+
| `sound_search` `sound_get` `sound_auto` | Freesound (key) or `sounds/catalog.json`; CC0/CC-BY by default; peak measured; ledger |
|
|
114
|
+
| `font_search` `font_get` `font_list` `font_preview` `font_check` | Google Fonts metadata (key), download + lock + ledger, usage, PNG sample, glyph coverage |
|
|
115
|
+
| `transcribe` `voice_quote` `voice_generate` `align_to_voice` | whisper.cpp via hyperframes, quote then `confirm:true`, retime to spoken words |
|
|
116
|
+
| `mix_preview` `render` `review` | offline mix with measured loudness; presets draft/social/final with credits + licence report; 17-point checklist |
|
|
117
|
+
| `history_list` `history_restore` | snapshots of the TSX file |
|
|
118
|
+
| `setup_status` | what is set up and what is missing, by job; never returns a key |
|
|
119
|
+
| `voice_import` `transcript_import` `sound_import` `asset_import` | the person's own recording, transcript or captions, sound files, images and video, from anywhere on their computer, with their stated rights |
|
|
120
|
+
| `asset_search` `asset_get` `asset_capture` `brand_extract` | icons, emoji, logos, photos, illustrations from open sources; screenshots and brand from the person's own site |
|
|
121
|
+
|
|
122
|
+
Resources: `flomotion://schema/{component}` (JSON schema + docs), `flomotion://project/outline`, `flomotion://ledger`,
|
|
123
|
+
`flomotion://looks`.
|
|
121
124
|
|
|
122
125
|
### Editing TSX (codemods)
|
|
123
126
|
|
|
@@ -134,9 +137,9 @@ than writing something different.
|
|
|
134
137
|
|
|
135
138
|
Sound tags: `ui/pop ui/tap ui/tick move/whip move/whoosh-deep hit/land hit/punch hit/boom tech/click tech/data
|
|
136
139
|
tech/glass tech/success tech/glitch`. `sound_get` records `{source,id,author,license,url,attributionRequired,
|
|
137
|
-
commercialOk,peak}` in `.
|
|
140
|
+
commercialOk,peak}` in `.flomotion/ledger.json` (peak names merge when one sound serves several tags).
|
|
138
141
|
`<Sound at peak>` starts early by the peak so it lands on `at`. Ledger licence strings are SPDX-like (`CC0-1.0`,
|
|
139
|
-
`CC-BY-4.0`); `
|
|
142
|
+
`CC-BY-4.0`); `flomotion.json` `soundLicenses` lists the allowed families (`["CC0"]` restricts). Voice providers:
|
|
140
143
|
`recording` (default), `local-tts` (macOS `say`), `elevenlabs` (quote, then `confirm:true`). Mix presets set the
|
|
141
144
|
master LUFS (-14).
|
|
142
145
|
|
|
@@ -145,3 +148,61 @@ master LUFS (-14).
|
|
|
145
148
|
17 checks decided from the compiled project (baked channels give motion and static gaps), the lint, the ledger,
|
|
146
149
|
the measured mix, and `hyperframes check` for layout and contrast. Statuses: pass, fail, warn, manual, skipped.
|
|
147
150
|
Manual items are for the agent's second pass over the contact sheet; the tool never marks them as passed.
|
|
151
|
+
|
|
152
|
+
## 9. Live view (`flomotion ui`, `flomotion mcp --ui`)
|
|
153
|
+
|
|
154
|
+
A small local web page that shows what the agent is doing while it makes the video. `flomotion ui` serves it for a
|
|
155
|
+
folder; `flomotion mcp --ui` serves it from the MCP process (the address goes to stderr and into the `ui` field of
|
|
156
|
+
`project_read` and `project_create`). It binds `127.0.0.1` only and answers only requests whose `Host` is
|
|
157
|
+
localhost (no DNS rebinding); the page loads nothing from the network.
|
|
158
|
+
|
|
159
|
+
- **Activity:** every tool call is appended to `.flomotion/activity.jsonl` by the MCP server (tool, shortened
|
|
160
|
+
arguments, ok, duration, one-line summary, undo token). The page lists them newest first.
|
|
161
|
+
- **State:** `GET /api/state` gives the outline and timeline (from evaluating the TSX; a file that fails to load
|
|
162
|
+
keeps the last good picture and shows the error), history, activity, the ledger, the last `review` result
|
|
163
|
+
(`.flomotion/review/last.json`), gate files (`interview.md brief.md script.md storyboard.md LOG.md`), renders
|
|
164
|
+
and frames. Changes reach the page over Server-Sent Events (`/events`), which polls the files twice a second.
|
|
165
|
+
- **Preview:** `GET /api/frame?t=` builds the project in its own folder (`.flomotion/ui-build`, never the agent's)
|
|
166
|
+
and snapshots one frame, one build at a time, cached while the files are unchanged.
|
|
167
|
+
- **Files:** `/files/...` serves only frames, sheets, previews, renders and assets (with range requests for video).
|
|
168
|
+
Source, ledger internals, history and the activity log are never served.
|
|
169
|
+
- **Restore:** `POST /api/restore {id}` (requires a custom header so other sites cannot call it) restores a snapshot
|
|
170
|
+
and is logged and undoable like any write.
|
|
171
|
+
|
|
172
|
+
A link can open a tab and a time: `http://127.0.0.1:4317/#tab=review&t=2.4` (tabs: outline, code, review, assets, renders, history). It is a viewer with undo, not an editor: edits are made by the agent (or by hand in the file).
|
|
173
|
+
|
|
174
|
+
## 10. Setup, the person's own material, and assets
|
|
175
|
+
|
|
176
|
+
**`flomotion setup`** asks how the person wants to supply voice, word timings, sound effects and graphics, and saves
|
|
177
|
+
the keys that go with their choices to `~/.config/flomotion/config.json` (or `$FLOMOTION_CONFIG`; mode 0600; never
|
|
178
|
+
in the project, never sent to the model). Every key is optional and checked against its service with one read-only
|
|
179
|
+
request (Freesound search, ElevenLabs `GET /v1/user/subscription`, Google Fonts, Pexels). Real environment
|
|
180
|
+
variables win over saved keys. `setup show | check | set <name> [key] | unset <name> | sounds <folder> --rights`,
|
|
181
|
+
and `setup --yes` to save keys that are already in the environment. A folder of the person's own sounds is indexed by
|
|
182
|
+
name (tags from file and folder names) into `sound-library.json` next to the config; lengths are measured when a
|
|
183
|
+
sound is found, not when indexed.
|
|
184
|
+
|
|
185
|
+
**Voice and timings.** `voice_import` copies a recording in (assets/voice) and records it as the person's;
|
|
186
|
+
`transcript_import` turns SRT, VTT, word-level JSON (Whisper, ElevenLabs alignment, hyperframes), segment JSON,
|
|
187
|
+
lines starting with a time, or plain text into `<audio>.words.json` and reports the **precision**: `word` (exact),
|
|
188
|
+
`cue` (a time per line; words spread by length), `estimated` (plain text spread over the audio length). The
|
|
189
|
+
quote for a paid voice shows the real remaining allowance of the account.
|
|
190
|
+
|
|
191
|
+
**Sounds.** Your own files (project `sounds/catalog.json`, the library index, `sound_import`) are searched first,
|
|
192
|
+
then Freesound. They are used as `local:ID`. A row with a stated `rights` is always allowed; the person's statement
|
|
193
|
+
is recorded in the ledger as `rights asserted by the person`, never verified.
|
|
194
|
+
|
|
195
|
+
**Assets.** Sources: Iconify (icons, emoji, brand logos; per-set SPDX licence from its API; no key), Openverse
|
|
196
|
+
(photos and illustrations, filtered to CC0, PDM and CC-BY; no key), Pexels (key). Allowed licence classes by default:
|
|
197
|
+
CC0, permissive (MIT, Apache, ISC, BSD, OFL), CC-BY; share-alike, non-commercial and unknown are refused
|
|
198
|
+
(`flomotion.json` `assetLicenses` narrows it). Brand logos are trademarks and need `permission:true`. Files go to
|
|
199
|
+
`assets/third-party/<source>/` (pulled), `assets/captures/` (screenshots), `assets/brand/` (from the person's site),
|
|
200
|
+
`assets/imported/` (the person's own), each with a ledger entry (`assetKind`, licence, author, hash, source URL).
|
|
201
|
+
SVG that contains scripts, event handlers, `foreignObject` or external references is refused. `lint` requires a
|
|
202
|
+
ledger entry for any Image, Svg or Video under those folders and refuses one that is not cleared for commercial use;
|
|
203
|
+
the render's credits file lists CC-BY assets and, separately, credits a source asks for but the licence does not
|
|
204
|
+
require. `asset_capture` and `brand_extract` need `permission:true` (the person owns the page or may show it) and
|
|
205
|
+
use headless Chrome and the network once; `asset_capture` dismisses `alert()` dialogs and can hide elements.
|
|
206
|
+
|
|
207
|
+
Reading the person's files: only audio, image, video, caption and transcript types; never `.env`, `.ssh`, `.aws`,
|
|
208
|
+
`.gnupg`, keychains, `id_rsa`, `.npmrc` and the like.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flomotion",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "A code-first video editor: a video is one TSX file, edited by Claude through MCP and rendered with HyperFrames.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
"node": ">=22"
|
|
18
18
|
},
|
|
19
19
|
"bin": {
|
|
20
|
-
"codecut": "dist/bin.mjs",
|
|
21
20
|
"flomotion": "dist/bin.mjs"
|
|
22
21
|
},
|
|
23
22
|
"exports": {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Format: date, what changed, why (evidence), effect on the 10-brief eval.
|
|
4
|
+
|
|
5
|
+
## 2026-10-25: v0.4.0 (flomotion 0.4.0)
|
|
6
|
+
- Setup and the person's own material: `setup_status` first; Round 0 of the interview asks how voice, word timings, sound effects and graphics will be supplied (own files first, services optional). New tools in `mcp-tools.md`: `voice_import`, `transcript_import` (with precision: word, cue, estimated), `sound_import`, `asset_import`.
|
|
7
|
+
- `references/assets.md`: where each SaaS graphic comes from (icons, logos with permission, screenshots, brand from the person's site, photos), the asset plan in the storyboard, permission rules. New tools: `asset_search`, `asset_get`, `asset_capture`, `brand_extract`.
|
|
8
|
+
- `workflow.md`: materials check at G0, asset plan at G4, asset pulling before the draft build. `sound.md`: own sound files and own transcripts.
|
|
9
|
+
- Evidence: package tests (every tool, live Iconify and Openverse, the setup wizard, skill structure). Eval on the 10 briefs: not run.
|
|
10
|
+
|
|
11
|
+
## 2026-10-24: v0.3.0 (shipped in the flomotion package)
|
|
12
|
+
- Reconciled with the real MCP: `references/mcp-tools.md` rewritten with the 30 real tools, call order, error codes; `references/checks.md` says which checks `review` computes (17) and which the agent computes or cannot run; `sound.md` uses the real sound tags and `sound_auto`.
|
|
13
|
+
- Added `references/block-recipes.md` (13 core blocks as TSX, linted by the package tests) and `references/components.md` (generated).
|
|
14
|
+
- The three looks now exist in the engine (`theme="$look.clean-light" | "dark-product" | "bold-kinetic"`), derived from `looks/*.md`; a test keeps palette, fonts and easing in sync.
|
|
15
|
+
- Live view: SKILL.md tells the person about `flomotion ui` and what it shows; the agent keeps the gate files current.
|
|
16
|
+
- Evidence: package tests (skill files, recipes lint, looks sync, installer). Eval on the 10 briefs: not run.
|
|
17
|
+
|
|
18
|
+
## 2026-10-23: v0.2.2
|
|
19
|
+
- Product name flomotion renamed to flowmotion in all files.
|
|
20
|
+
|
|
21
|
+
## 2026-10-23: v0.2.1
|
|
22
|
+
- Renamed skill to flomotion-studio.
|
|
23
|
+
|
|
24
|
+
## 2026-10-23: v0.2.0
|
|
25
|
+
- Added `references/interview.md` (9 adaptive rounds, 28 must-have fields, clarity score >= 90%, mandatory read-back) and `dataset/brief-template.md`.
|
|
26
|
+
- SKILL.md rule 0 and G0 now require the interview. Reason: user asked for an extensive, adaptive interview before any design work.
|
|
27
|
+
- Eval: not run yet.
|
|
28
|
+
|
|
29
|
+
## 2026-10-23: v0.1.0
|
|
30
|
+
- Initial package: SKILL.md, 16 references, 3 starter looks, 9 reference annotations, thresholds, eval briefs.
|
|
31
|
+
- Evidence: 8 reference ads annotated from still frames (user-collected from one compilation). No ratings or durations yet.
|
|
32
|
+
- Eval: not run yet.
|
|
33
|
+
|
|
34
|
+
## 0.4.0: Markdown only, the storyboard board, clean styles
|
|
35
|
+
|
|
36
|
+
- **No JSON in the skill.** Looks, thresholds, the reference annotations and the schemas are Markdown tables a model reads directly; the gate files are `brief.md`, `script.md`, `storyboard.md` (a project that still has the `.json` versions is read too).
|
|
37
|
+
- **The Storyboard tab:** `ideas.md` (brainstorm) and `storyboard.md` (the plan) show in the live view as a board and a timeline that turns green as scenes are built. New `references/storyboard.md`.
|
|
38
|
+
- **New references:** `clean-styles.md` (from three reference pieces: character story, glowing thread, build-as-story), `script-craft.md` (the engineered script), `transitions.md` (signature transitions with TSX: the two-dots turn, the vault door, the mascot).
|
|
39
|
+
- **Example:** `examples/flomotion-ad/`: the 30 s ad for flomotion itself, with its script, storyboard and an honest log.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# flomotion-studio skill package
|
|
2
|
+
|
|
3
|
+
A constraint layer for Claude driving the flomotion MCP (a video is one TSX file, rendered by HyperFrames). It makes output consistently professional by forcing a gated workflow, data-driven looks, reusable scene blocks, and automatic checks.
|
|
4
|
+
|
|
5
|
+
## Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
flomotion-studio/
|
|
9
|
+
SKILL.md entry point (short, procedural)
|
|
10
|
+
README.md this file
|
|
11
|
+
CHANGELOG.md record every change with its evidence
|
|
12
|
+
config/
|
|
13
|
+
thresholds.md all numeric defaults (tunable, proposals)
|
|
14
|
+
references/
|
|
15
|
+
interview.md extensive adaptive interview (G0), clarity score
|
|
16
|
+
workflow.md gates, unattended rules
|
|
17
|
+
catalogue.md analysis of the 8 reference ads
|
|
18
|
+
patterns.md 21 distilled rules
|
|
19
|
+
styles.md 7 style-family recipes
|
|
20
|
+
looks.md look token spec + 3 starter looks
|
|
21
|
+
blocks.md scene block library and parameters
|
|
22
|
+
story-templates.md 15 s / 30 s / 45 s beat sheets
|
|
23
|
+
decision-tables.md brief -> style, look, template
|
|
24
|
+
copywriting.md hooks, word limits, proof, CTA
|
|
25
|
+
motion.md easing, timing, impacts, transitions
|
|
26
|
+
typography.md type scale and emphasis
|
|
27
|
+
sound.md sound palettes and mix
|
|
28
|
+
checks.md 23 automatic checks
|
|
29
|
+
review.md review protocol and rubric
|
|
30
|
+
anti-patterns.md mistakes with before/after
|
|
31
|
+
mcp-tools.md the real tool list and call order
|
|
32
|
+
assets.md where graphics come from, the asset plan, permission rules
|
|
33
|
+
block-recipes.md TSX recipes for the 13 core blocks (linted by tests)
|
|
34
|
+
transitions.md signature transitions with TSX: slab, iris, stripes, the two-dots turn, the vault door, the mascot
|
|
35
|
+
script-craft.md the engineered script: hook, pain, turn, promise, proof, reveal, CTA
|
|
36
|
+
clean-styles.md what clean, catchy motion looks like, from three reference pieces
|
|
37
|
+
storyboard.md the Storyboard tab: ideas.md, storyboard.md, what the board shows
|
|
38
|
+
components.md generated from the schemas
|
|
39
|
+
looks/
|
|
40
|
+
clean-light.md dark-product.md bold-kinetic.md
|
|
41
|
+
dataset/
|
|
42
|
+
schema.md reference-ad annotation schema
|
|
43
|
+
brief-template.md interview output (brief) template
|
|
44
|
+
rating-sheet.md human rating template
|
|
45
|
+
annotations/*.md one file per reference ad
|
|
46
|
+
evals/
|
|
47
|
+
briefs/briefs.md 10 invented test briefs
|
|
48
|
+
README.md how to run and compare
|
|
49
|
+
examples/
|
|
50
|
+
saas-promo/ a finished 30 s project (engine look)
|
|
51
|
+
flomotion-ad/ the 30 s ad for flomotion itself: project, script, storyboard, log
|
|
52
|
+
engine-looks/ reference scenes for the engine's kinetic, minimal, sketch looks
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Install
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npx -y flomotion install skill # for all your projects: ~/.claude/skills/flomotion-studio
|
|
59
|
+
npx -y flomotion install skill --project # only this folder: ./.claude/skills/flomotion-studio
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
(`flomotion install skill` is the same command if the package is installed.) Then add the MCP server in your video folder:
|
|
63
|
+
`claude mcp add flomotion -- npx -y flomotion mcp --dir . --ui`, and open the printed address to watch progress.
|
|
64
|
+
|
|
65
|
+
Claude loads `SKILL.md` on a video request and reads references only when a step needs them.
|
|
66
|
+
|
|
67
|
+
## What is verified and what is not
|
|
68
|
+
|
|
69
|
+
- Verified: the file structure is complete and every file named in SKILL.md exists.
|
|
70
|
+
- Reconciled with the real tool list (v0.3.0): `references/mcp-tools.md` named the 30 tools the server had then (39 from v0.4.0), and `references/checks.md` says which checks `review` computes and which you compute. The three looks exist in the engine as `theme="$look.clean-light"` etc. The recipes in `references/block-recipes.md` are linted by the package's tests.
|
|
71
|
+
- Not verified: nothing here has been run in a real Claude Code session yet (see `docs/gate2-manual-checklist.md` in the package).
|
|
72
|
+
- The reference annotations come from **still frames only**. Timings, sound and exact motion are inferred or marked `null`. Fill them from your own viewing.
|
|
73
|
+
- All thresholds are starting guesses. Tune them from your ratings (see `evals/README.md`).
|
|
74
|
+
- The 3 looks are starters with original palettes. Replace after giving direction notes.
|
|
75
|
+
|
|
76
|
+
## Extending the dataset
|
|
77
|
+
|
|
78
|
+
1. Copy an annotation file, change `id`, fill the fields.
|
|
79
|
+
2. Add duration, platform and your 1 to 5 rating (`dataset/rating-sheet.md`).
|
|
80
|
+
3. Re-derive patterns: if 3 or more rated-4+ ads share a trait, add or tighten a rule in `references/patterns.md` and a check in `references/checks.md`.
|
|
81
|
+
4. Log the change in `CHANGELOG.md` with the evidence.
|