@olegkoval/agent-skills 1.60.0 → 1.61.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 (216) hide show
  1. package/.github/copilot-instructions.md +2 -0
  2. package/.github/prompts/carousel-maker.prompt.md +102 -0
  3. package/.github/prompts/shorts-animator.prompt.md +103 -0
  4. package/.kiro/steering/carousel-maker.md +101 -0
  5. package/.kiro/steering/shorts-animator.md +102 -0
  6. package/.windsurf/rules/carousel-maker.md +100 -0
  7. package/.windsurf/rules/shorts-animator.md +101 -0
  8. package/README.md +4 -2
  9. package/adapters/claude/olko-creative/skills/carousel-maker/SKILL.md +112 -0
  10. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  11. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  12. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  13. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  14. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  15. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  16. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  17. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  18. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  19. package/adapters/claude/olko-creative/skills/shorts-animator/SKILL.md +113 -0
  20. package/adapters/claude/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  21. package/adapters/claude/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  22. package/adapters/claude/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  23. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  24. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  25. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  26. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  27. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  28. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  29. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  30. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  31. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  32. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  33. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  34. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  35. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  36. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  37. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  38. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  39. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  40. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  41. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  42. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  43. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  44. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  45. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  46. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  47. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  48. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  49. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  50. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  51. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  52. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  53. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  54. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  55. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  56. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  57. package/adapters/codex/olko-creative/README.md +2 -0
  58. package/adapters/cursor/olko-creative/skills/carousel-maker/SKILL.md +112 -0
  59. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  60. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  61. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  62. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  63. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  64. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  65. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  66. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  67. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  68. package/adapters/cursor/olko-creative/skills/shorts-animator/SKILL.md +113 -0
  69. package/adapters/cursor/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  70. package/adapters/cursor/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  71. package/adapters/cursor/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  72. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  73. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  74. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  75. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  76. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  77. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  78. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  79. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  80. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  81. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  82. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  83. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  84. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  85. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  86. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  87. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  88. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  89. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  90. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  91. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  92. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  93. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  94. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  95. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  96. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  97. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  98. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  99. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  100. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  101. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  102. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  103. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  104. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  105. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  106. package/adapters/grok/olko-creative/skills/carousel-maker/SKILL.md +112 -0
  107. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  108. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  109. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  110. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  111. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  112. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  113. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  114. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  115. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  116. package/adapters/grok/olko-creative/skills/shorts-animator/SKILL.md +113 -0
  117. package/adapters/grok/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  118. package/adapters/grok/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  119. package/adapters/grok/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  120. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  121. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  122. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  123. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  124. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  125. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  126. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  127. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  128. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  129. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  130. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  131. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  132. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  133. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  134. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  135. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  136. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  137. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  138. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  139. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  140. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  141. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  142. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  143. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  144. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  145. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  146. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  147. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  148. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  149. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  150. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  151. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  152. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  153. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  154. package/adapters/hermes/olko-creative/README.md +2 -0
  155. package/catalog/skills.json +46 -0
  156. package/package.json +1 -1
  157. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  158. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  159. package/plugins/olko-creative/skills/carousel-maker/SKILL.md +111 -0
  160. package/plugins/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  161. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  162. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  163. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  164. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  165. package/plugins/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  166. package/plugins/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  167. package/plugins/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  168. package/plugins/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  169. package/plugins/olko-creative/skills/shorts-animator/SKILL.md +112 -0
  170. package/plugins/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  171. package/plugins/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  172. package/plugins/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  173. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  174. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  175. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  176. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  177. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  178. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  179. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  180. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  181. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  182. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  183. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  184. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  185. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  186. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  187. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  188. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  189. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  190. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  191. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  192. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  193. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  194. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  195. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  196. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  197. package/plugins/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  198. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  199. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  200. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  201. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  202. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  203. package/plugins/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  204. package/plugins/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  205. package/plugins/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  206. package/plugins/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  207. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  208. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  209. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  210. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  211. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  212. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  213. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  214. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  215. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
  216. package/scripts/lib/catalog.mjs +2 -1
@@ -60,6 +60,8 @@ Available reusable prompt files:
60
60
  - music-to-plex: .github/prompts/music-to-plex.prompt.md
61
61
  - vinted-listing: .github/prompts/vinted-listing.prompt.md
62
62
  - wikipedia-uk-editor: .github/prompts/wikipedia-uk-editor.prompt.md
63
+ - shorts-animator: .github/prompts/shorts-animator.prompt.md
64
+ - carousel-maker: .github/prompts/carousel-maker.prompt.md
63
65
  - cloudflare-block-countries: .github/prompts/cloudflare-block-countries.prompt.md
64
66
  - search-console-indexing-audit: .github/prompts/search-console-indexing-audit.prompt.md
65
67
  - docs-index-keeper: .github/prompts/docs-index-keeper.prompt.md
@@ -0,0 +1,102 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Make Instagram or LinkedIn carousel slides from a topic or pasted copy: a brand template sets the text, and a reusable library of hand-drawn illustrations, drawn once in code per brand, supplies the pictures."
5
+ ---
6
+
7
+ Use the olko:carousel-maker skill.
8
+
9
+ # Carousel Maker
10
+
11
+ A brand and a few lines of copy in, 1080x1350 carousel slides out. The template places the text, so it
12
+ is never garbled and never off-brand. Pictures come from the brand's library: drawings written once as
13
+ canvas code, painted by shorts-animator, and reused by every deck after that. Text-only decks need no
14
+ library at all.
15
+
16
+ `CM` = `node <this skill's folder>/scripts/cm.ts`. Write the full command each time. One folder per
17
+ brand: `BRAND=./<slug>-carousels`. Decks live in `$BRAND/decks/<deck>.json`.
18
+
19
+ ## 1. Decide the copy
20
+
21
+ Decide the slides yourself. Ask one question only if the subject or the brand is unclear. A pasted
22
+ script is used word for word.
23
+
24
+ - 5 to 8 slides: a `cover`, then `point` slides, then one `cta`.
25
+ - The cover is a promise in 8 words or fewer. It is the only slide most people see.
26
+ - One idea per point slide: a title of 7 words or fewer, a body of 22 words or fewer.
27
+ - The cta asks for one thing (save, follow, comment) and carries a `follow` line.
28
+ - `caption` is the post text: two short lines and one question for the comments.
29
+
30
+ ## 2. Set up the brand
31
+
32
+ ```bash
33
+ CM new "$BRAND" --name "Slow Hours" --handle @slowhours --look ink # brand.json, decks/, art/, library/
34
+ ```
35
+
36
+ `brand.json`: `name`, `handle`, `colors` (`paper`, `ink`, `accent`, `muted`, all `#rrggbb`), `fonts`
37
+ (`head`, `body`, CSS font stacks). Set them from what they told you; the defaults are cream, near-black
38
+ and orange. `--look` picks the paint for the library: `ink`, `gouache`, `watercolor`, `pastel`, `oil`.
39
+
40
+ A deck:
41
+
42
+ ```json
43
+ { "title": "mornings", "caption": "...", "slides": [
44
+ { "kind": "cover", "title": "Slow mornings, in 4 steps", "body": "No 5am club.", "art": "window" },
45
+ { "kind": "point", "title": "Coffee, outside", "body": "Five minutes on the step.", "art": "coffee" },
46
+ { "kind": "point", "title": "Their own photo", "art": "photos/desk.jpg" },
47
+ { "kind": "cta", "title": "Save this for tomorrow", "follow": "Follow @slowhours" } ] }
48
+ ```
49
+
50
+ `art` is a library drawing (a bare name), a file (a path, relative to `$BRAND`), or left out for a
51
+ text-only slide, which gets larger type.
52
+
53
+ ## 3. Draw the library (once per brand)
54
+
55
+ Skip this for text-only decks. Every bare `art` name needs a function in `$BRAND/art/scenes.js`:
56
+ `window.SCENES = { "window": (k) => { k.sky({...}); ... } }`. Read `../shorts-animator/references/kit.md`
57
+ before writing scenes. Draw objects and places, square, one subject, big simple shapes, strong value
58
+ contrast; the paint pass adds texture. No people's faces close up.
59
+
60
+ ```bash
61
+ CM art "$BRAND" # every drawing the decks use -> library/<name>.jpg
62
+ CM art "$BRAND" coffee # only these
63
+ ```
64
+
65
+ Look at the sheet it reports once. Redraw only the drawings that are muddy, empty or look alike. The
66
+ library is the brand's asset: the next deck reuses it and only new names cost a drawing.
67
+
68
+ ## 4. Check, render, look (budgeted)
69
+
70
+ ```bash
71
+ CM check "$BRAND" [deck] # no browser: unknown kinds, missing drawings or files, deck shape, word counts
72
+ CM render "$BRAND" [deck] # out/<deck>/slide-N.png, sheet.jpg, caption.txt; measures every slide
73
+ ```
74
+
75
+ Fix every `ERROR` from `check` before rendering. `render` also fails a slide whose text spills out of
76
+ its frame or whose picture did not load. Then read `out/<deck>/sheet.jpg` once. **Budget: at most two
77
+ looks per deck** (the library sheet and the deck sheet). Images are the expensive part of this loop; do
78
+ not reopen a sheet you have already judged.
79
+
80
+ Tell them in two lines what it is (slides, look) and: "Tell me what to change, one sentence is enough."
81
+
82
+ ## 5. One-sentence changes
83
+
84
+ Smallest change, `CM check`, render, show.
85
+
86
+ | they say | change |
87
+ |---|---|
88
+ | shorter, punchier | the slide's `title` or `body` |
89
+ | different colours, our brand | `brand.json` `colors` |
90
+ | serif, sans, our font | `brand.json` `fonts` |
91
+ | a different picture on slide 3 | that slide's `art`, or one new scene plus `CM art "$BRAND" <name>` |
92
+ | no pictures | drop `art` from the slides |
93
+ | another post on the same brand | a new `decks/<deck>.json`; reuse library names |
94
+
95
+ ## When something goes wrong
96
+
97
+ | symptom | fix |
98
+ |---|---|
99
+ | no Chrome | install Chrome, or set `CHROME` to a Chrome or headless-shell binary |
100
+ | `CM art` cannot find shorts-animator | install it alongside, or set `SHORTS_ANIMATOR` to its `scripts/sa.ts` |
101
+ | "text spills out of the frame" | cut words; `check` warns before this happens |
102
+ | no sheet.jpg | ffmpeg is missing; the slides are still in `out/<deck>/` |
@@ -0,0 +1,103 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Make narrated, painted animated shorts (TikTok, Reels, YouTube Shorts) from a script and a look described in words: scenes drawn in code, GPU-painted, voiced locally, captioned and scored into an MP4."
5
+ ---
6
+
7
+ Use the olko:shorts-animator skill.
8
+
9
+ # Shorts Animator
10
+
11
+ A script and a look in, an animated short out. You write the lines and draw every shot as canvas code; the
12
+ tool paints it on the GPU on twos, narrates it with a local Kokoro voice, captions it, scores it and
13
+ encodes the MP4. Nothing is filmed, generated by an image model, or licensed.
14
+
15
+ `SA` = `node <this skill's folder>/scripts/sa.ts`. Write the full command each time. One folder per short:
16
+ `WORK=./<slug>-short`. First run on a machine: `SA doctor` (checks Node, ffmpeg, Chrome, sets up the voice,
17
+ renders a 3-second test).
18
+
19
+ ## 1. Decide, do not interrogate
20
+
21
+ Decide the lines, shots, look, voice and music yourself. Ask one question only if the subject is unclear.
22
+ A pasted script is used word for word. A topic: write it per `references/writing.md`.
23
+
24
+ | they say | look |
25
+ |---|---|
26
+ | oil, painterly, Van Gogh, swirly, "like the faith shorts" | `oil` |
27
+ | watercolour, soft, dreamy, children's book | `watercolor` |
28
+ | crayon, pastel, chalk, for kids | `pastel` |
29
+ | ink, comic, graphic novel, line art | `ink` |
30
+ | flat, storybook, gouache, poster, calm | `gouache` |
31
+
32
+ Custom look: `"look": { "base": "oil", "brush": 16, "palette": {...} }`. Read `references/looks.md` only
33
+ when overriding numbers. Voice `bm_george` (default, scripture and quotes), `am_michael`, `bf_emma`
34
+ (stories), `af_heart` (kids); `speed` 0.85 to 0.95 reads calm. Their recording: `"voice": { "file":
35
+ "assets/voice.m4a" }` with `say` lines matching it in order. `"voice": "none"` for music only. Music
36
+ `mood`: `tender`, `hopeful`, `night`, `wonder`, `playful`, `none`, or a track path. `SA looks` lists all.
37
+
38
+ ## 2. Write the plan and the drawings
39
+
40
+ ```bash
41
+ SA new "$WORK" --look oil # short.json + scenes.js + assets/
42
+ ```
43
+
44
+ `short.json` lines: `{ "say": "...", "scene": "meadow" | ["a", "b"], "move": "push", "hold": 0.8 }`.
45
+ - A list of scenes cuts on the caption chunks. Cut often: a new picture every 1.5 to 3 s.
46
+ - `move`: push, pull, pan-left, pan-right, rise, fall, drift, still. `transition`: cut, fade, dip (rarely).
47
+ - `caption` shows different words; `/` forces a break. `captions.style`: box, plain, none.
48
+ - `format`: 9:16 (default), 16:9, 1:1, 4:5. `twos`: 2 (hand-drawn), 1 (smooth).
49
+
50
+ `scenes.js`: `window.SCENES = { "meadow": (k) => { k.sky({...}); k.person({...}); } }`. Read
51
+ `references/kit.md` before writing scenes. Draw like a painter:
52
+ - Big simple shapes, strong value contrast, one subject. The paint pass adds texture; draw nothing fussy.
53
+ - Keep faces out of the caption band (about 77% down).
54
+ - Every shot different: place, scale, day and night, warm and cool. Match the words.
55
+ - Small motion: `pose: "walk"`, `dx`, rain, glints. `k.t` seconds, `k.p` progress 0 to 1.
56
+ - No helper for it (a boat, an animal)? Write a small function with `k.g`, flat shapes in the palette.
57
+
58
+ ## 3. Check, then look (budgeted)
59
+
60
+ ```bash
61
+ SA check "$WORK" # no browser, about a second: missing scenes, throwing scenes, unknown kit calls,
62
+ # figures under the captions, line and total length
63
+ SA frames "$WORK" # narrates (cached), one painted frame per shot -> frames/sheet.jpg
64
+ SA still "$WORK" 7 # one shot full size, only when the sheet shows a problem you cannot place
65
+ ```
66
+
67
+ Fix every `ERROR` from `check` before spending a browser run. Then read `frames/sheet.jpg` once. Fix muddy
68
+ or empty shots, a figure lost in its background (contrast, `rim`), look-alike shots, a red "no scene"
69
+ frame, and every `⚠ the page said` line. **Budget: at most two frames rounds before the first render.**
70
+ Images are the expensive part of this loop; do not reopen a sheet you have already judged.
71
+
72
+ ## 4. Render and deliver
73
+
74
+ ```bash
75
+ SA render "$WORK" # about a minute for 40 s -> <title>.mp4, renders/vN.mp4 (+ its short.json), qa/sheet.jpg
76
+ ```
77
+
78
+ Read `qa/sheet.jpg` only if the render printed a warning or they report a problem. Tell them in two
79
+ lines what it is (look, length, shots) and: "Tell me what to change, one sentence is enough."
80
+
81
+ ## 5. One-sentence changes
82
+
83
+ Smallest change, `SA check`, render, show. `SA set "$WORK" voice.speed=0.85 music.mood=night` edits
84
+ short.json (JSON values; plain text otherwise) and refuses an invalid result.
85
+
86
+ | they say | change |
87
+ |---|---|
88
+ | more painterly, softer | `look` or its numbers (brush, swirl, wash) |
89
+ | slower, faster | `voice.speed`, `pause` |
90
+ | a woman's voice, American | `voice.id` |
91
+ | no music, more emotional | `music.mood` |
92
+ | bigger captions, no box | `captions.size` 52, `captions.style` plain |
93
+ | for YouTube | `format` 16:9, redraw shots whose layout breaks |
94
+ | change shot 4 | that scene function only |
95
+
96
+ ## When something goes wrong
97
+
98
+ | symptom | fix |
99
+ |---|---|
100
+ | no Chrome | install Chrome, or `SA doctor` fetches a headless one |
101
+ | "painting on the CPU" | works, about 10x slower |
102
+ | narrator setup fails | needs Python 3.10+ or `uv`; or use `"voice": "none"` or their recording |
103
+ | voice timing off with their recording | `say` lines must match its words, in order |
@@ -0,0 +1,101 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Make Instagram or LinkedIn carousel slides from a topic or pasted copy: a brand template sets the text, and a reusable library of hand-drawn illustrations, drawn once in code per brand, supplies the pictures."
6
+ ---
7
+
8
+ # Carousel Maker
9
+
10
+ A brand and a few lines of copy in, 1080x1350 carousel slides out. The template places the text, so it
11
+ is never garbled and never off-brand. Pictures come from the brand's library: drawings written once as
12
+ canvas code, painted by shorts-animator, and reused by every deck after that. Text-only decks need no
13
+ library at all.
14
+
15
+ `CM` = `node <this skill's folder>/scripts/cm.ts`. Write the full command each time. One folder per
16
+ brand: `BRAND=./<slug>-carousels`. Decks live in `$BRAND/decks/<deck>.json`.
17
+
18
+ ## 1. Decide the copy
19
+
20
+ Decide the slides yourself. Ask one question only if the subject or the brand is unclear. A pasted
21
+ script is used word for word.
22
+
23
+ - 5 to 8 slides: a `cover`, then `point` slides, then one `cta`.
24
+ - The cover is a promise in 8 words or fewer. It is the only slide most people see.
25
+ - One idea per point slide: a title of 7 words or fewer, a body of 22 words or fewer.
26
+ - The cta asks for one thing (save, follow, comment) and carries a `follow` line.
27
+ - `caption` is the post text: two short lines and one question for the comments.
28
+
29
+ ## 2. Set up the brand
30
+
31
+ ```bash
32
+ CM new "$BRAND" --name "Slow Hours" --handle @slowhours --look ink # brand.json, decks/, art/, library/
33
+ ```
34
+
35
+ `brand.json`: `name`, `handle`, `colors` (`paper`, `ink`, `accent`, `muted`, all `#rrggbb`), `fonts`
36
+ (`head`, `body`, CSS font stacks). Set them from what they told you; the defaults are cream, near-black
37
+ and orange. `--look` picks the paint for the library: `ink`, `gouache`, `watercolor`, `pastel`, `oil`.
38
+
39
+ A deck:
40
+
41
+ ```json
42
+ { "title": "mornings", "caption": "...", "slides": [
43
+ { "kind": "cover", "title": "Slow mornings, in 4 steps", "body": "No 5am club.", "art": "window" },
44
+ { "kind": "point", "title": "Coffee, outside", "body": "Five minutes on the step.", "art": "coffee" },
45
+ { "kind": "point", "title": "Their own photo", "art": "photos/desk.jpg" },
46
+ { "kind": "cta", "title": "Save this for tomorrow", "follow": "Follow @slowhours" } ] }
47
+ ```
48
+
49
+ `art` is a library drawing (a bare name), a file (a path, relative to `$BRAND`), or left out for a
50
+ text-only slide, which gets larger type.
51
+
52
+ ## 3. Draw the library (once per brand)
53
+
54
+ Skip this for text-only decks. Every bare `art` name needs a function in `$BRAND/art/scenes.js`:
55
+ `window.SCENES = { "window": (k) => { k.sky({...}); ... } }`. Read `../shorts-animator/references/kit.md`
56
+ before writing scenes. Draw objects and places, square, one subject, big simple shapes, strong value
57
+ contrast; the paint pass adds texture. No people's faces close up.
58
+
59
+ ```bash
60
+ CM art "$BRAND" # every drawing the decks use -> library/<name>.jpg
61
+ CM art "$BRAND" coffee # only these
62
+ ```
63
+
64
+ Look at the sheet it reports once. Redraw only the drawings that are muddy, empty or look alike. The
65
+ library is the brand's asset: the next deck reuses it and only new names cost a drawing.
66
+
67
+ ## 4. Check, render, look (budgeted)
68
+
69
+ ```bash
70
+ CM check "$BRAND" [deck] # no browser: unknown kinds, missing drawings or files, deck shape, word counts
71
+ CM render "$BRAND" [deck] # out/<deck>/slide-N.png, sheet.jpg, caption.txt; measures every slide
72
+ ```
73
+
74
+ Fix every `ERROR` from `check` before rendering. `render` also fails a slide whose text spills out of
75
+ its frame or whose picture did not load. Then read `out/<deck>/sheet.jpg` once. **Budget: at most two
76
+ looks per deck** (the library sheet and the deck sheet). Images are the expensive part of this loop; do
77
+ not reopen a sheet you have already judged.
78
+
79
+ Tell them in two lines what it is (slides, look) and: "Tell me what to change, one sentence is enough."
80
+
81
+ ## 5. One-sentence changes
82
+
83
+ Smallest change, `CM check`, render, show.
84
+
85
+ | they say | change |
86
+ |---|---|
87
+ | shorter, punchier | the slide's `title` or `body` |
88
+ | different colours, our brand | `brand.json` `colors` |
89
+ | serif, sans, our font | `brand.json` `fonts` |
90
+ | a different picture on slide 3 | that slide's `art`, or one new scene plus `CM art "$BRAND" <name>` |
91
+ | no pictures | drop `art` from the slides |
92
+ | another post on the same brand | a new `decks/<deck>.json`; reuse library names |
93
+
94
+ ## When something goes wrong
95
+
96
+ | symptom | fix |
97
+ |---|---|
98
+ | no Chrome | install Chrome, or set `CHROME` to a Chrome or headless-shell binary |
99
+ | `CM art` cannot find shorts-animator | install it alongside, or set `SHORTS_ANIMATOR` to its `scripts/sa.ts` |
100
+ | "text spills out of the frame" | cut words; `check` warns before this happens |
101
+ | no sheet.jpg | ffmpeg is missing; the slides are still in `out/<deck>/` |
@@ -0,0 +1,102 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ inclusion: manual
5
+ description: "Make narrated, painted animated shorts (TikTok, Reels, YouTube Shorts) from a script and a look described in words: scenes drawn in code, GPU-painted, voiced locally, captioned and scored into an MP4."
6
+ ---
7
+
8
+ # Shorts Animator
9
+
10
+ A script and a look in, an animated short out. You write the lines and draw every shot as canvas code; the
11
+ tool paints it on the GPU on twos, narrates it with a local Kokoro voice, captions it, scores it and
12
+ encodes the MP4. Nothing is filmed, generated by an image model, or licensed.
13
+
14
+ `SA` = `node <this skill's folder>/scripts/sa.ts`. Write the full command each time. One folder per short:
15
+ `WORK=./<slug>-short`. First run on a machine: `SA doctor` (checks Node, ffmpeg, Chrome, sets up the voice,
16
+ renders a 3-second test).
17
+
18
+ ## 1. Decide, do not interrogate
19
+
20
+ Decide the lines, shots, look, voice and music yourself. Ask one question only if the subject is unclear.
21
+ A pasted script is used word for word. A topic: write it per `references/writing.md`.
22
+
23
+ | they say | look |
24
+ |---|---|
25
+ | oil, painterly, Van Gogh, swirly, "like the faith shorts" | `oil` |
26
+ | watercolour, soft, dreamy, children's book | `watercolor` |
27
+ | crayon, pastel, chalk, for kids | `pastel` |
28
+ | ink, comic, graphic novel, line art | `ink` |
29
+ | flat, storybook, gouache, poster, calm | `gouache` |
30
+
31
+ Custom look: `"look": { "base": "oil", "brush": 16, "palette": {...} }`. Read `references/looks.md` only
32
+ when overriding numbers. Voice `bm_george` (default, scripture and quotes), `am_michael`, `bf_emma`
33
+ (stories), `af_heart` (kids); `speed` 0.85 to 0.95 reads calm. Their recording: `"voice": { "file":
34
+ "assets/voice.m4a" }` with `say` lines matching it in order. `"voice": "none"` for music only. Music
35
+ `mood`: `tender`, `hopeful`, `night`, `wonder`, `playful`, `none`, or a track path. `SA looks` lists all.
36
+
37
+ ## 2. Write the plan and the drawings
38
+
39
+ ```bash
40
+ SA new "$WORK" --look oil # short.json + scenes.js + assets/
41
+ ```
42
+
43
+ `short.json` lines: `{ "say": "...", "scene": "meadow" | ["a", "b"], "move": "push", "hold": 0.8 }`.
44
+ - A list of scenes cuts on the caption chunks. Cut often: a new picture every 1.5 to 3 s.
45
+ - `move`: push, pull, pan-left, pan-right, rise, fall, drift, still. `transition`: cut, fade, dip (rarely).
46
+ - `caption` shows different words; `/` forces a break. `captions.style`: box, plain, none.
47
+ - `format`: 9:16 (default), 16:9, 1:1, 4:5. `twos`: 2 (hand-drawn), 1 (smooth).
48
+
49
+ `scenes.js`: `window.SCENES = { "meadow": (k) => { k.sky({...}); k.person({...}); } }`. Read
50
+ `references/kit.md` before writing scenes. Draw like a painter:
51
+ - Big simple shapes, strong value contrast, one subject. The paint pass adds texture; draw nothing fussy.
52
+ - Keep faces out of the caption band (about 77% down).
53
+ - Every shot different: place, scale, day and night, warm and cool. Match the words.
54
+ - Small motion: `pose: "walk"`, `dx`, rain, glints. `k.t` seconds, `k.p` progress 0 to 1.
55
+ - No helper for it (a boat, an animal)? Write a small function with `k.g`, flat shapes in the palette.
56
+
57
+ ## 3. Check, then look (budgeted)
58
+
59
+ ```bash
60
+ SA check "$WORK" # no browser, about a second: missing scenes, throwing scenes, unknown kit calls,
61
+ # figures under the captions, line and total length
62
+ SA frames "$WORK" # narrates (cached), one painted frame per shot -> frames/sheet.jpg
63
+ SA still "$WORK" 7 # one shot full size, only when the sheet shows a problem you cannot place
64
+ ```
65
+
66
+ Fix every `ERROR` from `check` before spending a browser run. Then read `frames/sheet.jpg` once. Fix muddy
67
+ or empty shots, a figure lost in its background (contrast, `rim`), look-alike shots, a red "no scene"
68
+ frame, and every `⚠ the page said` line. **Budget: at most two frames rounds before the first render.**
69
+ Images are the expensive part of this loop; do not reopen a sheet you have already judged.
70
+
71
+ ## 4. Render and deliver
72
+
73
+ ```bash
74
+ SA render "$WORK" # about a minute for 40 s -> <title>.mp4, renders/vN.mp4 (+ its short.json), qa/sheet.jpg
75
+ ```
76
+
77
+ Read `qa/sheet.jpg` only if the render printed a warning or they report a problem. Tell them in two
78
+ lines what it is (look, length, shots) and: "Tell me what to change, one sentence is enough."
79
+
80
+ ## 5. One-sentence changes
81
+
82
+ Smallest change, `SA check`, render, show. `SA set "$WORK" voice.speed=0.85 music.mood=night` edits
83
+ short.json (JSON values; plain text otherwise) and refuses an invalid result.
84
+
85
+ | they say | change |
86
+ |---|---|
87
+ | more painterly, softer | `look` or its numbers (brush, swirl, wash) |
88
+ | slower, faster | `voice.speed`, `pause` |
89
+ | a woman's voice, American | `voice.id` |
90
+ | no music, more emotional | `music.mood` |
91
+ | bigger captions, no box | `captions.size` 52, `captions.style` plain |
92
+ | for YouTube | `format` 16:9, redraw shots whose layout breaks |
93
+ | change shot 4 | that scene function only |
94
+
95
+ ## When something goes wrong
96
+
97
+ | symptom | fix |
98
+ |---|---|
99
+ | no Chrome | install Chrome, or `SA doctor` fetches a headless one |
100
+ | "painting on the CPU" | works, about 10x slower |
101
+ | narrator setup fails | needs Python 3.10+ or `uv`; or use `"voice": "none"` or their recording |
102
+ | voice timing off with their recording | `say` lines must match its words, in order |
@@ -0,0 +1,100 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Make Instagram or LinkedIn carousel slides from a topic or pasted copy: a brand template sets the text, and a reusable library of hand-drawn illustrations, drawn once in code per brand, supplies the pictures."
5
+ ---
6
+
7
+ # Carousel Maker
8
+
9
+ A brand and a few lines of copy in, 1080x1350 carousel slides out. The template places the text, so it
10
+ is never garbled and never off-brand. Pictures come from the brand's library: drawings written once as
11
+ canvas code, painted by shorts-animator, and reused by every deck after that. Text-only decks need no
12
+ library at all.
13
+
14
+ `CM` = `node <this skill's folder>/scripts/cm.ts`. Write the full command each time. One folder per
15
+ brand: `BRAND=./<slug>-carousels`. Decks live in `$BRAND/decks/<deck>.json`.
16
+
17
+ ## 1. Decide the copy
18
+
19
+ Decide the slides yourself. Ask one question only if the subject or the brand is unclear. A pasted
20
+ script is used word for word.
21
+
22
+ - 5 to 8 slides: a `cover`, then `point` slides, then one `cta`.
23
+ - The cover is a promise in 8 words or fewer. It is the only slide most people see.
24
+ - One idea per point slide: a title of 7 words or fewer, a body of 22 words or fewer.
25
+ - The cta asks for one thing (save, follow, comment) and carries a `follow` line.
26
+ - `caption` is the post text: two short lines and one question for the comments.
27
+
28
+ ## 2. Set up the brand
29
+
30
+ ```bash
31
+ CM new "$BRAND" --name "Slow Hours" --handle @slowhours --look ink # brand.json, decks/, art/, library/
32
+ ```
33
+
34
+ `brand.json`: `name`, `handle`, `colors` (`paper`, `ink`, `accent`, `muted`, all `#rrggbb`), `fonts`
35
+ (`head`, `body`, CSS font stacks). Set them from what they told you; the defaults are cream, near-black
36
+ and orange. `--look` picks the paint for the library: `ink`, `gouache`, `watercolor`, `pastel`, `oil`.
37
+
38
+ A deck:
39
+
40
+ ```json
41
+ { "title": "mornings", "caption": "...", "slides": [
42
+ { "kind": "cover", "title": "Slow mornings, in 4 steps", "body": "No 5am club.", "art": "window" },
43
+ { "kind": "point", "title": "Coffee, outside", "body": "Five minutes on the step.", "art": "coffee" },
44
+ { "kind": "point", "title": "Their own photo", "art": "photos/desk.jpg" },
45
+ { "kind": "cta", "title": "Save this for tomorrow", "follow": "Follow @slowhours" } ] }
46
+ ```
47
+
48
+ `art` is a library drawing (a bare name), a file (a path, relative to `$BRAND`), or left out for a
49
+ text-only slide, which gets larger type.
50
+
51
+ ## 3. Draw the library (once per brand)
52
+
53
+ Skip this for text-only decks. Every bare `art` name needs a function in `$BRAND/art/scenes.js`:
54
+ `window.SCENES = { "window": (k) => { k.sky({...}); ... } }`. Read `../shorts-animator/references/kit.md`
55
+ before writing scenes. Draw objects and places, square, one subject, big simple shapes, strong value
56
+ contrast; the paint pass adds texture. No people's faces close up.
57
+
58
+ ```bash
59
+ CM art "$BRAND" # every drawing the decks use -> library/<name>.jpg
60
+ CM art "$BRAND" coffee # only these
61
+ ```
62
+
63
+ Look at the sheet it reports once. Redraw only the drawings that are muddy, empty or look alike. The
64
+ library is the brand's asset: the next deck reuses it and only new names cost a drawing.
65
+
66
+ ## 4. Check, render, look (budgeted)
67
+
68
+ ```bash
69
+ CM check "$BRAND" [deck] # no browser: unknown kinds, missing drawings or files, deck shape, word counts
70
+ CM render "$BRAND" [deck] # out/<deck>/slide-N.png, sheet.jpg, caption.txt; measures every slide
71
+ ```
72
+
73
+ Fix every `ERROR` from `check` before rendering. `render` also fails a slide whose text spills out of
74
+ its frame or whose picture did not load. Then read `out/<deck>/sheet.jpg` once. **Budget: at most two
75
+ looks per deck** (the library sheet and the deck sheet). Images are the expensive part of this loop; do
76
+ not reopen a sheet you have already judged.
77
+
78
+ Tell them in two lines what it is (slides, look) and: "Tell me what to change, one sentence is enough."
79
+
80
+ ## 5. One-sentence changes
81
+
82
+ Smallest change, `CM check`, render, show.
83
+
84
+ | they say | change |
85
+ |---|---|
86
+ | shorter, punchier | the slide's `title` or `body` |
87
+ | different colours, our brand | `brand.json` `colors` |
88
+ | serif, sans, our font | `brand.json` `fonts` |
89
+ | a different picture on slide 3 | that slide's `art`, or one new scene plus `CM art "$BRAND" <name>` |
90
+ | no pictures | drop `art` from the slides |
91
+ | another post on the same brand | a new `decks/<deck>.json`; reuse library names |
92
+
93
+ ## When something goes wrong
94
+
95
+ | symptom | fix |
96
+ |---|---|
97
+ | no Chrome | install Chrome, or set `CHROME` to a Chrome or headless-shell binary |
98
+ | `CM art` cannot find shorts-animator | install it alongside, or set `SHORTS_ANIMATOR` to its `scripts/sa.ts` |
99
+ | "text spills out of the frame" | cut words; `check` warns before this happens |
100
+ | no sheet.jpg | ffmpeg is missing; the slides are still in `out/<deck>/` |
@@ -0,0 +1,101 @@
1
+ <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
+
3
+ ---
4
+ description: "Make narrated, painted animated shorts (TikTok, Reels, YouTube Shorts) from a script and a look described in words: scenes drawn in code, GPU-painted, voiced locally, captioned and scored into an MP4."
5
+ ---
6
+
7
+ # Shorts Animator
8
+
9
+ A script and a look in, an animated short out. You write the lines and draw every shot as canvas code; the
10
+ tool paints it on the GPU on twos, narrates it with a local Kokoro voice, captions it, scores it and
11
+ encodes the MP4. Nothing is filmed, generated by an image model, or licensed.
12
+
13
+ `SA` = `node <this skill's folder>/scripts/sa.ts`. Write the full command each time. One folder per short:
14
+ `WORK=./<slug>-short`. First run on a machine: `SA doctor` (checks Node, ffmpeg, Chrome, sets up the voice,
15
+ renders a 3-second test).
16
+
17
+ ## 1. Decide, do not interrogate
18
+
19
+ Decide the lines, shots, look, voice and music yourself. Ask one question only if the subject is unclear.
20
+ A pasted script is used word for word. A topic: write it per `references/writing.md`.
21
+
22
+ | they say | look |
23
+ |---|---|
24
+ | oil, painterly, Van Gogh, swirly, "like the faith shorts" | `oil` |
25
+ | watercolour, soft, dreamy, children's book | `watercolor` |
26
+ | crayon, pastel, chalk, for kids | `pastel` |
27
+ | ink, comic, graphic novel, line art | `ink` |
28
+ | flat, storybook, gouache, poster, calm | `gouache` |
29
+
30
+ Custom look: `"look": { "base": "oil", "brush": 16, "palette": {...} }`. Read `references/looks.md` only
31
+ when overriding numbers. Voice `bm_george` (default, scripture and quotes), `am_michael`, `bf_emma`
32
+ (stories), `af_heart` (kids); `speed` 0.85 to 0.95 reads calm. Their recording: `"voice": { "file":
33
+ "assets/voice.m4a" }` with `say` lines matching it in order. `"voice": "none"` for music only. Music
34
+ `mood`: `tender`, `hopeful`, `night`, `wonder`, `playful`, `none`, or a track path. `SA looks` lists all.
35
+
36
+ ## 2. Write the plan and the drawings
37
+
38
+ ```bash
39
+ SA new "$WORK" --look oil # short.json + scenes.js + assets/
40
+ ```
41
+
42
+ `short.json` lines: `{ "say": "...", "scene": "meadow" | ["a", "b"], "move": "push", "hold": 0.8 }`.
43
+ - A list of scenes cuts on the caption chunks. Cut often: a new picture every 1.5 to 3 s.
44
+ - `move`: push, pull, pan-left, pan-right, rise, fall, drift, still. `transition`: cut, fade, dip (rarely).
45
+ - `caption` shows different words; `/` forces a break. `captions.style`: box, plain, none.
46
+ - `format`: 9:16 (default), 16:9, 1:1, 4:5. `twos`: 2 (hand-drawn), 1 (smooth).
47
+
48
+ `scenes.js`: `window.SCENES = { "meadow": (k) => { k.sky({...}); k.person({...}); } }`. Read
49
+ `references/kit.md` before writing scenes. Draw like a painter:
50
+ - Big simple shapes, strong value contrast, one subject. The paint pass adds texture; draw nothing fussy.
51
+ - Keep faces out of the caption band (about 77% down).
52
+ - Every shot different: place, scale, day and night, warm and cool. Match the words.
53
+ - Small motion: `pose: "walk"`, `dx`, rain, glints. `k.t` seconds, `k.p` progress 0 to 1.
54
+ - No helper for it (a boat, an animal)? Write a small function with `k.g`, flat shapes in the palette.
55
+
56
+ ## 3. Check, then look (budgeted)
57
+
58
+ ```bash
59
+ SA check "$WORK" # no browser, about a second: missing scenes, throwing scenes, unknown kit calls,
60
+ # figures under the captions, line and total length
61
+ SA frames "$WORK" # narrates (cached), one painted frame per shot -> frames/sheet.jpg
62
+ SA still "$WORK" 7 # one shot full size, only when the sheet shows a problem you cannot place
63
+ ```
64
+
65
+ Fix every `ERROR` from `check` before spending a browser run. Then read `frames/sheet.jpg` once. Fix muddy
66
+ or empty shots, a figure lost in its background (contrast, `rim`), look-alike shots, a red "no scene"
67
+ frame, and every `⚠ the page said` line. **Budget: at most two frames rounds before the first render.**
68
+ Images are the expensive part of this loop; do not reopen a sheet you have already judged.
69
+
70
+ ## 4. Render and deliver
71
+
72
+ ```bash
73
+ SA render "$WORK" # about a minute for 40 s -> <title>.mp4, renders/vN.mp4 (+ its short.json), qa/sheet.jpg
74
+ ```
75
+
76
+ Read `qa/sheet.jpg` only if the render printed a warning or they report a problem. Tell them in two
77
+ lines what it is (look, length, shots) and: "Tell me what to change, one sentence is enough."
78
+
79
+ ## 5. One-sentence changes
80
+
81
+ Smallest change, `SA check`, render, show. `SA set "$WORK" voice.speed=0.85 music.mood=night` edits
82
+ short.json (JSON values; plain text otherwise) and refuses an invalid result.
83
+
84
+ | they say | change |
85
+ |---|---|
86
+ | more painterly, softer | `look` or its numbers (brush, swirl, wash) |
87
+ | slower, faster | `voice.speed`, `pause` |
88
+ | a woman's voice, American | `voice.id` |
89
+ | no music, more emotional | `music.mood` |
90
+ | bigger captions, no box | `captions.size` 52, `captions.style` plain |
91
+ | for YouTube | `format` 16:9, redraw shots whose layout breaks |
92
+ | change shot 4 | that scene function only |
93
+
94
+ ## When something goes wrong
95
+
96
+ | symptom | fix |
97
+ |---|---|
98
+ | no Chrome | install Chrome, or `SA doctor` fetches a headless one |
99
+ | "painting on the CPU" | works, about 10x slower |
100
+ | narrator setup fails | needs Python 3.10+ or `uv`; or use `"voice": "none"` or their recording |
101
+ | voice timing off with their recording | `say` lines must match its words, in order |
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  <p><strong>Agent-agnostic skill catalog for Codex, Claude, Cursor, Grok, Copilot, Windsurf, Kiro, Hermes Agent, and other skill-aware tools.</strong></p>
4
4
  <p>
5
5
  <img src="https://img.shields.io/badge/license-MIT-16a34a" alt="MIT license">
6
- <img src="https://img.shields.io/badge/skills-56-2563eb" alt="56 skills">
6
+ <img src="https://img.shields.io/badge/skills-59-2563eb" alt="59 skills">
7
7
  <img src="https://img.shields.io/badge/platforms-Codex%20%7C%20Claude%20%7C%20Cursor%20%7C%20Grok%20%7C%20Copilot%20%7C%20Windsurf%20%7C%20Kiro%20%7C%20Hermes-111827" alt="Codex Claude Cursor Grok Copilot Windsurf Kiro Hermes">
8
8
  <img src="https://img.shields.io/badge/status-public%20catalog-16a34a" alt="Public catalog">
9
9
  </p>
@@ -334,7 +334,7 @@ Build, test and publish Garmin Connect IQ watch faces.
334
334
  |-------|-------------|----------|
335
335
  | [garmin-watchface](plugins/olko-garmin-kit/skills/garmin-watchface/SKILL.md) | Designs, builds, tests, screenshots, and publishes Garmin Connect IQ watch faces in Monkey C | Working on a Connect IQ watch face, SVG design proposals, inspiration gathering, layout that clips or overlaps, simulator screenshots, app settings, device support, or store submission |
336
336
 
337
- ### olko-creative (5)
337
+ ### olko-creative (7)
338
338
 
339
339
  Creative and personal projects: photo galleries, music players, Plex ingest, listings, wiki editing.
340
340
 
@@ -345,6 +345,8 @@ Creative and personal projects: photo galleries, music players, Plex ingest, lis
345
345
  | [music-to-plex](plugins/olko-creative/skills/music-to-plex/SKILL.md) | Acquires albums, DJ crates, and YouTube playlists for Plex/Plexamp with verified NAS delivery, Plex visibility, and source-backed Obsidian radio notes | Adding or downloading music to Plex/Plexamp, including an album request, DJ crate, or YouTube playlist |
346
346
  | [vinted-listing](plugins/olko-creative/skills/vinted-listing/SKILL.md) | Creates and safely publishes Vinted listings from verified item details and the seller's original photos, with automatic suggestions, duplicate checks, draft verification, and publish confirmation | Listing, selling, relisting, or pricing an item on Vinted, or editing and publishing an existing draft |
347
347
  | [wikipedia-uk-editor](plugins/olko-creative/skills/wikipedia-uk-editor/SKILL.md) | Drafts policy-compliant Ukrainian Wikipedia edits, en→uk translation, stub expansion, sourcing, backlog cleanup, returning ready-to-paste wikitext, an edit summary, and a verified source list | Editing, translating, or sourcing a uk.wikipedia.org article, or planning what to contribute next |
348
+ | [shorts-animator](plugins/olko-creative/skills/shorts-animator/SKILL.md) | Makes narrated, painted animated shorts from a script and a look in words: scenes drawn in code, GPU-painted on twos, voiced locally, captioned and scored into an MP4 | Making a TikTok, Reels or YouTube Shorts animation, a painted quote or verse video, or any faceless short that should look drawn |
349
+ | [carousel-maker](plugins/olko-creative/skills/carousel-maker/SKILL.md) | Makes Instagram or LinkedIn carousel slides from a topic or pasted copy: a brand template sets the text, a library of code-drawn illustrations made once per brand supplies the pictures, and every slide is measured for overflow before export | Making a carousel post, a swipeable slide series, or a set of on-brand social slides without image models |
348
350
 
349
351
  ### olko-web-ops (4)
350
352