@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.
- package/.github/copilot-instructions.md +2 -0
- package/.github/prompts/carousel-maker.prompt.md +102 -0
- package/.github/prompts/shorts-animator.prompt.md +103 -0
- package/.kiro/steering/carousel-maker.md +101 -0
- package/.kiro/steering/shorts-animator.md +102 -0
- package/.windsurf/rules/carousel-maker.md +100 -0
- package/.windsurf/rules/shorts-animator.md +101 -0
- package/README.md +4 -2
- package/adapters/claude/olko-creative/skills/carousel-maker/SKILL.md +112 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
- package/adapters/claude/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/SKILL.md +113 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/references/kit.md +59 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/references/looks.md +32 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/references/writing.md +9 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
- package/adapters/claude/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
- package/adapters/codex/olko-creative/README.md +2 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/SKILL.md +112 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
- package/adapters/cursor/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/SKILL.md +113 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/references/kit.md +59 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/references/looks.md +32 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/references/writing.md +9 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
- package/adapters/cursor/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/SKILL.md +112 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
- package/adapters/grok/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/SKILL.md +113 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/references/kit.md +59 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/references/looks.md +32 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/references/writing.md +9 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
- package/adapters/grok/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
- package/adapters/hermes/olko-creative/README.md +2 -0
- package/catalog/skills.json +46 -0
- package/package.json +1 -1
- package/plugins/olko-apple-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-creative/skills/carousel-maker/SKILL.md +111 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/cm.ts +220 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/domain/check.ts +68 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/domain/layout.ts +75 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/domain/schema.ts +54 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/domain/types.ts +33 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/edge/io.ts +87 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/package.json +4 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/test/domain.test.ts +99 -0
- package/plugins/olko-creative/skills/carousel-maker/scripts/tsconfig.json +16 -0
- package/plugins/olko-creative/skills/shorts-animator/SKILL.md +112 -0
- package/plugins/olko-creative/skills/shorts-animator/references/kit.md +59 -0
- package/plugins/olko-creative/skills/shorts-animator/references/looks.md +32 -0
- package/plugins/olko-creative/skills/shorts-animator/references/writing.md +9 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/audio/compose.ts +290 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/audio/dsp.ts +193 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/audio/instruments.ts +185 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/audio/master.ts +55 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/audio/soundtrack.ts +119 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/captions.ts +35 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/check.ts +96 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/look.ts +26 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/patch.ts +38 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/schema.ts +81 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/timeline.ts +75 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/domain/types.ts +91 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/chrome.ts +169 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/doctor.ts +52 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/media.ts +105 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/page.ts +53 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/probe.ts +75 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/sound.ts +46 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/edge/voice.ts +183 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/looks/gouache.json +7 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/looks/ink.json +6 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/looks/oil.json +7 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/looks/pastel.json +7 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/looks/watercolor.json +6 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/package.json +4 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/globals.d.ts +199 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/kit.ts +856 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/paint.ts +268 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/stage.ts +181 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/runtime/tsconfig.json +12 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/sa.ts +262 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/test/domain.test.ts +107 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/tsconfig.json +16 -0
- package/plugins/olko-creative/skills/shorts-animator/scripts/tts.py +20 -0
- package/plugins/olko-garmin-kit/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-git-tools/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-github-pr/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-obsidian/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-product/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-reflection/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-release/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-skill-meta/.claude-plugin/plugin.json +1 -1
- package/plugins/olko-web-ops/.claude-plugin/plugin.json +1 -1
- 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-
|
|
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 (
|
|
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
|
|