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.
Files changed (129) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/LICENSE +1 -1
  3. package/README.md +29 -20
  4. package/dist/bin.mjs +6279 -2582
  5. package/dist/chunks/{chunk-QG2MOGKO.mjs → chunk-IGG2VZB6.mjs} +178 -14
  6. package/dist/chunks/{chunk-AVP5XX4G.mjs → chunk-PEC2UVQY.mjs} +138 -108
  7. package/dist/chunks/{chunk-IUSYVGP6.mjs → chunk-TTHAZGRG.mjs} +7 -7
  8. package/dist/chunks/{chunk-JCLRAREG.mjs → chunk-XWY6CUY6.mjs} +16 -16
  9. package/dist/chunks/{lock-MLQUU7X3.mjs → lock-WGPR7CJ2.mjs} +3 -3
  10. package/dist/components.mjs +19 -13
  11. package/dist/core.mjs +12 -12
  12. package/dist/hooks.mjs +8 -12
  13. package/dist/jsx-dev-runtime.mjs +1 -1
  14. package/dist/jsx-runtime.mjs +1 -1
  15. package/docs/components/Adjustment.md +2 -2
  16. package/docs/components/Audio.md +2 -2
  17. package/docs/components/B.md +3 -3
  18. package/docs/components/Captions.md +2 -2
  19. package/docs/components/Card.md +2 -2
  20. package/docs/components/Center.md +2 -2
  21. package/docs/components/Chart.md +2 -2
  22. package/docs/components/Chip.md +2 -2
  23. package/docs/components/Circle.md +2 -2
  24. package/docs/components/Clip.md +2 -2
  25. package/docs/components/CodeBlock.md +2 -2
  26. package/docs/components/Composition.md +2 -2
  27. package/docs/components/Counter.md +2 -2
  28. package/docs/components/Cursor.md +2 -2
  29. package/docs/components/Fonts.md +2 -2
  30. package/docs/components/GlassCard.md +2 -2
  31. package/docs/components/Grid.md +2 -2
  32. package/docs/components/Group.md +2 -2
  33. package/docs/components/Highlight.md +3 -3
  34. package/docs/components/I.md +3 -3
  35. package/docs/components/Image.md +2 -2
  36. package/docs/components/Line.md +2 -2
  37. package/docs/components/Marker.md +2 -2
  38. package/docs/components/Path.md +2 -2
  39. package/docs/components/Polygon.md +2 -2
  40. package/docs/components/Precomp.md +2 -2
  41. package/docs/components/ProgressRing.md +2 -2
  42. package/docs/components/Rect.md +2 -2
  43. package/docs/components/RoundRect.md +2 -2
  44. package/docs/components/SafeArea.md +2 -2
  45. package/docs/components/Scene.md +2 -2
  46. package/docs/components/Sequence.md +2 -2
  47. package/docs/components/Span.md +3 -3
  48. package/docs/components/SplitText.md +2 -2
  49. package/docs/components/Stack.md +2 -2
  50. package/docs/components/Stagger.md +2 -2
  51. package/docs/components/Strike.md +3 -3
  52. package/docs/components/Svg.md +2 -2
  53. package/docs/components/Text.md +2 -2
  54. package/docs/components/Title.md +2 -2
  55. package/docs/components/Track.md +2 -2
  56. package/docs/components/UIMock.md +2 -2
  57. package/docs/components/Underline.md +3 -3
  58. package/docs/components/Video.md +2 -2
  59. package/docs/gate2-manual-checklist.md +10 -9
  60. package/docs/hyperframes-notes.md +20 -20
  61. package/docs/later.md +23 -16
  62. package/docs/spec.md +83 -22
  63. package/package.json +1 -2
  64. package/skills/flomotion-studio/CHANGELOG.md +39 -0
  65. package/skills/flomotion-studio/README.md +81 -0
  66. package/skills/flomotion-studio/SKILL.md +90 -0
  67. package/skills/flomotion-studio/config/thresholds.md +191 -0
  68. package/skills/flomotion-studio/dataset/annotations/ansarada.md +53 -0
  69. package/skills/flomotion-studio/dataset/annotations/canva.md +49 -0
  70. package/skills/flomotion-studio/dataset/annotations/clickup.md +60 -0
  71. package/skills/flomotion-studio/dataset/annotations/gemini-stub.md +39 -0
  72. package/skills/flomotion-studio/dataset/annotations/monday.md +51 -0
  73. package/skills/flomotion-studio/dataset/annotations/phantom.md +53 -0
  74. package/skills/flomotion-studio/dataset/annotations/slack.md +54 -0
  75. package/skills/flomotion-studio/dataset/annotations/unknown-7.md +39 -0
  76. package/skills/flomotion-studio/dataset/annotations/vaylens.md +53 -0
  77. package/skills/flomotion-studio/dataset/brief-template.md +110 -0
  78. package/skills/flomotion-studio/dataset/rating-sheet.md +28 -0
  79. package/skills/flomotion-studio/dataset/schema.md +44 -0
  80. package/skills/flomotion-studio/evals/README.md +33 -0
  81. package/skills/flomotion-studio/evals/briefs/briefs.md +25 -0
  82. package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/kinetic.scene.tsx +1 -1
  83. package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/minimal.scene.tsx +1 -1
  84. package/skills/{motion-studio/looks → flomotion-studio/examples/engine-looks}/sketch.scene.tsx +1 -1
  85. package/skills/flomotion-studio/examples/flomotion-ad/LOG.md +39 -0
  86. package/skills/flomotion-studio/examples/flomotion-ad/brief.md +41 -0
  87. package/skills/flomotion-studio/examples/flomotion-ad/ideas.md +12 -0
  88. package/skills/flomotion-studio/examples/flomotion-ad/project.tsx +1694 -0
  89. package/skills/flomotion-studio/examples/flomotion-ad/script.md +28 -0
  90. package/skills/flomotion-studio/examples/flomotion-ad/storyboard.md +93 -0
  91. package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/README.md +1 -1
  92. package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/make-assets.sh +1 -1
  93. package/skills/{motion-studio → flomotion-studio}/examples/saas-promo/project.tsx +3 -3
  94. package/skills/flomotion-studio/looks/bold-kinetic.md +122 -0
  95. package/skills/flomotion-studio/looks/clean-light.md +122 -0
  96. package/skills/flomotion-studio/looks/dark-product.md +120 -0
  97. package/skills/flomotion-studio/references/anti-patterns.md +36 -0
  98. package/skills/flomotion-studio/references/assets.md +42 -0
  99. package/skills/flomotion-studio/references/block-recipes.md +249 -0
  100. package/skills/flomotion-studio/references/blocks.md +114 -0
  101. package/skills/flomotion-studio/references/catalogue.md +53 -0
  102. package/skills/flomotion-studio/references/checks.md +87 -0
  103. package/skills/flomotion-studio/references/clean-styles.md +56 -0
  104. package/skills/{motion-studio → flomotion-studio}/references/components.md +94 -94
  105. package/skills/flomotion-studio/references/copywriting.md +64 -0
  106. package/skills/flomotion-studio/references/decision-tables.md +80 -0
  107. package/skills/flomotion-studio/references/interview.md +145 -0
  108. package/skills/flomotion-studio/references/looks.md +45 -0
  109. package/skills/flomotion-studio/references/mcp-tools.md +70 -0
  110. package/skills/flomotion-studio/references/motion.md +68 -0
  111. package/skills/flomotion-studio/references/patterns.md +45 -0
  112. package/skills/flomotion-studio/references/review.md +56 -0
  113. package/skills/flomotion-studio/references/script-craft.md +59 -0
  114. package/skills/flomotion-studio/references/sound.md +57 -0
  115. package/skills/flomotion-studio/references/story-templates.md +52 -0
  116. package/skills/flomotion-studio/references/storyboard.md +62 -0
  117. package/skills/flomotion-studio/references/styles.md +70 -0
  118. package/skills/flomotion-studio/references/transitions.md +62 -0
  119. package/skills/flomotion-studio/references/typography.md +46 -0
  120. package/skills/flomotion-studio/references/workflow.md +96 -0
  121. package/skills/motion-studio/SKILL.md +0 -87
  122. package/skills/motion-studio/looks/kinetic.json +0 -89
  123. package/skills/motion-studio/looks/minimal.json +0 -91
  124. package/skills/motion-studio/looks/sketch.json +0 -83
  125. package/skills/motion-studio/references/motion.md +0 -73
  126. package/skills/motion-studio/references/review.md +0 -32
  127. package/skills/motion-studio/references/saas-promo.md +0 -29
  128. package/skills/motion-studio/references/sound.md +0 -47
  129. 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 `motion-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.
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 CodeCut and the skill
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 …` (the npm package is `flomotion`; the command is `codecut`) instead of the path below.
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 codecut \
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/codeCut/packages/cli/dist/bin.mjs mcp --dir .
41
- node /ABSOLUTE/PATH/TO/codeCut/packages/cli/dist/bin.mjs skill install # copies the skill to ./.claude/skills/motion-studio
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 `codecut` server must be connected and list 30 tools. Run `/skills` (or ask "what skills do you have?"): `motion-studio` must be there.
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, 30 tools, skill listed. If the server is not connected, run the command after `mcp` by hand in a terminal and read its stderr.
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 `.codecut/history/index.json`, and the final MP4's duration. I will fix what broke and re-run the gate.
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 CodeCut
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 (CodeCut does).
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. CodeCut avoids this:
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
- (CodeCut does not use these in phase 1/2.)
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
- CodeCut phase 1 emits one flat `index.html` and does not use sub-compositions.
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. **CodeCut instead vendors the file**:
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 `@codecut/render` dependency.
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 CodeCut always emits its own
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
- CodeCut must do its own pre-render font gate (file exists, hash matches lock, `document.fonts.load`
77
- succeeds in headless Chrome). Implemented in `@codecut/render` (`fontGate`).
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; CodeCut uses its own
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 CodeCut `review`.)
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 | CodeCut decision |
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 | CodeCut mixes offline with FFmpeg and emits one `<audio id="mix">` |
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 CodeCut reads the
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 CodeCut's
131
- track wrappers; CodeCut ignores it (renders are correct).
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.json` in `<dir>`; with `--json` it prints `{ ok, engine, wordCount, transcriptPath, … }` or
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 CodeCut cannot rely on it. The bundled CLI compiles project TSX itself (esbuild, automatic JSX runtime
149
- from `@codecut/core`) and maps `@codecut/*` imports with a Node resolve hook.
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 | 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 `@codecut/*` in a published install | `codecut` 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 |
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
- # CodeCut spec (condensed, as implemented)
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 `cc_` id (hash of its path).
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
- `codecut mcp --dir <project>` (or `npx -y flomotion mcp`) serves 30 tools over stdio for one project folder. All
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 `cc_` 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
-
119
- Resources: `codecut://schema/{component}` (JSON schema + docs), `codecut://project/outline`, `codecut://ledger`,
120
- `codecut://looks`.
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 `.codecut/ledger.json` (peak names merge when one sound serves several tags).
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`); `codecut.json` `soundLicenses` lists the allowed families (`["CC0"]` restricts). Voice providers:
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.2.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.