@anvpx/motion 0.0.0-stage → 0.1.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 (225) hide show
  1. package/CATALOG.md +301 -0
  2. package/LICENSE +21 -0
  3. package/README.md +93 -2
  4. package/assets.json +37 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +1 -0
  7. package/dist/main.d.ts +2 -0
  8. package/dist/main.js +46 -0
  9. package/icons/LICENSE-lucide +43 -0
  10. package/icons/icons.json +2711 -0
  11. package/icons/licences.json +1521 -0
  12. package/luts/LICENSE-CC0.txt +20 -0
  13. package/luts/cool.cube +520 -0
  14. package/luts/noir.cube +520 -0
  15. package/luts/warm.cube +520 -0
  16. package/music/LICENSE-CC0.txt +32 -0
  17. package/music/bed-full.wav +0 -0
  18. package/music/bed.wav +0 -0
  19. package/package.json +69 -3
  20. package/packs/INDEX.md +22 -0
  21. package/packs/painted/checklist.md +30 -0
  22. package/packs/painted/examples/dry-ink/storyboard.json +88 -0
  23. package/packs/painted/examples/oil/storyboard.json +89 -0
  24. package/packs/painted/examples/shape-carry/storyboard.json +112 -0
  25. package/packs/painted/examples/stacked-beat/storyboard.json +106 -0
  26. package/packs/painted/examples/staged-read/storyboard.json +105 -0
  27. package/packs/painted/examples/watercolour/storyboard.json +79 -0
  28. package/packs/painted/look.md +71 -0
  29. package/packs/painted/pack.json +46 -0
  30. package/packs/painted/review.md +12 -0
  31. package/packs/painted/voice.md +30 -0
  32. package/plugins/motion-kit/.claude-plugin/plugin.json +5 -0
  33. package/plugins/motion-kit/README.md +31 -0
  34. package/plugins/motion-kit/commands/mk-draft.md +13 -0
  35. package/plugins/motion-kit/commands/mk-new.md +15 -0
  36. package/plugins/motion-kit/commands/mk-render.md +14 -0
  37. package/plugins/motion-kit/skills/motion-kit/SKILL.md +77 -0
  38. package/plugins/motion-kit/skills/motion-kit/references/authoring-scene.md +37 -0
  39. package/plugins/motion-kit/skills/motion-kit/references/authoring-style.md +17 -0
  40. package/plugins/motion-kit/skills/motion-kit/references/common-mistakes.md +73 -0
  41. package/plugins/motion-kit/skills/motion-kit/references/content-pack.md +81 -0
  42. package/plugins/motion-kit/skills/motion-kit/references/faux-ui.md +39 -0
  43. package/plugins/motion-kit/skills/motion-kit/references/free-storyboard.md +15 -0
  44. package/plugins/motion-kit/skills/motion-kit/references/intake.md +18 -0
  45. package/plugins/motion-kit/skills/motion-kit/references/knowledge-routing.md +32 -0
  46. package/plugins/motion-kit/skills/motion-kit/references/outline.md +24 -0
  47. package/plugins/motion-kit/skills/motion-kit/references/patching.md +50 -0
  48. package/plugins/motion-kit/skills/motion-kit/references/patterns.md +55 -0
  49. package/plugins/motion-kit/skills/motion-kit/references/quality-bar.md +61 -0
  50. package/plugins/motion-kit/skills/motion-kit/references/review.md +8 -0
  51. package/plugins/motion-kit/skills/motion-kit/references/scene-recipes.md +300 -0
  52. package/plugins/motion-kit/skills/motion-kit/references/setup.md +16 -0
  53. package/plugins/motion-kit/skills/motion-kit/references/slop.md +38 -0
  54. package/plugins/motion-kit/skills/motion-kit/references/storyboard-json.md +121 -0
  55. package/plugins/motion-kit/skills/motion-kit/references/troubleshooting.md +55 -0
  56. package/plugins/motion-kit/skills/motion-kit/references/voice.md +40 -0
  57. package/plugins/motion-kit/skills/motion-kit/references/worked-example.md +170 -0
  58. package/shared/themes/README.md +5 -0
  59. package/shared/themes/bold-dark.json +362 -0
  60. package/shared/themes/bold-light.json +362 -0
  61. package/shared/themes/calm-dark.json +362 -0
  62. package/shared/themes/calm-light.json +362 -0
  63. package/shared/themes/data-dark.json +360 -0
  64. package/shared/themes/data-light.json +360 -0
  65. package/shared/themes/editorial-dark.json +353 -0
  66. package/shared/themes/editorial-light.json +353 -0
  67. package/shared/themes/fjord-dark.json +124 -0
  68. package/shared/themes/fjord-light.json +124 -0
  69. package/shared/themes/playful-dark.json +362 -0
  70. package/shared/themes/playful-light.json +362 -0
  71. package/shared/themes/pop-dark.json +352 -0
  72. package/shared/themes/pop-light.json +352 -0
  73. package/shared/themes/tech-dark.json +360 -0
  74. package/shared/themes/tech-light.json +360 -0
  75. package/shared/themes/warm-dark.json +368 -0
  76. package/shared/themes/warm-light.json +368 -0
  77. package/skills/motion-kit/SKILL.md +77 -0
  78. package/skills/motion-kit/references/authoring-scene.md +37 -0
  79. package/skills/motion-kit/references/authoring-style.md +17 -0
  80. package/skills/motion-kit/references/common-mistakes.md +73 -0
  81. package/skills/motion-kit/references/content-pack.md +81 -0
  82. package/skills/motion-kit/references/faux-ui.md +39 -0
  83. package/skills/motion-kit/references/free-storyboard.md +15 -0
  84. package/skills/motion-kit/references/intake.md +18 -0
  85. package/skills/motion-kit/references/knowledge-routing.md +32 -0
  86. package/skills/motion-kit/references/outline.md +24 -0
  87. package/skills/motion-kit/references/patching.md +50 -0
  88. package/skills/motion-kit/references/patterns.md +55 -0
  89. package/skills/motion-kit/references/quality-bar.md +61 -0
  90. package/skills/motion-kit/references/review.md +8 -0
  91. package/skills/motion-kit/references/scene-recipes.md +300 -0
  92. package/skills/motion-kit/references/setup.md +16 -0
  93. package/skills/motion-kit/references/slop.md +38 -0
  94. package/skills/motion-kit/references/storyboard-json.md +121 -0
  95. package/skills/motion-kit/references/troubleshooting.md +55 -0
  96. package/skills/motion-kit/references/voice.md +40 -0
  97. package/skills/motion-kit/references/worked-example.md +170 -0
  98. package/stopwords.json +65 -0
  99. package/templates/compare/blueprints/versus.json +79 -0
  100. package/templates/compare/copy.md +18 -0
  101. package/templates/compare/pacing.json +15 -0
  102. package/templates/compare/previews/versus.png +0 -0
  103. package/templates/compare/styles/editorial.json +6 -0
  104. package/templates/compare/styles/punchy.json +6 -0
  105. package/templates/compare/styles/tidy.json +6 -0
  106. package/templates/compare/template.json +52 -0
  107. package/templates/datastory/blueprints/data-story.json +95 -0
  108. package/templates/datastory/blueprints/infographic.json +106 -0
  109. package/templates/datastory/blueprints/trend.json +93 -0
  110. package/templates/datastory/copy.md +16 -0
  111. package/templates/datastory/pacing.json +17 -0
  112. package/templates/datastory/previews/data-story.png +0 -0
  113. package/templates/datastory/previews/infographic.png +0 -0
  114. package/templates/datastory/previews/trend.png +0 -0
  115. package/templates/datastory/styles/clear.json +6 -0
  116. package/templates/datastory/styles/editorial.json +6 -0
  117. package/templates/datastory/styles/pop.json +7 -0
  118. package/templates/datastory/template.json +57 -0
  119. package/templates/event/blueprints/promo.json +71 -0
  120. package/templates/event/blueprints/save-the-date.json +61 -0
  121. package/templates/event/copy.md +16 -0
  122. package/templates/event/pacing.json +15 -0
  123. package/templates/event/previews/promo.png +0 -0
  124. package/templates/event/previews/save-the-date.png +0 -0
  125. package/templates/event/styles/bright.json +6 -0
  126. package/templates/event/styles/pop.json +6 -0
  127. package/templates/event/template.json +37 -0
  128. package/templates/explain/blueprints/architecture.json +76 -0
  129. package/templates/explain/blueprints/concept.json +89 -0
  130. package/templates/explain/blueprints/howto.json +56 -0
  131. package/templates/explain/blueprints/overview.json +126 -0
  132. package/templates/explain/copy.md +19 -0
  133. package/templates/explain/pacing.json +19 -0
  134. package/templates/explain/previews/architecture.png +0 -0
  135. package/templates/explain/previews/concept.png +0 -0
  136. package/templates/explain/previews/howto.png +0 -0
  137. package/templates/explain/previews/overview.png +0 -0
  138. package/templates/explain/styles/calm.json +6 -0
  139. package/templates/explain/styles/crisp.json +6 -0
  140. package/templates/explain/template.json +64 -0
  141. package/templates/guide/blueprints/lesson.json +173 -0
  142. package/templates/guide/blueprints/onboarding.json +80 -0
  143. package/templates/guide/blueprints/tutorial.json +102 -0
  144. package/templates/guide/copy.md +17 -0
  145. package/templates/guide/pacing.json +59 -0
  146. package/templates/guide/previews/lesson.png +0 -0
  147. package/templates/guide/previews/onboarding.png +0 -0
  148. package/templates/guide/previews/tutorial.png +0 -0
  149. package/templates/guide/styles/calm.json +15 -0
  150. package/templates/guide/styles/friendly.json +15 -0
  151. package/templates/guide/styles/techdark.json +15 -0
  152. package/templates/guide/template.json +95 -0
  153. package/templates/pitch/blueprints/feature.json +134 -0
  154. package/templates/pitch/blueprints/launch.json +173 -0
  155. package/templates/pitch/blueprints/pricing.json +141 -0
  156. package/templates/pitch/copy.md +18 -0
  157. package/templates/pitch/pacing.json +59 -0
  158. package/templates/pitch/previews/feature.png +0 -0
  159. package/templates/pitch/previews/launch.png +0 -0
  160. package/templates/pitch/previews/pricing.png +0 -0
  161. package/templates/pitch/styles/polished.json +6 -0
  162. package/templates/pitch/styles/punchy.json +6 -0
  163. package/templates/pitch/styles/teaser.json +12 -0
  164. package/templates/pitch/template.json +45 -0
  165. package/templates/recap/blueprints/news-recap.json +62 -0
  166. package/templates/recap/blueprints/timeline-story.json +94 -0
  167. package/templates/recap/copy.md +16 -0
  168. package/templates/recap/pacing.json +16 -0
  169. package/templates/recap/previews/news-recap.png +0 -0
  170. package/templates/recap/previews/timeline-story.png +0 -0
  171. package/templates/recap/styles/editorial.json +6 -0
  172. package/templates/recap/styles/editorialdark.json +6 -0
  173. package/templates/recap/template.json +50 -0
  174. package/templates/report/blueprints/kpi-review.json +116 -0
  175. package/templates/report/blueprints/status.json +78 -0
  176. package/templates/report/copy.md +17 -0
  177. package/templates/report/pacing.json +16 -0
  178. package/templates/report/previews/kpi-review.png +0 -0
  179. package/templates/report/previews/status.png +0 -0
  180. package/templates/report/styles/exec.json +6 -0
  181. package/templates/report/styles/memo.json +6 -0
  182. package/templates/report/styles/walkthrough.json +6 -0
  183. package/templates/report/template.json +56 -0
  184. package/templates/social/blueprints/announce.json +109 -0
  185. package/templates/social/blueprints/listicle.json +117 -0
  186. package/templates/social/blueprints/tip.json +114 -0
  187. package/templates/social/copy.md +18 -0
  188. package/templates/social/pacing.json +49 -0
  189. package/templates/social/previews/announce.png +0 -0
  190. package/templates/social/previews/listicle.png +0 -0
  191. package/templates/social/previews/tip.png +0 -0
  192. package/templates/social/styles/captioned.json +18 -0
  193. package/templates/social/styles/hook-first.json +15 -0
  194. package/templates/social/styles/techcut.json +15 -0
  195. package/templates/social/template.json +94 -0
  196. package/templates/update/blueprints/announcement.json +57 -0
  197. package/templates/update/blueprints/changelog.json +157 -0
  198. package/templates/update/blueprints/release-notes.json +151 -0
  199. package/templates/update/blueprints/weekly-update.json +88 -0
  200. package/templates/update/copy.md +17 -0
  201. package/templates/update/pacing.json +64 -0
  202. package/templates/update/previews/announcement.png +0 -0
  203. package/templates/update/previews/changelog.png +0 -0
  204. package/templates/update/previews/release-notes.png +0 -0
  205. package/templates/update/previews/weekly-update.png +0 -0
  206. package/templates/update/styles/punchy.json +15 -0
  207. package/templates/update/styles/techdark.json +6 -0
  208. package/templates/update/styles/tidy.json +6 -0
  209. package/templates/update/template.json +67 -0
  210. package/templates/vista/blueprints/spotlight.json +68 -0
  211. package/templates/vista/blueprints/tour.json +84 -0
  212. package/templates/vista/copy.md +18 -0
  213. package/templates/vista/pacing.json +14 -0
  214. package/templates/vista/previews/spotlight.png +0 -0
  215. package/templates/vista/previews/tour.png +0 -0
  216. package/templates/vista/styles/bright.json +6 -0
  217. package/templates/vista/styles/cinematic.json +6 -0
  218. package/templates/vista/template.json +42 -0
  219. package/templates/walkthrough/blueprints/product-tour.json +107 -0
  220. package/templates/walkthrough/copy.md +16 -0
  221. package/templates/walkthrough/pacing.json +16 -0
  222. package/templates/walkthrough/previews/product-tour.png +0 -0
  223. package/templates/walkthrough/styles/calm.json +6 -0
  224. package/templates/walkthrough/styles/deep.json +6 -0
  225. package/templates/walkthrough/template.json +37 -0
package/CATALOG.md ADDED
@@ -0,0 +1,301 @@
1
+ # Catalog
2
+
3
+ Generated by `mk catalog --write` from the scene registry; do not edit. Read the index, then `mk catalog <type>` for one scene. `*` marks a required field.
4
+
5
+ ## Index
6
+
7
+ ```
8
+ type | layer | purpose | required
9
+ title | base | Opening or section title card with optional kicker and subtitle. | title
10
+ hero | base | Landing-page hero: kicker, big headline with [x] accents, subline and up to 4 glass tiles; bento or centered. | title
11
+ poster | base | Type-led statement: 1-3 oversized lines with [x] accents, optional kicker and foot; outline draws the last line as outline type and accent words keep their gradient fill. | lines
12
+ bullets | base | Short list of 1-6 points with an optional heading. | items
13
+ stat | base | One hero number with label, unit, delta and context; counts up. | value,label
14
+ flow | base | Node-and-arrow diagram (2-8 nodes) laid out left-right or top-bottom. | nodes,edges
15
+ outro | base | Closing card with title, up to 3 lines and up to 4 credits. | title
16
+ lower-third | overlay | Name plate with optional title at the lower edge. | name
17
+ bug | overlay | Corner word mark or ledger image; give exactly one of text or image. | -
18
+ progress | overlay | Thin progress bar over the scene or the whole timeline. | -
19
+ countdown | overlay | Integer count between from and to, one step per equal slice of the duration. | from,to
20
+ chapter | overlay | Numbered chapter chip in a corner. | number,label
21
+ caption | overlay | Voice word timings as karaoke captions; falls back to a full-text card. | -
22
+ compare | base | Two options side by side or wiped before/after, 1-5 points each; the winner is marked by icon and text. | left,right
23
+ callout | base | One formula, rule, definition, warning or tip made big; [x] marks accent terms, revealed term by term. | text
24
+ quote | base | Testimonial or quotation with attribution, optional 1-5 star rating and avatar. | quote,name
25
+ icon-grid | base | Features, benefits or categories as 2-8 icon cards with a short label and optional detail. | items
26
+ steps | base | Ordered progression of 2-6 steps: a process path, or ascending ladder/stairs tiers with value labels (pricing, levels). | steps
27
+ timeline | base | Dated milestones, history or a now/next roadmap: 2-7 items on a horizontal or vertical axis with done/now/next states. | items
28
+ media-frame | base | Screenshot or photo, bare or in a browser, phone or laptop frame, with optional title, caption and numbered callout dots. | image
29
+ kinetic | base | One word or short phrase per beat at full screen (slam, stack or swap); for hooks, rules of three and key messages. | words
30
+ code | base | Code or terminal text typed or revealed line by line, with highlighted lines and +/- diff lines. | lines
31
+ kpi-grid | base | 2-6 headline numbers side by side, each with label, unit, change and trend arrow (good=down when a fall is good); values count up. | items
32
+ chart | base | Animated bar, line or donut chart for ranking, trend or share, with values shown and an optional highlight. | kind
33
+ table | base | Small data table or ranked list (2-5 columns, 2-8 rows) with row-by-row reveal and one optional highlighted row. | columns,rows
34
+ scene3d | base | WebGL diorama (vendored three.js): post, light, material, environment presets; flat 2D canvas fallback without WebGL. 3D output is machine+GPU stable, not portable. | -
35
+ sticker | base | Pop-comic sticker slam: 1-5 short phrases slam in with outline type, tilt and a starburst; for hooks, myth-vs-fact and punchy shorts. | words
36
+ waveform | base | Audio waveform from precomputed peaks: bars rise as the playhead sweeps; for voice agents, podcasts and narrated reports. Peaks are storyboard data, never decoded audio. | peaks
37
+ Detail: `mk catalog <type>`. Props are strict; unlisted keys are rejected.
38
+ ```
39
+
40
+ ## Scenes
41
+
42
+ ```
43
+ title (base): Opening or section title card with optional kicker and subtitle.
44
+ title * text
45
+ subtitle text
46
+ kicker text
47
+ props: {"title":"Hello"}
48
+ ```
49
+
50
+ ```
51
+ hero (base): Landing-page hero: kicker, big headline with [x] accents, subline and up to 4 glass tiles; bento or centered.
52
+ title * text<=70
53
+ subtitle text<=120
54
+ kicker text<=28
55
+ tiles {value,label,detail}[..4]
56
+ layout bento|center = "bento"
57
+ props: {"title":"Design at the [speed] of thought","layout":"bento"}
58
+ ```
59
+
60
+ ```
61
+ poster (base): Type-led statement: 1-3 oversized lines with [x] accents, optional kicker and foot; outline draws the last line as outline type and accent words keep their gradient fill.
62
+ lines * text<=38[1..3]
63
+ kicker text<=28
64
+ foot text<=60
65
+ align left|center = "left"
66
+ outline boolean = false
67
+ props: {"lines":["Make it","move"],"outline":true}
68
+ ```
69
+
70
+ ```
71
+ bullets (base): Short list of 1-6 points with an optional heading.
72
+ title text
73
+ items * text[1..6]
74
+ marker dot|check|cross|number
75
+ props: {"items":["One","Two"]}
76
+ ```
77
+
78
+ ```
79
+ stat (base): One hero number with label, unit, delta and context; counts up.
80
+ value * text|number
81
+ label * text
82
+ unit text
83
+ delta text
84
+ context text
85
+ props: {"value":42,"label":"Users"}
86
+ ```
87
+
88
+ ```
89
+ flow (base): Node-and-arrow diagram (2-8 nodes) laid out left-right or top-bottom.
90
+ nodes * {id,label}[2..8]
91
+ edges * {from,to,label}[]
92
+ direction lr|tb = "lr"
93
+ props: {"nodes":[{"id":"a","label":"A"},{"id":"b","label":"B"}],"edges":[{"from":"a","to":"b"}]}
94
+ ```
95
+
96
+ ```
97
+ outro (base): Closing card with title, up to 3 lines and up to 4 credits.
98
+ title * text
99
+ lines text[..3]
100
+ credits text[..4]
101
+ props: {"title":"Thanks"}
102
+ ```
103
+
104
+ ```
105
+ lower-third (overlay): Name plate with optional title at the lower edge.
106
+ name * text
107
+ title text
108
+ align left|right = "left"
109
+ props: {"name":"Ada Lovelace"}
110
+ ```
111
+
112
+ ```
113
+ bug (overlay): Corner word mark or ledger image; give exactly one of text or image.
114
+ text text<=32
115
+ image text
116
+ position top-left|top-right|bottom-left|bottom-right = "top-right"
117
+ opacity subtle|medium|full = "medium"
118
+ props: {"text":"ACME"}
119
+ ```
120
+
121
+ ```
122
+ progress (overlay): Thin progress bar over the scene or the whole timeline.
123
+ scope scene|timeline = "scene"
124
+ color accent|accent2 = "accent"
125
+ label text
126
+ props: {}
127
+ ```
128
+
129
+ ```
130
+ countdown (overlay): Integer count between from and to, one step per equal slice of the duration.
131
+ from * int 0..999
132
+ to * int 0..999
133
+ label text
134
+ position top-left|top-right|bottom-left|bottom-right|center = "center"
135
+ props: {"from":3,"to":1}
136
+ ```
137
+
138
+ ```
139
+ chapter (overlay): Numbered chapter chip in a corner.
140
+ number * int 0..99
141
+ label * text
142
+ position top-left|top-right|bottom-left|bottom-right = "top-left"
143
+ props: {"number":1,"label":"Intro"}
144
+ ```
145
+
146
+ ```
147
+ caption (overlay): Voice word timings as karaoke captions; falls back to a full-text card.
148
+ text text<=140
149
+ words {w,start,end}[1..40]
150
+ props: {"words":[{"w":"Hello","start":0,"end":0.4},{"w":"world","start":0.4,"end":0.9}]}
151
+ ```
152
+
153
+ ```
154
+ compare (base): Two options side by side or wiped before/after, 1-5 points each; the winner is marked by icon and text.
155
+ title text<=60
156
+ left * {label,points,value,tag}
157
+ right * {label,points,value,tag}
158
+ mode split|wipe = "split"
159
+ verdict text<=80
160
+ winner left|right
161
+ winnerLabel text<=20 = "Winner"
162
+ props: {"left":{"label":"Before","points":["Manual"]},"right":{"label":"After","points":["Automated"]},"winner":"right"}
163
+ ```
164
+
165
+ ```
166
+ callout (base): One formula, rule, definition, warning or tip made big; [x] marks accent terms, revealed term by term.
167
+ text * text<=120
168
+ kind formula|statement|definition|warning|tip = "statement"
169
+ label text<=30
170
+ note text<=80
171
+ props: {"text":"[Profit] = [Revenue] − [Costs]","kind":"formula"}
172
+ ```
173
+
174
+ ```
175
+ quote (base): Testimonial or quotation with attribution, optional 1-5 star rating and avatar.
176
+ quote * text<=200
177
+ name * text<=40
178
+ role text<=40
179
+ org text<=40
180
+ rating int 1..5
181
+ image text
182
+ props: {"quote":"Simple and fast.","name":"Alex Kim","rating":5}
183
+ ```
184
+
185
+ ```
186
+ icon-grid (base): Features, benefits or categories as 2-8 icon cards with a short label and optional detail.
187
+ title text
188
+ items* {icon,label,detail}[2..8]
189
+ cols int 2..4
190
+ icons: `mk icon search <query>` | `mk icon list [--tag group]` (names only)
191
+ props: {"title":"Why teams switch","items":[{"icon":"zap","label":"Fast setup","detail":"Live in a day"},{"icon":"shield","label":"Secure by default"},{"icon":"globe","label":"Works worldwide"}]}
192
+ ```
193
+
194
+ ```
195
+ steps (base): Ordered progression of 2-6 steps: a process path, or ascending ladder/stairs tiers with value labels (pricing, levels).
196
+ title text
197
+ steps * {label,value,detail}[2..6]
198
+ layout path|ladder|stairs = "path"
199
+ active int 1..9007199254740991
200
+ props: {"title":"Plans","layout":"ladder","steps":[{"label":"Starter","value":"$0"},{"label":"Team","value":"$29"},{"label":"Scale","value":"$99"}]}
201
+ ```
202
+
203
+ ```
204
+ timeline (base): Dated milestones, history or a now/next roadmap: 2-7 items on a horizontal or vertical axis with done/now/next states.
205
+ title text
206
+ items * {when,label,detail,state}[2..7]
207
+ orient h|v = "h"
208
+ props: {"title":"Roadmap","items":[{"when":"Q1","label":"Beta","state":"done"},{"when":"Q2","label":"Launch","state":"now"},{"when":"Q3","label":"Scale","state":"next"}]}
209
+ ```
210
+
211
+ ```
212
+ media-frame (base): Screenshot or photo, bare or in a browser, phone or laptop frame, with optional title, caption and numbered callout dots.
213
+ image * text
214
+ device none|browser|phone|laptop = "browser"
215
+ layout full|left|right = "full"
216
+ title text<=60
217
+ caption text<=140
218
+ motion none|kenburns|tilt = "kenburns"
219
+ callouts {x,y,label}[..3]
220
+ props: {"image":"screenshot.png","device":"browser","callouts":[{"x":30,"y":40,"label":"Start here"}]}
221
+ ```
222
+
223
+ ```
224
+ kinetic (base): One word or short phrase per beat at full screen (slam, stack or swap); for hooks, rules of three and key messages.
225
+ words * text<=18[1..8]
226
+ mode slam|stack|swap = "slam"
227
+ emphasis int 1..8
228
+ props: {"words":["Plan","Build","Ship"],"mode":"slam","emphasis":3}
229
+ ```
230
+
231
+ ```
232
+ code (base): Code or terminal text typed or revealed line by line, with highlighted lines and +/- diff lines.
233
+ lines * text<=60[1..14]
234
+ lang js|ts|json|py|sh|plain = "plain"
235
+ reveal type|lines = "lines"
236
+ highlight int 1..9007199254740991[..14]
237
+ file text<=40
238
+ props: {"lines":["const total = price * 2","- old line","+ new line"],"lang":"js"}
239
+ ```
240
+
241
+ ```
242
+ kpi-grid (base): 2-6 headline numbers side by side, each with label, unit, change and trend arrow (good=down when a fall is good); values count up.
243
+ title text
244
+ items* {value,label,unit,delta,trend,good}[2..6]
245
+ cols int 2..3
246
+ props: {"title":"Quarter at a glance","items":[{"value":"$4.2M","label":"Revenue","delta":"+12%","trend":"up"},{"value":86,"unit":"%","label":"Retention","delta":"-2 pts","trend":"down"}]}
247
+ ```
248
+
249
+ ```
250
+ chart (base): Animated bar, line or donut chart for ranking, trend or share, with values shown and an optional highlight.
251
+ kind * bar|line|donut
252
+ title text
253
+ unit text
254
+ showValues boolean = true
255
+ caption text
256
+ data {label,value}[2..8]
257
+ sort none|asc|desc
258
+ highlight int 0..9007199254740991
259
+ orient h|v
260
+ x text<=12[2..12]
261
+ series {name,values}[1..3]
262
+ trend {name,values}[1..3]
263
+ props: {"kind":"bar","title":"Signups by channel","data":[{"label":"Search","value":420},{"label":"Referral","value":310},{"label":"Social","value":190}],"highlight":0}
264
+ ```
265
+
266
+ ```
267
+ table (base): Small data table or ranked list (2-5 columns, 2-8 rows) with row-by-row reveal and one optional highlighted row.
268
+ title text
269
+ columns * text<=32[2..5]
270
+ rows * text<=40|number[][2..8]
271
+ rank boolean
272
+ highlight int 0..9007199254740991
273
+ align l|r[..5]
274
+ props: {"title":"Top regions","columns":["Region","Revenue"],"rows":[["North","$4.2M"],["South","$3.1M"]],"rank":true,"highlight":0}
275
+ ```
276
+
277
+ ```
278
+ scene3d (base): WebGL diorama (vendored three.js): post, light, material, environment presets; flat 2D canvas fallback without WebGL. 3D output is machine+GPU stable, not portable.
279
+ title text<=60
280
+ caption text<=140
281
+ model text
282
+ post clean|bloom|cinematic|vintage = "cinematic"
283
+ light studio|sunset|night|soft = "studio"
284
+ material clay|gloss|metal|emissive = "clay"
285
+ hdri neutral|studio|sunset|night = "neutral"
286
+ props: {"title":"Orbit"}
287
+ ```
288
+
289
+ ```
290
+ sticker (base): Pop-comic sticker slam: 1-5 short phrases slam in with outline type, tilt and a starburst; for hooks, myth-vs-fact and punchy shorts.
291
+ words* text<=16[1..5]
292
+ burst boolean = true
293
+ props: {"words":["Myth","Busted"],"burst":true}
294
+ ```
295
+
296
+ ```
297
+ waveform (base): Audio waveform from precomputed peaks: bars rise as the playhead sweeps; for voice agents, podcasts and narrated reports. Peaks are storyboard data, never decoded audio.
298
+ peaks* number 0..1[16..128]
299
+ label text<=40
300
+ props: {"peaks":[0.2,0.4,0.6,0.8,0.6,0.4,0.3,0.5,0.7,0.9,0.7,0.5,0.4,0.3,0.2,0.1],"label":"Intro"}
301
+ ```
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 anvpx
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,94 @@
1
- # Temporary Holding Version
1
+ # motion-kit
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Storyboard JSON in, animated video out.** motion-kit turns a small, validated document into an explainer, infographic or social clip and renders it locally with HyperFrames. Free and open source: no metering, no watermark, no account, no cloud.
4
+
5
+ ```
6
+ brief ──► storyboard.json ──► validate ──► preview ──► approve ──► render --gated
7
+ (small, diffable) (schema+lint) (contact sheet, stills, clip)
8
+ ```
9
+
10
+ ## Why it is different
11
+
12
+ - **The artifact is a document, not a program.** A storyboard is diffable, reviewable and patchable JSON, roughly 100–200 tokens per scene. Any LLM can write it; no React, no timeline code, no model output compiled into your video.
13
+ - **Deterministic by construction.** Every scene is a pure function of time (`seek(t)`): no frame-rate clock, no unseeded randomness. Same-machine drafts are byte-identical.
14
+ - **A real approval gate.** `mk preview` writes a review pack, `mk approve` records the user's yes, and `mk render --gated` refuses with exit 4 until the recorded approval matches the current inputs. Any edit re-arms it.
15
+ - **Local and offline.** Rendering, linting, contact sheets and voice run on your machine. Confidential decks stay on disk.
16
+
17
+ ## Requirements
18
+
19
+ - Node.js **>= 22**
20
+ - **ffmpeg** and **ffprobe** >= 6 on `PATH`
21
+ - Chrome for HyperFrames: `mk doctor` reports it; the first render downloads `chrome-headless-shell` if it is missing
22
+
23
+ Optional voice needs Python 3.12 plus Kokoro/faster-whisper; `mk doctor` tells you what is missing. The engine itself needs no Python.
24
+
25
+ ## Quickstart
26
+
27
+ ```sh
28
+ npx -y @anvpx/motion@0.1.0 doctor
29
+
30
+ # Optional: make the rest shorter
31
+ alias mk="npx -y @anvpx/motion@0.1.0" # bash/zsh
32
+ function mk { npx -y @anvpx/motion@0.1.0 @args } # PowerShell
33
+
34
+ mk template list --for "how our pricing works"
35
+ mk new explain/architecture --demo --out storyboard.json # --demo = example copy; --set k=v for yours
36
+ mk validate storyboard.json
37
+ mk preview storyboard.json
38
+ mk approve storyboard.json --note "looks right" # only after the user said yes
39
+ mk render storyboard.json --gated --verify
40
+ ```
41
+
42
+ `mk preview` writes `out/<name>.preview/`: `contact.png` (show this first), `stills/`, `clip.mp4` and `preview.json`. `mk render` writes a delivery-quality H.264 MP4 as `<out>/final.mp4`.
43
+
44
+ ## What you get
45
+
46
+ - **28 scene types** — title, bullets, stat, flow, chart, compare, timeline, code, scene3d and more. `mk catalog` lists them; `mk catalog <type>` shows the props.
47
+ - **12 templates and 30 blueprints** — `mk template list --for "<brief>"` ranks blueprints; `mk template show <template>/<blueprint>` explains one.
48
+ - **Shared themes** — light/dark families projected from DTCG tokens, plus user themes and vendored assets with a licence ledger.
49
+ - **Edits as verbs** — `mk patch` (atomic JSON Patch), `mk scene add|remove|move`, `mk fit --seconds N`.
50
+ - **Review without rendering** — `mk still --at 1,5,9`, `mk compare a.json b.json --at N`, `mk contact out/final.mp4`.
51
+ - **A static player** — `mk publish storyboard.json [--serve]` writes a 16:9 page that plays the same timeline in a browser.
52
+ - **Delivery formats** — H.264 MP4 by default; `--format webm|mov|gif|png-sequence` converts the master, and `--resolution 4k` renders at 4K (alpha and HDR are not produced).
53
+ - **Captions in and out** — `mk captions <voice-manifest> --storyboard <s> --out ops.json` builds karaoke overlays; `--srt`/`--vtt` export captions, and `--from-srt`/`--from-vtt` import them.
54
+ - **Asset intake** — `mk assets import <file...> --dir assets --licence <id> --source-url <url>` copies, hashes and records a ledger row.
55
+ - **Delivery checks** — `mk verify` re-probes streams, frame count and loudness (`--loudness`), and detects black/frozen spans (`--events`).
56
+
57
+ ## How authoring works
58
+
59
+ An agent picks the cheapest route that fits the brief: a template-assembled storyboard, a direct storyboard, or an authored custom scene when the catalog genuinely lacks the shot. The protocol lives in the skill (`skills/motion-kit/SKILL.md`) and in `docs/AGENT-WORKFLOW.md`. Users never write storyboards; the agent designs, shows a preview, and renders only after an explicit yes.
60
+
61
+ Claude Code users can install the bundled plugin with `mk plugin install`.
62
+
63
+ ## The approval gate
64
+
65
+ ```
66
+ mk preview → user reviews contact.png / stills / clip → mk approve → mk render --gated --verify
67
+ ```
68
+
69
+ `mk render --gated` exits **4** (`AWAITING_APPROVAL`) when the storyboard, its themes, referenced assets, asset ledger or audio inputs changed after the approval. `mk verify` exits **5** on a failed QA check. Approval is a sidecar file in `.mk/<name>/approval.json`; it is never a storyboard field.
70
+
71
+ ## Limits (honest version)
72
+
73
+ - No GUI, editor or scrubbing player. The review surface is the preview pack plus `mk publish`.
74
+ - Delivery is opaque video: MP4 by default, or WebM/MOV/GIF/PNG-sequence conversions of the master. No alpha channel and no HDR path.
75
+ - Captions are generated from voice word timings or imported SRT/VTT; word-level karaoke needs a voice manifest.
76
+ - Voice is optional and needs a Python 3.12 environment; it is not reachable from `npx` alone.
77
+ - Determinism is proven on the same machine. Cross-machine or cross-GPU pixel equality is not claimed.
78
+ - Pre-1.0: HyperFrames 0.8.212 and the single storyboard schema are pinned; the scene vocabulary can still change.
79
+
80
+ ## Development (from source)
81
+
82
+ ```sh
83
+ pnpm install
84
+ pnpm build # tsc -b plus staged runtime assets
85
+ pnpm check # typecheck + lint
86
+ pnpm test # unit tests
87
+ pnpm test:integration # needs Chrome
88
+ ```
89
+
90
+ Run the CLI from source with `node packages/cli/dist/main.js <command>`. Design and contracts: `PLAN.md`, `CONSTITUTION.md`; usage guide: `docs/GUIDE.md`; agent instructions: `AGENTS.md`; current work and acceptance: `docs/BEST-IN-CLASS-IMPLEMENTATION.md`.
91
+
92
+ ## Licence
93
+
94
+ MIT — see `LICENSE`. Vendored assets keep their own licences: Lucide icons (ISC), Fontsource fonts (OFL-1.1), LUTs and music beds (CC0-1.0), three.js (MIT); every shipped file has a row in the asset ledger, and `docs/LICENCE-AUDIT.md` records the audit. HyperFrames is Apache-2.0 and is a runtime dependency.
package/assets.json ADDED
@@ -0,0 +1,37 @@
1
+ [
2
+ {
3
+ "path": "luts/cool.cube",
4
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/luts/cool.cube",
5
+ "licence": "CC0-1.0",
6
+ "attribution": "motion-kit (original procedural LUT, CC0-1.0 public domain dedication; see luts/LICENSE-CC0.txt)",
7
+ "sha256": "4a526a94252483fb3c45923c447641ea5641547d100900abb4aefb4de6ef5e53"
8
+ },
9
+ {
10
+ "path": "luts/noir.cube",
11
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/luts/noir.cube",
12
+ "licence": "CC0-1.0",
13
+ "attribution": "motion-kit (original procedural LUT, CC0-1.0 public domain dedication; see luts/LICENSE-CC0.txt)",
14
+ "sha256": "c310820344d9ef2a09a5fb3678088cc2a8a44ea16527e306526161856312fe82"
15
+ },
16
+ {
17
+ "path": "luts/warm.cube",
18
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/luts/warm.cube",
19
+ "licence": "CC0-1.0",
20
+ "attribution": "motion-kit (original procedural LUT, CC0-1.0 public domain dedication; see luts/LICENSE-CC0.txt)",
21
+ "sha256": "2702600f848a77f54f787361f848f4e1d2d432a0db8e82d5e1035008c6e7618c"
22
+ },
23
+ {
24
+ "path": "music/bed.wav",
25
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/music/bed.wav",
26
+ "licence": "CC0-1.0",
27
+ "attribution": "motion-kit (original procedural silence bed, CC0-1.0 public domain dedication; see music/LICENSE-CC0.txt)",
28
+ "sha256": "e5ea01a23fcb85fd8e608c5c672ea5c22dfab6b0e581d782242f478e4b1c5900"
29
+ },
30
+ {
31
+ "path": "music/bed-full.wav",
32
+ "sourceUrl": "https://github.com/motion-kit/motion-kit/blob/main/packages/assets/music/bed-full.wav",
33
+ "licence": "CC0-1.0",
34
+ "attribution": "motion-kit (original procedural audible bed, CC0-1.0 public domain dedication; see music/LICENSE-CC0.txt)",
35
+ "sha256": "51a5977617fccbaec6c2dcfd6449757aa48a7c92f01dda354d9263321a6cc9b1"
36
+ }
37
+ ]
@@ -0,0 +1 @@
1
+ export * from "@anvpx/motion-cli";
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "@anvpx/motion-cli";
package/dist/main.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
3
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
4
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
5
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
6
+ });
7
+ }
8
+ return path;
9
+ };
10
+ import { existsSync, readFileSync } from "node:fs";
11
+ import { createRequire } from "node:module";
12
+ import { dirname, resolve } from "node:path";
13
+ import { fileURLToPath, pathToFileURL } from "node:url";
14
+ /**
15
+ * Runs the mk bin declared by `@anvpx/motion-cli` so the entry point stays
16
+ * single-sourced. Published `@anvpx/motion` installs lack the workspace
17
+ * checkout, so the installed package is preferred and workspace-relative or
18
+ * staged copies are fallbacks (each verified with `existsSync`).
19
+ */
20
+ const resolveCliBinUrl = () => {
21
+ const searched = [];
22
+ try {
23
+ const cliPkgPath = createRequire(import.meta.url).resolve("@anvpx/motion-cli/package.json");
24
+ const cliPkg = JSON.parse(readFileSync(cliPkgPath, "utf8"));
25
+ const bin = typeof cliPkg.bin === "string" ? cliPkg.bin : cliPkg.bin?.mk;
26
+ if (bin !== undefined) {
27
+ const abs = resolve(dirname(cliPkgPath), bin);
28
+ if (existsSync(abs))
29
+ return pathToFileURL(abs).href;
30
+ searched.push(abs);
31
+ }
32
+ }
33
+ catch {
34
+ /* fall through to workspace-relative and staged fallbacks */
35
+ }
36
+ for (const candidate of [
37
+ fileURLToPath(new URL("../../cli/dist/main.js", import.meta.url)),
38
+ fileURLToPath(new URL("./cli/main.js", import.meta.url)),
39
+ ]) {
40
+ if (existsSync(candidate))
41
+ return pathToFileURL(candidate).href;
42
+ searched.push(candidate);
43
+ }
44
+ throw new Error(`Cannot locate @anvpx/motion-cli (fixable: reinstall @anvpx/motion with its dependencies). Searched: ${searched.join(", ") || "(none)"}`);
45
+ };
46
+ await import(__rewriteRelativeImportExtension(resolveCliBinUrl()));
@@ -0,0 +1,43 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026 Lucide Icons and Contributors
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
+
17
+ ---
18
+
19
+ The following Lucide icons are derived from the Feather project:
20
+
21
+ airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
22
+
23
+ The MIT License (MIT) (for the icons listed above)
24
+
25
+ Copyright (c) 2013-present Cole Bemis
26
+
27
+ Permission is hereby granted, free of charge, to any person obtaining a copy
28
+ of this software and associated documentation files (the "Software"), to deal
29
+ in the Software without restriction, including without limitation the rights
30
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31
+ copies of the Software, and to permit persons to whom the Software is
32
+ furnished to do so, subject to the following conditions:
33
+
34
+ The above copyright notice and this permission notice shall be included in all
35
+ copies or substantial portions of the Software.
36
+
37
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43
+ SOFTWARE.