@aicopycoders/exodus 2026.6.2400

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 (114) hide show
  1. package/assets/references/awareness-framework.md +156 -0
  2. package/assets/references/cast-video.md +165 -0
  3. package/assets/references/copy-blocks.md +138 -0
  4. package/assets/references/creative-strategy.md +990 -0
  5. package/assets/references/editing-rules.md +81 -0
  6. package/assets/references/hook-quality-checklist.md +153 -0
  7. package/assets/references/iterations.md +73 -0
  8. package/assets/references/scrawls.md +483 -0
  9. package/assets/references/segments.md +79 -0
  10. package/assets/skills/exodus/SKILL.md +50 -0
  11. package/assets/skills/exodus-brand/SKILL.md +117 -0
  12. package/assets/skills/exodus-browse/SKILL.md +96 -0
  13. package/assets/skills/exodus-creative/SKILL.md +94 -0
  14. package/assets/skills/exodus-drive/SKILL.md +118 -0
  15. package/assets/skills/exodus-foundation/SKILL.md +170 -0
  16. package/assets/skills/exodus-genesis/SKILL.md +159 -0
  17. package/assets/skills/exodus-idea/SKILL.md +78 -0
  18. package/assets/skills/exodus-image/SKILL.md +224 -0
  19. package/assets/skills/exodus-meme/SKILL.md +183 -0
  20. package/assets/skills/exodus-primer/SKILL.md +145 -0
  21. package/assets/skills/exodus-strategist/SKILL.md +217 -0
  22. package/assets/skills/exodus-swipe/SKILL.md +85 -0
  23. package/assets/skills/exodus-template/SKILL.md +106 -0
  24. package/assets/skills/exodus-write/SKILL.md +157 -0
  25. package/assets/skills/genesis-bots/.env.example +12 -0
  26. package/assets/skills/genesis-bots/README.txt +29 -0
  27. package/assets/skills/genesis-bots/SKILL.md +219 -0
  28. package/assets/skills/genesis-bots/scripts/genesis-stream.mjs +307 -0
  29. package/assets/skills/genesis-bots/scripts/genesis-stream.py +220 -0
  30. package/dist/bin/exodus.d.ts +2 -0
  31. package/dist/bin/exodus.js +177 -0
  32. package/dist/commands/__tests__/genesis.hookgate.test.d.ts +1 -0
  33. package/dist/commands/__tests__/genesis.hookgate.test.js +12 -0
  34. package/dist/commands/brand.d.ts +24 -0
  35. package/dist/commands/brand.js +292 -0
  36. package/dist/commands/browse.d.ts +9 -0
  37. package/dist/commands/browse.js +132 -0
  38. package/dist/commands/creative.d.ts +2 -0
  39. package/dist/commands/creative.js +223 -0
  40. package/dist/commands/doctor.d.ts +21 -0
  41. package/dist/commands/doctor.js +590 -0
  42. package/dist/commands/drive.d.ts +2 -0
  43. package/dist/commands/drive.js +154 -0
  44. package/dist/commands/foundation.d.ts +2 -0
  45. package/dist/commands/foundation.js +468 -0
  46. package/dist/commands/genesis.d.ts +64 -0
  47. package/dist/commands/genesis.js +564 -0
  48. package/dist/commands/idea.d.ts +53 -0
  49. package/dist/commands/idea.js +333 -0
  50. package/dist/commands/image.d.ts +2 -0
  51. package/dist/commands/image.js +249 -0
  52. package/dist/commands/init.d.ts +13 -0
  53. package/dist/commands/init.js +70 -0
  54. package/dist/commands/keys.d.ts +2 -0
  55. package/dist/commands/keys.js +101 -0
  56. package/dist/commands/meme.d.ts +12 -0
  57. package/dist/commands/meme.js +272 -0
  58. package/dist/commands/migrate.d.ts +3 -0
  59. package/dist/commands/migrate.js +158 -0
  60. package/dist/commands/primer.d.ts +2 -0
  61. package/dist/commands/primer.js +540 -0
  62. package/dist/commands/read-doc.d.ts +3 -0
  63. package/dist/commands/read-doc.js +62 -0
  64. package/dist/commands/status.d.ts +6 -0
  65. package/dist/commands/status.js +205 -0
  66. package/dist/commands/swipe.d.ts +2 -0
  67. package/dist/commands/swipe.js +398 -0
  68. package/dist/commands/template.d.ts +2 -0
  69. package/dist/commands/template.js +225 -0
  70. package/dist/commands/whoami.d.ts +2 -0
  71. package/dist/commands/whoami.js +51 -0
  72. package/dist/lib/ad-library-write.d.ts +15 -0
  73. package/dist/lib/ad-library-write.js +67 -0
  74. package/dist/lib/assets.d.ts +3 -0
  75. package/dist/lib/assets.js +23 -0
  76. package/dist/lib/backend-hint.d.ts +2 -0
  77. package/dist/lib/backend-hint.js +22 -0
  78. package/dist/lib/cc-command.d.ts +1 -0
  79. package/dist/lib/cc-command.js +13 -0
  80. package/dist/lib/client.d.ts +23 -0
  81. package/dist/lib/client.js +213 -0
  82. package/dist/lib/format.d.ts +8 -0
  83. package/dist/lib/format.js +172 -0
  84. package/dist/lib/intel-format.d.ts +1 -0
  85. package/dist/lib/intel-format.js +38 -0
  86. package/dist/lib/keys-sync.d.ts +16 -0
  87. package/dist/lib/keys-sync.js +88 -0
  88. package/dist/lib/layout.d.ts +38 -0
  89. package/dist/lib/layout.js +153 -0
  90. package/dist/lib/load-env.d.ts +1 -0
  91. package/dist/lib/load-env.js +47 -0
  92. package/dist/lib/pixar-orchestrator-types.d.ts +54 -0
  93. package/dist/lib/pixar-orchestrator-types.js +1 -0
  94. package/dist/lib/poll.d.ts +14 -0
  95. package/dist/lib/poll.js +32 -0
  96. package/dist/lib/preflight.d.ts +18 -0
  97. package/dist/lib/preflight.js +56 -0
  98. package/dist/lib/prompts.d.ts +9 -0
  99. package/dist/lib/prompts.js +99 -0
  100. package/dist/lib/reel-write.d.ts +14 -0
  101. package/dist/lib/reel-write.js +59 -0
  102. package/dist/lib/release.d.ts +4 -0
  103. package/dist/lib/release.js +81 -0
  104. package/dist/lib/scaffold.d.ts +8 -0
  105. package/dist/lib/scaffold.js +67 -0
  106. package/dist/lib/scout-hydrate.d.ts +1 -0
  107. package/dist/lib/scout-hydrate.js +10 -0
  108. package/dist/lib/state.d.ts +6 -0
  109. package/dist/lib/state.js +49 -0
  110. package/dist/lib/template-constants.d.ts +4 -0
  111. package/dist/lib/template-constants.js +85 -0
  112. package/dist/lib/version.d.ts +1 -0
  113. package/dist/lib/version.js +19 -0
  114. package/package.json +30 -0
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: exodus-write
3
+ description: The front door for writing ad copy with Luke's Genesis process inside Exodus. It figures out where the user is (new brand → onboarding, brief in hand → write, want to rerun → exodus-browse), walks the brief → genesis → Google Doc flow end to end, and hands off to the exodus-genesis skill for the actual writing pass; it routes — it doesn't replace the exodus-genesis/exodus-foundation skills, it sequences them. Only invoke when the user has explicitly invoked Exodus and hasn't named a specific pipeline: they said "exodus" in the request ("exodus, write me some ads", "exodus, I have a brief", "exodus, turn this winning ad into copy"), named this skill or /exodus-write, ran an `npx exodus` command, or the `exodus` hub skill routed here. Never claim generic copywriting requests ("write me some ads", "help me write hooks") — in shared folders those may belong to the user's other tools; if the user did not say exodus, this skill is not for them. The bare word "Genesis" without "exodus" refers to the member's own Genesis API key and personal bot recipes, NOT to Exodus — do not hijack it into this flow.
4
+ ---
5
+
6
+ # Write — The Guided Copywriting Flow
7
+
8
+ This is the single entry point for "write me ad copy the Genesis way." It sequences the existing pieces — brand → foundation → brief → genesis → Google Doc — so the user never has to know which command runs when. You stay in `exodus-strategist` the whole time (persona, operating rules, creative principles). Per that persona: **recommend the strategy, menu the run.** You own the creative calls — the awareness read, the angle, the brief itself — so state those and move; the user owns the run's knobs (how many passes), so present those as a quick menu, the way the `exodus-image` skill does for static images. Reach into `exodus-genesis` and `exodus-foundation` for the heavy lifting, and `exodus-strategist`'s Framework Index for depth; this skill is the conductor.
9
+
10
+ The job, every awareness level, every brand: **install the mechanism → create desire → bridge to the product.** Only the starting place changes.
11
+
12
+ ---
13
+
14
+ ## First-Message Routing — Figure Out Where They Are
15
+
16
+ Don't interrogate. Read the opening message + run `npx @aicopycoders/exodus brand current` and `npx @aicopycoders/exodus foundation status`, then route:
17
+
18
+ | Signal | Route to |
19
+ |---|---|
20
+ | New brand, or `foundation status` shows missing fields | **Onboard** (below), then Write |
21
+ | They pasted a winning ad / gave an idea / have a brief | **Write** (skip onboarding if foundation is ✓ Ready) |
22
+ | "rerun", "tweak that", "make a variant", references a past run | **Rerun** — `npx @aicopycoders/exodus browse`, then the genesis editing menu |
23
+ | Pure question about an angle/hook/awareness call | Answer from `exodus-strategist`'s Framework Index + `references/`; offer to write it |
24
+
25
+ State your read in one line ("New brand, no foundation yet — setting that up first, then we write") and move. The user redirects if you misread.
26
+
27
+ ---
28
+
29
+ ## Stage A — Onboard (only when the brand isn't ready yet)
30
+
31
+ A brand needs one thing before any pipeline runs: a ready foundation. The default, fastest on-ramp is the **primer** — a single document built from the brand's winning ads that unlocks every pipeline. Check readiness first:
32
+
33
+ ```bash
34
+ npx @aicopycoders/exodus primer status # always first — is this brand ready?
35
+ ```
36
+
37
+ **Primer-first (the default).** If the user has winning ads, build the primer — one doc, one pass, every pipeline unlocked. Hand off to the `exodus-primer` skill: it runs a one-pass intake (product facts + winning ads) → build → save → verify. Don't re-implement it here.
38
+
39
+ **No winning ads, or a legacy 2-track setup?** Fall back to the `exodus-foundation` skill. It extracts audience concerns + the two awareness primers from a brand doc / URL / notes and satisfies the same readiness gate. Fill what's missing via its three paths (paste structured markdown → `foundation save -`; one field → `foundation set <field>`; raw source → interactive walkthrough). The fields:
40
+
41
+ - `audienceConcerns` — who you're talking to and what keeps them up at night
42
+ - `primerUnawareProblemAware` — the **cold** primer (winning ads for unaware / problem-aware)
43
+ - `primerSolutionProductAware` — the **warm** primer (winning ads for solution / product-aware)
44
+ - `brandVoice` — optional voice guide
45
+
46
+ ### The primer — the highest-leverage input
47
+
48
+ Winning ads are the highest-leverage input: they teach the bots what "good" looks like for this market (see `references/hook-quality-checklist.md` for what makes an ad primer-worthy). The better the examples, the better every hook and body-copy variant. The **`exodus-primer` skill** is the clean way to turn a brand's winning ads into that document in one pass — prefer it for any brand that has winners to paste.
49
+
50
+ If a brand instead arrives with **finished primer text already prepared** — a packaged set of winning ads + examples per awareness band — you can paste it straight into the matching foundation field, no rebuild needed:
51
+
52
+ ```bash
53
+ # cold (unaware / problem-aware) winning ads:
54
+ pbpaste | npx @aicopycoders/exodus foundation set primerUnawareProblemAware --stdin
55
+ # warm (solution / product-aware) winning ads:
56
+ pbpaste | npx @aicopycoders/exodus foundation set primerSolutionProductAware --stdin
57
+ ```
58
+
59
+ **Works without it.** If there's no primer prompt yet, don't block — Genesis falls back to sensible defaults and still produces copy. Tell the user plainly: "We can write now; output gets noticeably sharper once you add winning examples to the foundation." Then proceed. Adding the primer later and re-running is cheap.
60
+
61
+ Confirm `foundation status` shows the fields you set, then move to Write.
62
+
63
+ ---
64
+
65
+ ## Stage B — Write the Brief (Stage 4 of Luke's process)
66
+
67
+ Genesis takes a **brief**, not raw copy. A brief is a 1–2 paragraph natural-language *description* of the ad — not the ad itself. Most of the time you write this yourself from what the user gave you; surface it for a quick gut-check before running.
68
+
69
+ **A brief covers:** what the ad is about · what happens in it · the emotional core (heartbreak, rage, shame, mischief…) · the mechanism bridge to the product · the tone · why it's interesting / what makes it vicious.
70
+
71
+ **A brief is NOT:** the actual copy · a hook list · a format spec (don't say "video/static") · over-specified (leave the bots room).
72
+
73
+ Format:
74
+
75
+ ```
76
+ BRIEF: "[short evocative title]"
77
+ Hook: "[verbatim hook if from a swipe/organic source, else a hook DIRECTION or leave open]"
78
+ Source: [where the idea came from — a winning ad, a comment, an angle]
79
+ [1–2 paragraphs describing the ad: scenario, emotional core, mechanism bridge, tone, why it works]
80
+ ```
81
+
82
+ See `references/awareness-framework.md` for the brief→primer mapping and worked brief examples. For hook direction and the vicious standard, see `references/hook-quality-checklist.md`.
83
+
84
+ ### Extract seeds when there's a source ad
85
+
86
+ If the user pasted a winning ad, mine it for **seeds** — creative angles to carry into the run (a ritual to transfer, a "it's not X, it's Y" reframe, a buried line worth promoting to the hook). One per line:
87
+
88
+ ```
89
+ Coffee = morning ritual — swap to gym, sex, alcohol tolerance
90
+ "It's not low T..." — reframe to "too high cortisol"
91
+ Mechanism-heavy structure — replicate it
92
+ ```
93
+
94
+ Save to `/tmp/genesis-seeds.txt` or pass inline via `--seeds`. Skip seeds when there's no source ad — the brief carries it.
95
+
96
+ ### Classify awareness
97
+
98
+ Pick ONE level — don't ask the user to choose, state your read:
99
+
100
+ | Level | Starting place |
101
+ |---|---|
102
+ | **Unaware** | symptom / curiosity / hidden problem |
103
+ | **Problem-aware** | known problem, reframe the cause (default when unsure) |
104
+ | **Solution-aware** | solution category, comparison, skepticism |
105
+ | **Product-aware** | product comparison, "why you over them" |
106
+
107
+ Awareness picks the primer; never mix buckets in one run. Detail in `references/awareness-framework.md`.
108
+
109
+ ---
110
+
111
+ ## Stage C — Pick the pass count, then run Genesis
112
+
113
+ Genesis writes in two voices — **MarioBot** and the **Infeed VSL bot**. The default is **one pass per bot = 2 variants** (1 Mario × Brand + 1 Infeed × Brand): the fastest read on both voices against the same brief. More passes widen coverage and bring in the Top-Ads-Biased primer.
114
+
115
+ How many passes is the user's call, not yours — so **menu it** (one AskUserQuestion call) rather than assuming. Lead with the recommended default:
116
+
117
+ - **1 pass — 2 variants (recommended)** — one Mario, one Infeed, on the brand primer. Fast.
118
+ - **2 passes — 4 variants** — adds a Mario + Infeed pair on the brand's top-performers primer.
119
+ - **3+ passes — 6+ variants** — a wider sprint; "Other" takes a custom number.
120
+
121
+ Skip the menu only if the user already said how many ("just give me two", "run a big batch"). Awareness you do *not* menu — that's your strategist call from Stage B; state it and move.
122
+
123
+ Hand off to the `exodus-genesis` skill — it owns the run (double-pass hooks, the built-in 15-point QA, the editing menu). Always background it; even the default run is ~12–15 min, past the 10-min foreground cap.
124
+
125
+ ```bash
126
+ # Default — 1 pass per bot = 2 variants:
127
+ npx @aicopycoders/exodus genesis run --brief "<brief>" --awareness <level>
128
+ # More coverage — 2 passes = 4 variants:
129
+ npx @aicopycoders/exodus genesis run --brief "<brief>" --awareness <level> --passes 2
130
+ # with seeds:
131
+ npx @aicopycoders/exodus genesis run --brief "<brief>" --seeds /tmp/genesis-seeds.txt --awareness <level> --passes 2
132
+ ```
133
+
134
+ > "Genesis run started at problem-aware — 1 pass per bot (2 variants: Mario × Brand + Infeed × Brand). I'll surface the Doc when it lands."
135
+
136
+ Quality is enforced inside the pipeline (Cleanup + QA — see the `exodus-genesis` skill): markdown stripped, bot commentary removed, body copy 700–1500 words, no hook repetition, clean 14pt Google Doc. You don't hand-clean output.
137
+
138
+ ---
139
+
140
+ ## Stage D — Deliver + Next Move
141
+
142
+ Per the **Default Post-Run Reporting** rule in `exodus-strategist`: surface the Doc URL + the variant breakdown + a 2-line take. At the default that's **V1 Mario × Brand, V2 Infeed × Brand**; with more passes, each added pass is another Mario + Infeed pair, and **pass 2 uses the Top-Ads-Biased primer**. Flag the Genesis-specific gotcha: if a 2nd pass was requested and the top-ads primer was empty, that pass's two variants silently fall back to the brand primer.
143
+
144
+ Don't auto-`read-doc` every variant. Pull the Doc (`npx @aicopycoders/exodus read-doc <runId>`) only to critique hooks, pick a winner for a follow-up, or diagnose a failure.
145
+
146
+ Then offer the fitting next moves (a short menu is fine here):
147
+ - Apply an edit pass to the strongest variant (Natural Language / Shorten / Cut / Simplify / Make Better — on the dashboard run page)
148
+ - Run more passes, or another Genesis pass at a different awareness level / with different seeds (creative diversity)
149
+ - Render statics from the winning variant via the `exodus-image` skill
150
+
151
+ ---
152
+
153
+ ## What This Skill Does NOT Do
154
+
155
+ - It doesn't replace `exodus-genesis` or `exodus-foundation` — it sequences them. Drop into those skills, or `exodus-strategist`'s Framework Index, for depth.
156
+ - It doesn't add a CLI command. The flow runs the existing `npx @aicopycoders/exodus foundation` / `genesis` / `browse` / `read-doc` commands.
157
+ - It doesn't do analysis or ideation pipelines — those stay strategist-driven via `exodus-strategist` and its `references/` (STORMING, CASH, the diversity matrix). This skill is the path from "I want to write" to a finished Doc.
@@ -0,0 +1,12 @@
1
+ # Genesis Bots credentials. Keep this file private — never commit or share it.
2
+ # Easiest: replace this ENTIRE file with what the portal's "Copy .env" button
3
+ # gives you (https://genesis.copycoders.ai/portal), then add your provider key.
4
+
5
+ GENESIS_BASE_URL=https://gas.copycoders.ai/api/v1
6
+ GENESIS_API_KEY=gen_your_key_here
7
+
8
+ # Your provider key (you pay usage). Use ONE of these — match the name to your key:
9
+ # Anthropic → ANTHROPIC_API_KEY=sk-ant-...
10
+ # OpenRouter → OPENROUTER_API_KEY=sk-or-...
11
+ # (`npx @aicopycoders/exodus keys pull` writes these names for you from the dashboard.)
12
+ ANTHROPIC_API_KEY=sk-ant-your_provider_key_here
@@ -0,0 +1,29 @@
1
+ Genesis Bots — Claude Code / OpenClaw skill
2
+
3
+ INSTALL (matches the setup steps on the portal — downloading this zip was
4
+ step 2):
5
+ 1. Get a provider key: create an API key with Anthropic (sk-ant-) or
6
+ OpenRouter (sk-or-) and add $10-20 in credits. Genesis auto-detects
7
+ which one you use.
8
+ 2. Move this "genesis-bots" folder into your agent's skills directory.
9
+ For Claude Code that's: .claude/skills/genesis-bots
10
+ 3. Paste your .env: on the portal (https://genesis.copycoders.ai/portal),
11
+ click "Copy .env to clipboard" — it already contains your Genesis key
12
+ and the server address. Paste it into a NEW file named .env inside this
13
+ genesis-bots folder or the root of your project (either works), then
14
+ replace the last line with your provider key from step 1.
15
+ 4. Start a NEW agent session (skills only load at session start — in
16
+ Claude Code, /clear also works), then ask your agent to run a Genesis
17
+ bot. Done — no other configuration needed. Try: "Use the genesis-bots
18
+ skill and ask MarioBot for three ad hooks."
19
+
20
+ The helper runs on Node (bundled as scripts/genesis-stream.mjs — Claude Code
21
+ always has Node). A Python version (scripts/genesis-stream.py) ships alongside
22
+ it as a fallback; both take the same arguments.
23
+
24
+ Tip: create and edit the .env file in an editor like Cursor, VS Code, or
25
+ Obsidian — files starting with a dot are hidden by default in Finder (press
26
+ Cmd+Shift+. to show them). There's also a .env.example template in this
27
+ folder if you'd rather fill one in by hand.
28
+
29
+ See SKILL.md for full usage. Get your keys at https://genesis.copycoders.ai/portal
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: genesis-bots
3
+ description: Call Genesis (OpenClaw) copywriting, research, strategy, and image-prompt bots DIRECTLY over the Genesis API with the member's own `gen_` key. Genesis is the manual, hands-on way to use the bots — you pick a bot and call it yourself, chaining bots by hand (buyer profile → creative brief → ad hooks → ads). Use this skill whenever the user wants the Genesis bots directly: they say "genesis", "openclaw", "run the bots", "genesis copy", name a bot slug, or want a buyer profile / creative brief / ad hooks generated by calling the bots themselves. There is also a done-for-you sibling, Exodus — pre-built `npx @aicopycoders/exodus` pipelines that drive these same bots automatically — which MAY also be installed in this folder (look for `exodus-*` skills); it often is NOT. If `exodus-*` skills are present AND the user said "exodus" or invoked one, that's the automatic system — hand off to the exodus-* skills, not this one. If the user clearly wants ads and seems unsure whether they're driving Genesis directly or running an Exodus pipeline, ASK which they have rather than guessing. Covers discovering bots and calling them (OpenAI-compatible API where the model field is a bot slug, optionally `slug@model` to override which LLM the bot runs on).
4
+ ---
5
+
6
+ # Genesis Bots
7
+
8
+ **Skill version: 2026.06.23** · [how to update](#updating-this-skill)
9
+
10
+ Call the Genesis (OpenClaw) bot API. The bots are OpenAI-compatible chat models where the
11
+ `model` field is a **bot slug**. Each bot carries its own server-side system prompt — you send
12
+ user messages, the bot does the rest.
13
+
14
+ ## Genesis vs Exodus — am I the right skill?
15
+
16
+ You're looking at **Genesis**: the manual, hands-on way to use the copywriting server. You call
17
+ individual bots directly with the member's own `gen_` key and your own prompts, and you drive
18
+ every step yourself.
19
+
20
+ There's a done-for-you sibling called **Exodus** — pre-built `npx @aicopycoders/exodus` pipelines (the
21
+ `exodus-*` skills) that drive these *same* Genesis bots automatically against the member's brand.
22
+ Think of it as a car: **Genesis is the manual transmission** (you shift every gear yourself),
23
+ **Exodus is the automatic** (same engine underneath, it does the driving). Most people who don't
24
+ know the internals just want their ads — your job is to get them into the right one.
25
+
26
+ **Exodus may or may not be installed here** — plenty of members run Genesis on its own. So check
27
+ `.claude/skills/` for `exodus-*` skills before assuming:
28
+
29
+ - **No `exodus-*` skills present** → there's only one system and you're it. Carry on; ignore the
30
+ rest of this section.
31
+ - **`exodus-*` skills present** → both are installed. Route by what the user said: bare
32
+ **"genesis" / "run the bots" / "openclaw" / a bot slug** → this skill; **"exodus …"** → the
33
+ `exodus-*` skills (hand off, don't do their pipeline work here). If the user just wants "ads"
34
+ and clearly doesn't know the difference, ask one question — *"Do you want to drive the Genesis
35
+ bots directly, or run an Exodus pipeline?"* — rather than guessing, because the two go down
36
+ completely different paths.
37
+
38
+ ## Setup (one time, ~1 minute)
39
+
40
+ You need two keys. Get them from the member portal — it walks you through it:
41
+
42
+ - **Portal:** https://genesis.copycoders.ai/portal — your Genesis key (`gen_...`) is already there
43
+ - **Setup Guide:** https://genesis.copycoders.ai/setup — how to get your Anthropic key (`sk-ant-...`)
44
+
45
+ Then put both keys in a local `.env` file — never paste them into code or chat:
46
+
47
+ ```bash
48
+ cp .env.example .env # 1. make your private copy
49
+ # 2. open .env, paste your two keys, save
50
+ ```
51
+
52
+ You only fill in two values (the API address is pre-filled — leave it alone):
53
+
54
+ | In `.env` | What it is | Where to get it |
55
+ |-----------|------------|-----------------|
56
+ | `GENESIS_API_KEY` | Your Genesis access key (`gen_...`) | the portal (already generated for you) |
57
+ | `ANTHROPIC_API_KEY` *or* `OPENROUTER_API_KEY` | Your own provider key — how you pay for usage | the Setup Guide |
58
+
59
+ Your provider key can be an Anthropic key (`sk-ant-...`, from console.anthropic.com) **or** an
60
+ OpenRouter key (`sk-or-...`, from openrouter.ai):
61
+
62
+ - **Want every model** — Claude *and* GPT-5, Gemini, etc.? Use an **OpenRouter key** (one key
63
+ serves them all) and put it in `OPENROUTER_API_KEY`.
64
+ - **Only need Claude?** An Anthropic key is enough — put it in `ANTHROPIC_API_KEY`.
65
+
66
+ You can set **both**: the helper automatically picks the right key per request — Claude bills
67
+ direct to Anthropic (cheaper), while GPT-5/Gemini route via OpenRouter. Keys are detected by
68
+ their `sk-ant-`/`sk-or-` prefix, so it still works even if you paste one into the other field.
69
+
70
+ The bundled helper at `.claude/skills/genesis-bots/scripts/genesis-stream.mjs` (Node — works everywhere, no Python needed; a `genesis-stream.py` is also bundled as a fallback) **reads `.env`
71
+ automatically** — you don't need to know what an environment variable is or run any
72
+ `export`/`source` commands. Just edit `.env` once.
73
+
74
+ > These same names (`GENESIS_API_KEY`, `ANTHROPIC_API_KEY`) and base URL match the portal exactly,
75
+ > so if you're configuring this inside OpenClaw instead of a `.env` file, use the identical values.
76
+ > Keep `.env` private. Add it to `.gitignore`; commit only `.env.example`.
77
+
78
+ For the raw `curl` commands below (optional), load the file into your shell first:
79
+ `set -a && source .env && set +a`
80
+
81
+ ## Updating this skill
82
+
83
+ Genesis adds features to this skill over time (the version is at the top of this file).
84
+ Updating an existing install needs **no portal login**:
85
+
86
+ - **Easiest — ask your agent:** *"update the genesis-bots skill."* It downloads the latest
87
+ bundle and replaces this `SKILL.md` and the helper script in place, leaving your `.env`
88
+ untouched.
89
+ - **By hand (docs only, one line)** — overwrites just `SKILL.md`, never your `.env`:
90
+ ```bash
91
+ curl -fsSL https://genesis.copycoders.ai/downloads/genesis-bots-SKILL.md \
92
+ -o .claude/skills/genesis-bots/SKILL.md
93
+ ```
94
+ For a full update including the helper script, re-download
95
+ `https://genesis.copycoders.ai/downloads/genesis-bots-skill.zip` instead.
96
+
97
+ Either way, **start a new session** afterward (skills load only at session start; `/clear` works).
98
+
99
+ ## Discover bots (never hardcode slugs)
100
+
101
+ The catalog changes — always pull the live list. Categories include Copywriting, Research,
102
+ Strategy, Creative, Image Prompts, Pages & Funnels, Video Pipelines, and Other.
103
+
104
+ ```bash
105
+ curl -s -H "Authorization: Bearer $GENESIS_API_KEY" \
106
+ "$GENESIS_BASE_URL/models" \
107
+ | jq -r '.data[] | "\(.id)\t\(._genesis.category)\t\(._genesis.name)"'
108
+ ```
109
+
110
+ Filter by category: append `?category=Copywriting`. Each entry's `id` is the slug you pass as
111
+ `model`; `_genesis` holds `{name, description, category, provider, model}`.
112
+
113
+ ## Call a bot (streaming helper)
114
+
115
+ The bundled helper streams the response, accumulates it, and writes it to a file. Use the Node
116
+ helper (`genesis-stream.mjs`) — Claude Code always has Node, and it needs nothing installed. It
117
+ lives inside this skill folder — call it with its full path from your project root (the relative
118
+ `scripts/...` form only works if you've `cd`'d into the skill folder first):
119
+
120
+ ```bash
121
+ # 1. write the prompt
122
+ cat > prompt.txt << 'EOF'
123
+ {your context + ask}
124
+ EOF
125
+
126
+ # 2. call: <bot-slug> <prompt-file> <output-file> [temperature]
127
+ node .claude/skills/genesis-bots/scripts/genesis-stream.mjs BOT_SLUG prompt.txt out.md
128
+
129
+ # (No Node? A Python fallback ships alongside it — identical arguments:)
130
+ # python3 .claude/skills/genesis-bots/scripts/genesis-stream.py BOT_SLUG prompt.txt out.md
131
+ ```
132
+
133
+ Request fields:
134
+
135
+ | Field | Notes |
136
+ |-------|-------|
137
+ | `model` | the **bot slug**, not an LLM model name. Append `@<model>` to run the bot on a different LLM — see [Choose the model and temperature](#choose-the-model-and-temperature-optional). |
138
+ | `messages` | `role` must be `user` or `assistant`. **`system` messages are dropped** — the bot's prompt is server-side. |
139
+ | `stream` | default `true`; SSE in OpenAI format. Set `false` for a complete JSON body. |
140
+ | `temperature` | optional creativity dial; omit to use the bot's default. Ignored by Opus 4.7+/Fable — see [Choose the model and temperature](#choose-the-model-and-temperature-optional). |
141
+ | `max_tokens` | optional; bot has a default. |
142
+
143
+ ### Choose the model and temperature (optional)
144
+
145
+ Two optional, per-request dials. Set them when the user wants them; otherwise leave the bot's
146
+ defaults alone (the normal case — nothing to do).
147
+
148
+ **Model** — set `model` to `<bot-slug>@<model>` (everything after the first `@` is the model;
149
+ no `@` = the bot's default). Which models you can pick depends on the provider key in `.env`:
150
+
151
+ | Your key | Models you can request | Examples |
152
+ |----------|------------------------|----------|
153
+ | Anthropic (`sk-ant-…`) | Claude only (`claude-*`, no `/`) | `claude-opus-4-8` (smartest), `claude-sonnet-4-6`, `claude-haiku-4-5` (fast/cheap) |
154
+ | OpenRouter (`sk-or-…`) | any model | `openai/gpt-5`, `google/gemini-2.5-pro`, plus all Claude models |
155
+
156
+ A non-Claude model on an Anthropic key returns `400`. A bot's current default is the
157
+ `_genesis.model` field in the `/models` list.
158
+
159
+ **Temperature** — the creativity dial: higher (e.g. `0.9`) = more varied/creative, lower
160
+ (e.g. `0.2`) = more focused/consistent. Pass it as the helper's 4th argument (or the
161
+ `temperature` field). Omit it to use the bot's tuned default.
162
+
163
+ **Handle model/temperature compatibility for the user — don't make them think about it.**
164
+ Temperature works on Opus 4.6 and earlier, Sonnet, Haiku, and OpenRouter models. The newest
165
+ reasoning models — **Opus 4.7+ and Fable — ignore temperature** (that control was removed). So:
166
+
167
+ - User wants a custom temperature → use a model that supports it (the bot's default already
168
+ does); don't pair it with a model that can't.
169
+ - User wants the most powerful model (Opus 4.8) → just switch the model; don't set a temperature.
170
+ - User asks for both at once → tell them briefly they can have a custom temperature **or** the
171
+ newest model, and pick whichever better fits their goal. Never make them debug a silent no-op.
172
+
173
+ ```bash
174
+ # model + temperature (4th arg = temperature) — opus-4-6 supports it:
175
+ node .claude/skills/genesis-bots/scripts/genesis-stream.mjs BOT_SLUG@claude-opus-4-6 prompt.txt out.md 0.9
176
+
177
+ # most powerful model, no temperature (ignored there anyway):
178
+ node .claude/skills/genesis-bots/scripts/genesis-stream.mjs BOT_SLUG@claude-opus-4-8 prompt.txt out.md
179
+
180
+ # raw curl with both fields:
181
+ curl -s -X POST "$GENESIS_BASE_URL/chat/completions" \
182
+ -H "Authorization: Bearer $GENESIS_API_KEY" \
183
+ -H "X-Provider-Key: $ANTHROPIC_API_KEY" \
184
+ -H "Content-Type: application/json" \
185
+ -d '{"model":"BOT_SLUG@claude-opus-4-6","temperature":0.9,"messages":[{"role":"user","content":"..."}],"stream":false}'
186
+ ```
187
+
188
+ ### Chaining bots
189
+
190
+ Feed one bot's output into the next as context in the user message (e.g. buyer profile →
191
+ creative brief → hooks → ads). The API injects each bot's system prompt for you; you only pass
192
+ messages. Use the slugs from the live models list.
193
+
194
+ ## Limits
195
+
196
+ - **1 concurrent stream per key** — a 2nd parallel stream on the same key returns
197
+ `429 connection_limit_error`. Call sequentially per key.
198
+ - **60 requests/min per key** (sliding window) — over the limit returns `429` with `Retry-After`.
199
+ - Long generations are fine: the server sends SSE heartbeats (~every 5s) to prevent proxy timeouts.
200
+
201
+ ## Minimal call without the helper
202
+
203
+ ```bash
204
+ curl -s -X POST "$GENESIS_BASE_URL/chat/completions" \
205
+ -H "Authorization: Bearer $GENESIS_API_KEY" \
206
+ -H "X-Provider-Key: $ANTHROPIC_API_KEY" \
207
+ -H "Content-Type: application/json" \
208
+ -d '{"model":"BOT_SLUG","messages":[{"role":"user","content":"..."}],"stream":false}' \
209
+ | jq -r '.choices[0].message.content'
210
+ ```
211
+
212
+ ## Error codes
213
+
214
+ - `400` — missing `X-Provider-Key` or malformed request; also returned when a `@<model>` override
215
+ isn't allowed for your key (e.g. a non-Claude model with an `sk-ant-…` key) — the message says so
216
+ - `401` — invalid/revoked Genesis key
217
+ - `404` — bot slug not found (re-check the models list)
218
+ - `429` — rate limit or concurrent-stream limit hit
219
+ - `500` — provider error (usually a bad/over-quota provider key)