@olegkoval/agent-skills 1.59.3 → 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 (231) hide show
  1. package/.github/copilot-instructions.md +2 -0
  2. package/.github/prompts/carousel-maker.prompt.md +102 -0
  3. package/.github/prompts/self-critique.prompt.md +167 -43
  4. package/.github/prompts/shorts-animator.prompt.md +103 -0
  5. package/.kiro/steering/carousel-maker.md +101 -0
  6. package/.kiro/steering/shorts-animator.md +102 -0
  7. package/.windsurf/rules/carousel-maker.md +100 -0
  8. package/.windsurf/rules/shorts-animator.md +101 -0
  9. package/README.md +5 -3
  10. package/adapters/claude/olko-creative/skills/carousel-maker/SKILL.md +112 -0
  11. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  12. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  13. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  14. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  15. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  16. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  17. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  18. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  19. package/adapters/claude/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  20. package/adapters/claude/olko-creative/skills/shorts-animator/SKILL.md +113 -0
  21. package/adapters/claude/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  22. package/adapters/claude/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  23. package/adapters/claude/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  24. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  25. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  26. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  27. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  28. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  29. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  30. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  31. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  32. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  33. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  34. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  35. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  36. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  37. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  38. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  39. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  40. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  41. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  42. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  43. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  44. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  45. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  46. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  47. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  48. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  49. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  50. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  51. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  52. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  53. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  54. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  55. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  56. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  57. package/adapters/claude/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  58. package/adapters/claude/olko-reflection/skills/self-critique/SKILL.md +167 -43
  59. package/adapters/claude/olko-reflection/skills/self-critique/scripts/claim-ledger.mjs +159 -0
  60. package/adapters/claude/olko-reflection/skills/self-critique/scripts/rule-store.mjs +193 -0
  61. package/adapters/codex/olko-creative/README.md +2 -0
  62. package/adapters/cursor/olko-creative/skills/carousel-maker/SKILL.md +112 -0
  63. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  64. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  65. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  66. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  67. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  68. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  69. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  70. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  71. package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  72. package/adapters/cursor/olko-creative/skills/shorts-animator/SKILL.md +113 -0
  73. package/adapters/cursor/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  74. package/adapters/cursor/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  75. package/adapters/cursor/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  76. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  77. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  78. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  79. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  80. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  81. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  82. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  83. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  84. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  85. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  86. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  87. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  88. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  89. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  90. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  91. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  92. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  93. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  94. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  95. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  96. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  97. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  98. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  99. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  100. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  101. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  102. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  103. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  104. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  105. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  106. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  107. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  108. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  109. package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  110. package/adapters/cursor/olko-reflection/skills/self-critique/SKILL.md +167 -43
  111. package/adapters/cursor/olko-reflection/skills/self-critique/scripts/claim-ledger.mjs +159 -0
  112. package/adapters/cursor/olko-reflection/skills/self-critique/scripts/rule-store.mjs +193 -0
  113. package/adapters/grok/olko-creative/skills/carousel-maker/SKILL.md +112 -0
  114. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  115. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  116. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  117. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  118. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  119. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  120. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  121. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  122. package/adapters/grok/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  123. package/adapters/grok/olko-creative/skills/shorts-animator/SKILL.md +113 -0
  124. package/adapters/grok/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  125. package/adapters/grok/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  126. package/adapters/grok/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  127. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  128. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  129. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  130. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  131. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  132. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  133. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  134. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  135. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  136. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  137. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  138. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  139. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  140. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  141. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  142. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  143. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  144. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  145. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  146. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  147. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  148. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  149. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  150. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  151. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  152. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  153. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  154. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  155. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  156. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  157. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  158. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  159. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  160. package/adapters/grok/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  161. package/adapters/grok/olko-reflection/skills/self-critique/SKILL.md +167 -43
  162. package/adapters/grok/olko-reflection/skills/self-critique/scripts/claim-ledger.mjs +159 -0
  163. package/adapters/grok/olko-reflection/skills/self-critique/scripts/rule-store.mjs +193 -0
  164. package/adapters/hermes/olko-creative/README.md +2 -0
  165. package/catalog/skills.json +47 -1
  166. package/docs/superpowers/plans/2026-10-27-self-critique-v2.md +306 -0
  167. package/docs/superpowers/specs/2026-10-27-self-critique-v2-spec.md +104 -0
  168. package/package.json +1 -1
  169. package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
  170. package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
  171. package/plugins/olko-creative/skills/carousel-maker/SKILL.md +111 -0
  172. package/plugins/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
  173. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
  174. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
  175. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
  176. package/plugins/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
  177. package/plugins/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
  178. package/plugins/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
  179. package/plugins/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
  180. package/plugins/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
  181. package/plugins/olko-creative/skills/shorts-animator/SKILL.md +112 -0
  182. package/plugins/olko-creative/skills/shorts-animator/references/kit.md +59 -0
  183. package/plugins/olko-creative/skills/shorts-animator/references/looks.md +32 -0
  184. package/plugins/olko-creative/skills/shorts-animator/references/writing.md +9 -0
  185. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
  186. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
  187. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
  188. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
  189. package/plugins/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
  190. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
  191. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
  192. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
  193. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
  194. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
  195. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
  196. package/plugins/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
  197. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
  198. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
  199. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
  200. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
  201. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
  202. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
  203. package/plugins/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
  204. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
  205. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
  206. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
  207. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
  208. package/plugins/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
  209. package/plugins/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
  210. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
  211. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
  212. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
  213. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
  214. package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
  215. package/plugins/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
  216. package/plugins/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
  217. package/plugins/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
  218. package/plugins/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
  219. package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
  220. package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
  221. package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
  222. package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
  223. package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
  224. package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
  225. package/plugins/olko-reflection/skills/self-critique/SKILL.md +167 -43
  226. package/plugins/olko-reflection/skills/self-critique/scripts/claim-ledger.mjs +159 -0
  227. package/plugins/olko-reflection/skills/self-critique/scripts/rule-store.mjs +193 -0
  228. package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
  229. package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
  230. package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
  231. 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>/` |
@@ -1,7 +1,7 @@
1
1
  <!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->
2
2
 
3
3
  ---
4
- description: "Adversarially critique your own last answer: spawn a critic agent that verifies claims against live sources, finds the related issue or pattern you missed, then loop until satisfied and report where you were wrong, iterations-to-satisfy, the numeric improvement, and a final score."
4
+ description: "Adversarially critique your own last answer: a blind critic agent re-derives and verifies every claim against live sources, the score is computed from a labelled claim ledger, you revise under a ratchet, restate the corrected answer, and turn each caught error into a durable rule with a fire counter."
5
5
  ---
6
6
 
7
7
  Use the olko:self-critique skill.
@@ -33,40 +33,102 @@ durable rule has bought every answer after it.
33
33
  Do not use for trivial one-shot replies or simple chat. The overhead only pays off on load-bearing
34
34
  answers.
35
35
 
36
+ **Standalone Cursor installation.** Use the generated Cursor adapter or the full skill package,
37
+ including its `scripts/` directory. Copying only `SKILL.md` is insufficient for this workflow,
38
+ which calls the bundled scripts.
39
+
36
40
  ## Procedure
37
41
 
38
- 1. **Snapshot the target.** Capture your last substantial answer verbatim, plus the concrete claims
39
- it makes and the source each claim rests on. This is `v1`.
42
+ 1. **Snapshot the target.** Capture your last substantial answer verbatim and the original task
43
+ text. This is `v1`.
40
44
 
41
- Write the claim list before you re-read the answer's prose, and put a real receipt against each
45
+ Write your claim list before you re-read the answer's prose, and put a real receipt against each
42
46
  claim: a quoted field, a `file:line` whose body you actually opened, a command and its output.
43
- A claim you cannot receipt at snapshot time is already a finding - mark it `unverified` yourself
47
+ A claim you cannot receipt at snapshot time is already a finding - mark it `unverifiable` yourself
44
48
  rather than waiting for the critic to find it. Grep output, a file name, a path, an endpoint
45
49
  string, or the behaviour of a sibling module are not receipts for what code does; they prove
46
50
  those things exist, not what they do.
47
51
 
48
- 2. **Spawn the critic.** Launch one independent agent with live-source access (issue tracker, code
49
- host, error monitor, the repo). Use the prompt template below. The critic must return: `score`
50
- (0-100), `verdict` (AGREE / AGREE-WITH-CAVEATS / DISAGREE), `where_wrong` (list), `missed`
51
- (related issues or patterns you failed to surface), `unverifiable` (claims it could not confirm),
52
- `fixes` (ranked, actionable), and `shapes` (the reusable class of reasoning behind each
53
- `where_wrong` item, which Step 5 turns into the rule).
54
-
55
- 3. **Decide and loop.** Stop if `score >= 90` OR no actionable `fixes` remain. Otherwise revise the
56
- answer using the fixes to produce `v2`, then re-spawn the critic to score `v2`. Repeat.
52
+ Save the list to `.self-critique/author-claims.json` as an array of
53
+ `{ id, text, load_bearing, receipt }`. Do NOT show it to the critic in round one.
54
+
55
+ **Replay pass.** Before spawning the critic, check the answer against every stored rule. Resolve
56
+ the memory dir as the auto-memory dir for the current project, else the repo's `.claude/memory`;
57
+ if neither exists, skip replay, evidence-check, and prune with a one-line note. Run
58
+ `node <skill>/scripts/rule-store.mjs checklist --dir <memory dir>`, then open each listed rule's
59
+ memory file and read its body before testing the answer against it. The checklist's names and
60
+ descriptions alone are insufficient. Tag each hit `(recurring)` in the report and record it with
61
+ `node <skill>/scripts/rule-store.mjs fire <name> --dir <memory dir> --date <today>`.
62
+ Fire counters and pruning apply only to rules in this memory directory. Rules routed to
63
+ `CLAUDE.md`, `AGENTS.md`, or the shared store are neither counted nor pruned.
64
+
65
+ 2. **Spawn the critic (blind).** Launch one independent agent with live-source access (issue tracker,
66
+ code host, error monitor, the repo). Round one input is the original task text and the answer
67
+ verbatim, nothing else: the critic extracts the claims itself and never sees your list or sources.
68
+ Use the prompt template below. The critic must return one fenced JSON block with `claims` (its own
69
+ list, each `{ text, load_bearing, status, checked_by, receipt }`), `missed`, `where_wrong`,
70
+ `shapes` and `verdict` (AGREE / AGREE-WITH-CAVEATS / DISAGREE). There is no `score` field: the
71
+ score is computed in Step 2b.
72
+
73
+ 2b. **Merge into the ledger.** Match the critic's claims to yours by meaning and set `origin` on
74
+ each: `both`, `author` (only you found it), `critic` (only the critic found it). Every critic
75
+ finding with `checked_by: inferred` must be re-verified by you before it may become `verified`
76
+ or `refuted`; if you cannot verify it, it stays `inferred`. Both statuses require
77
+ `checked_by: command` or `checked_by: read` and a non-empty receipt; validation rejects inferred evidence or a missing
78
+ receipt. Save `.self-critique/ledger-v1.json`, then run
79
+ `node <skill>/scripts/claim-ledger.mjs score .self-critique/ledger-v1.json` and
80
+ `node <skill>/scripts/claim-ledger.mjs summary .self-critique/ledger-v1.json` (an invalid ledger
81
+ exits 2 and prints the errors as JSON).
82
+ Claims found by only one side are reported under their own heading, "Asymmetric claims".
83
+
84
+ Ledger shape (`version` is always `1`):
85
+
86
+ ```json
87
+ { "version": 1,
88
+ "claims": [{ "id": "c1", "text": "...", "load_bearing": true, "origin": "both",
89
+ "status": "verified", "checked_by": "command", "receipt": "quoted output" }],
90
+ "missed": [{ "id": "m1", "text": "...", "load_bearing": false, "checked_by": "read" }] }
91
+ ```
92
+
93
+ - `origin`: `author` | `critic` | `both`
94
+ - `status`: `verified` | `refuted` | `unverifiable` | `inferred`
95
+ - `checked_by`: `command` (run, output quoted) | `read` (file or record opened, quoted) |
96
+ `inferred` (reasoning only). Required on `missed` items too; an `inferred` missed item is not
97
+ penalised. A `verified` or `refuted` claim may not use inferred evidence and requires a
98
+ non-empty receipt.
99
+
100
+ 3. **Decide and loop.** Accept a score of at least 90 only after all fixable findings are resolved
101
+ or explicitly qualified in the answer and report; otherwise continue the critique loop. Stop
102
+ when that condition holds, OR no ledger item is left that a revision could fix, OR 3 rounds have run.
103
+ Otherwise revise the answer to produce `v2`, write `ledger-v2.json`, and run
104
+ `node <skill>/scripts/claim-ledger.mjs ratchet .self-critique/ledger-v1.json .self-critique/ledger-v2.json`
105
+ on the previous and new ledger: a lower re-score discards the revision, and you keep the winner. Round
106
+ two and later hand the critic your receipts for the still-open claims (it is no longer blind).
57
107
  **Hard cap: 3 critic rounds.** (A known ceiling: raise it only if a round is still finding real,
58
108
  fixable defects.)
59
109
 
60
- 4. **Report, always, even after a single round:**
110
+ **Cost.** The critic runs on a mid-tier model (Sonnet class) by default. Escalate one tier only
111
+ when a mid-tier round found nothing and the answer is load-bearing. When the budget is tight,
112
+ verify load-bearing claims first.
113
+
114
+ 4. **Report, always, even after a single round.** In this order:
115
+ - **Corrected answer (`v_final`)** - restated in full, not as a diff, so the user can act on it
116
+ without reading anything else. After a single round with no revision, restate `v1` unchanged.
117
+ - **Claim ledger** - run `node <skill>/scripts/claim-ledger.mjs summary <ledger for v_final>`
118
+ and `node <skill>/scripts/claim-ledger.mjs score <ledger for v_final>` using the ledger for
119
+ whichever version the ratchet accepted (for example, `.self-critique/ledger-v2.json`). Report
120
+ that table and its computed score.
61
121
  - **Where you were wrong** - consolidated, each item with the receipt the critic cited.
62
- - **Iterations to satisfy** - how many critic rounds it took to reach the stop condition (1 means
63
- it was solid on the first pass).
64
- - **Improvement in numbers** - the score trajectory, for example `72 -> 88 -> 94 (+22 pts, +31%)`.
65
- If only one round ran, state `no revision needed`.
66
- - **Final score** - the critic's last score and verdict.
122
+ - **Asymmetric claims** - claims only you found, and claims only the critic found.
123
+ - **Recurring rules fired** - each stored rule the replay pass hit, with its new `fires` count.
124
+ - **Iterations to satisfy** - how many critic rounds it took (1 means it was solid first pass).
125
+ - **Score trajectory** - for example `72 -> 88 -> 94 (+22 pts)`, all computed scores. If only one
126
+ round ran, state `no revision needed`.
67
127
  - **Unverifiable** - anything you should not present as fact.
68
- - **Declined fixes** - any ranked fix you chose not to take, and the reason. Silently dropping a
69
- fix looks identical to missing it.
128
+ - **Declined findings** - ledger items you chose not to fix, with the reason. Silently dropping
129
+ one looks identical to missing it.
130
+ - **Rules written** - where each rule went and what it says (see Step 5).
131
+ - **Rules proposed for deletion** - the candidates from the prune pass, or `none`.
70
132
 
71
133
  5. **Convert the outcome into a durable rule.** See below. Skipping this step is what makes the
72
134
  same critique necessary again next week.
@@ -117,31 +179,50 @@ Before writing to shared persistence, redact the incident evidence, including wh
117
179
  `context-repo` or `shared-knowledge-artifact`, while still including the incident and its dated
118
180
  receipt. This redaction requirement does not apply to local agent memory or repository-rule writes.
119
181
 
120
- **Dedupe before writing.** Read the store first. If a rule of the same shape exists, sharpen it and
121
- add this incident as further evidence rather than creating a second entry. Link related rules
122
- instead of restating them.
182
+ **Dedupe before writing.** Read the store first. If a rule of the same shape exists, add one dated
183
+ evidence line to it instead of creating a second entry, with at most three evidence lines per rule.
184
+ A fourth incident means the rule named the incident, not the shape: rewrite the rule text and keep
185
+ the three most recent evidence lines. Link related rules instead of restating them. Only when the
186
+ memory directory resolved in Step 1 exists, run
187
+ `node <skill>/scripts/rule-store.mjs evidence-check --dir <memory dir>` before writing and report
188
+ any rule it flags. Skip this command when neither supported memory directory exists.
189
+
190
+ **Memory rule identity and counters.** Mark each rule stored by this workflow with
191
+ `rule_store: self-critique` under `metadata:` in its memory file's frontmatter. Mark an existing
192
+ rule only after reading it and confirming it belongs to this workflow. Only marked rules are
193
+ pruning candidates; unrelated project and user memories are excluded. A memory rule's `fires` and
194
+ `last_fired` live under `metadata:` and are written only by `fire`. Rules routed to `CLAUDE.md`,
195
+ `AGENTS.md`, or the shared store are neither counted nor pruned.
196
+
197
+ **Prune pass.** At the end of this step, only when a valid memory directory is available, run
198
+ `node <skill>/scripts/rule-store.mjs prune --dir <memory dir> --idle-days 60`. List the candidates
199
+ in the report under "Rules proposed for deletion". Skip this command when neither supported memory
200
+ directory exists. Never delete a rule without the user's reply.
123
201
 
124
202
  **Then close the loop.** State in your report where the rule was written and what it says, so the
125
203
  user can veto it. A rule the user has not seen is a rule they cannot correct.
126
204
 
127
205
  ## Critic prompt template
128
206
 
129
- Pass this to the critic agent, filling in the two placeholders. It is deliberately adversarial:
207
+ Pass this to the critic agent, filling in the two placeholders (`{{TASK}}`, `{{ANSWER}}`). It is deliberately adversarial:
130
208
  the default stance is that the answer is wrong until a live source proves otherwise.
131
209
 
132
210
  > You are an adversarial reviewer. Your job is to verify and, where possible, **refute** the answer
133
211
  > below. Default to skepticism: assume a claim is wrong until a live source proves it. Address every
134
212
  > comment **directly to the author** ("You claimed X; the source says Y").
135
213
  >
214
+ > **The task the author was given (verbatim):**
215
+ > {{TASK}}
216
+ >
136
217
  > **The answer under review (verbatim):**
137
218
  > {{ANSWER}}
138
219
  >
139
- > **Its claims and the source each rests on:**
140
- > {{CLAIMS_AND_SOURCES}}
220
+ > You are not given the author's claims or sources. Extract the claims yourself.
141
221
  >
142
222
  > **Do this:**
143
- > 1. Re-verify every claim against the **live** source (issue tracker / code host / error monitor /
144
- > the repo) - never trust the answer's own summary. Quote the field, line, PR body, or issue you
223
+ > 1. List every claim the answer makes, marking each `load_bearing` (the user would act on it).
224
+ > Re-verify each against the **live** source (issue tracker / code host / error monitor / the
225
+ > repo) - never trust the answer's own summary. Quote the field, line, PR body, or issue you
145
226
  > checked.
146
227
  > 2. **Check similar and related issues, and find patterns.** Is this part of a cluster? Is there a
147
228
  > closer sibling, parent epic, or duplicate the answer should have surfaced but did not? Name it
@@ -151,19 +232,62 @@ the default stance is that the answer is wrong until a live source proves otherw
151
232
  > a proven root cause?
152
233
  > 4. List exactly **where the author was wrong or imprecise**, and what they **missed**.
153
234
  > 5. Flag any claim you **could not verify** so it is not presented as fact.
235
+ > 6. Label every finding with `checked_by`: `command` (you ran it and quote the output), `read` (you
236
+ > opened the file or record and quote it), `inferred` (reasoning only).
154
237
  >
155
- > **Output, terse, with a receipt for every line:**
156
- > - `verdict`: AGREE | AGREE-WITH-CAVEATS | DISAGREE
157
- > - `score`: 0-100 (rubric: 100 = every claim verified, nothing missed, confidence correctly
158
- > calibrated; subtract for each unverified claim, each missed sibling or pattern, and each
159
- > over- or under-statement)
160
- > - `where_wrong`: bullet list, each with its source receipt
161
- > - `missed`: related issues or patterns the author failed to surface, with IDs
162
- > - `unverifiable`: claims that need a source you do not have
163
- > - `fixes`: ranked, actionable - what to change to raise the score
238
+ > **Output, terse, one fenced JSON block, a receipt for every item:**
239
+ > - `claims`: your own list, each `{ text, load_bearing, status, checked_by, receipt }` with `status`
240
+ > one of `verified` | `refuted` | `unverifiable` | `inferred`
241
+ > - `missed`: related issues or patterns the author failed to surface, each
242
+ > `{ text, load_bearing, checked_by, receipt }`, with IDs
243
+ > - `where_wrong`: bullet list, each with its source receipt and `checked_by`
164
244
  > - `shapes`: for each item in `where_wrong`, the class of reasoning that produced it, stated so it
165
245
  > would apply to a different task ("a conclusion drawn from evidence that does not cover the
166
246
  > claim"), not the incident itself. Say `one-off` when the error has no reusable shape.
247
+ > - `verdict`: AGREE | AGREE-WITH-CAVEATS | DISAGREE
248
+ >
249
+ > Do not output a score. It is computed from your claims.
250
+
251
+ ### Score anchors
252
+
253
+ The score is `100` minus penalties, floored at 0. Calibrate against these three ledgers (all claims
254
+ `origin: both`; `node <skill>/scripts/claim-ledger.mjs anchors` prints them as JSON).
255
+
256
+ **Strong, score 95**
257
+
258
+ | id | load_bearing | status | checked_by |
259
+ | --- | --- | --- | --- |
260
+ | a1 | no | inferred | inferred |
261
+
262
+ **Middling, score 72**
263
+
264
+ | id | load_bearing | status | checked_by |
265
+ | --- | --- | --- | --- |
266
+ | b1 | no | refuted | read |
267
+ | b2 | no | refuted | read |
268
+ | b3 | no | unverifiable | read |
269
+ | b4 | no | unverifiable | read |
270
+
271
+ **Weak, score 40**
272
+
273
+ | id | load_bearing | status | checked_by |
274
+ | --- | --- | --- | --- |
275
+ | c1 | yes | refuted | read |
276
+ | c2 | yes | refuted | read |
277
+ | c3 | yes | unverifiable | read |
278
+
279
+ Penalties:
280
+
281
+ | Finding | Points off |
282
+ | --- | --- |
283
+ | refuted, load-bearing | 25 |
284
+ | refuted | 10 |
285
+ | unverifiable, load-bearing | 10 |
286
+ | unverifiable | 4 |
287
+ | inferred, accepted | 5 |
288
+ | missed, load-bearing | 15 |
289
+ | missed | 5 |
290
+ | verified but found only by the critic | 5 |
167
291
 
168
292
  ## Optional: auto-offer via a Claude Code Stop hook
169
293
 
@@ -209,10 +333,10 @@ message.
209
333
  `iterations: 1, no revision needed` and the single score rather than forcing a revision.
210
334
  - Diversity beats redundancy: if a claim can fail in more than one way, give the critic distinct
211
335
  lenses (correctness, completeness, does-it-reproduce) instead of repeating the same check.
212
- - The critic verifies against live sources; it does not rewrite the answer. You revise; it re-scores.
213
- - Re-score by messaging the same critic rather than spawning a fresh one, and hand it the receipts
214
- for whatever it could not verify in the earlier round, so round two spends its budget on the
215
- claims still standing instead of re-deriving the ones already settled.
336
+ - The critic verifies against live sources; it does not rewrite the answer or score it. You revise;
337
+ the score is recomputed from the ledger.
338
+ - In round two, hand the critic your receipts for the claims still open, so it spends its budget on
339
+ the claims still standing instead of re-deriving the ones already settled.
216
340
  - A critic finding you disagree with is worth one challenge. Put the reasoning to it and let it rule;
217
341
  if it concedes, that is a real answer for the report, and the reasoning is what the user needs to
218
342
  see either way.
@@ -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>/` |