@opendirectory.dev/skills 0.1.51 → 0.1.53

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendirectory.dev/skills",
3
- "version": "0.1.51",
3
+ "version": "0.1.53",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "bin": {
package/registry.json CHANGED
@@ -74,6 +74,17 @@
74
74
  "version": "1.0.0",
75
75
  "path": "skills/docs-from-code"
76
76
  },
77
+ {
78
+ "name": "email-newsletter",
79
+ "description": "Drafts and designs a complete HTML email newsletter from a topic or content brief.",
80
+ "tags": [
81
+ "Email",
82
+ "Copywriting"
83
+ ],
84
+ "author": "OpenDirectory",
85
+ "version": "1.0.0",
86
+ "path": "skills/email-newsletter"
87
+ },
77
88
  {
78
89
  "name": "explain-this-pr",
79
90
  "description": "Takes a GitHub PR URL or the current branch and writes a plain-English explanation of what it does and why, then posts it as a PR comment.",
@@ -192,7 +203,7 @@
192
203
  },
193
204
  {
194
205
  "name": "meta-ads-skill",
195
- "description": "Use when interacting with the Meta Ads MCP server to manage accounts, campaigns, ads, insights, and targeting, or to troubleshoot OAuth token authe...",
206
+ "description": "Use when interacting with the Meta Ads CLI to manage accounts, campaigns, ads, and insights. Act as an Expert Media Buyer.",
196
207
  "tags": [],
197
208
  "author": "opendirectory",
198
209
  "version": "0.0.1",
@@ -0,0 +1,98 @@
1
+ # email-newsletter
2
+
3
+ Draft and design a complete HTML email newsletter from a topic or content brief. Output is paste-ready for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npx "@opendirectory.dev/skills" install email-newsletter --target claude
9
+ ```
10
+
11
+ ### Video Tutorial
12
+ Watch this quick video to see how it's done:
13
+
14
+ https://github.com/user-attachments/assets/ee98a1b5-ebc4-452f-bbfb-c434f2935067
15
+
16
+ ### Step 1: Download the skill from GitHub
17
+ 1. Copy the URL of this specific skill folder from your browser's address bar.
18
+ 2. Go to [download-directory.github.io](https://download-directory.github.io/).
19
+ 3. Paste the URL and click **Enter** to download.
20
+
21
+ ### Step 2: Install the Skill in Claude
22
+ 1. Open your **Claude desktop app**.
23
+ 2. Go to the sidebar on the left side and click on the **Customize** section.
24
+ 3. Click on the **Skills** tab, then click on the **+** (plus) icon button to create a new skill.
25
+ 4. Choose the option to **Upload a skill**, and drag and drop the `.zip` file (or you can extract it and drop the folder, both work).
26
+
27
+ > **Note:** For some skills (like `position-me`), the `SKILL.md` file might be located inside a subfolder. Always make sure you are uploading the specific folder that contains the `SKILL.md` file!
28
+
29
+ ---
30
+
31
+ ## What it does
32
+
33
+ - Asks the 19 questions that actually determine your newsletter layout
34
+ - Writes all sections: hero, intro, main content, stat callout, CTA, footer
35
+ - Generates table-based HTML with inline styles -- compatible with every major email client
36
+ - Tunes variable syntax per platform (Loops, Mailchimp, Beehiiv, Resend)
37
+ - Produces 3 subject line options using proven formulas
38
+ - Includes a plain-text fallback for deliverability
39
+
40
+ ## Example
41
+
42
+ > "Write a newsletter about how AI is changing B2B sales. Audience: VPs of Sales at 100-500 person SaaS companies. CTA: join our upcoming webinar. Tone: direct. Platform: Beehiiv."
43
+
44
+ Output: full HTML email with hero headline, 3-section body, stat callout, CTA block, and footer -- plus 3 subject line options and a plain-text version, tuned for Beehiiv.
45
+
46
+ ## Supported platforms
47
+
48
+ | Platform | Notes |
49
+ |---|---|
50
+ | Loops | `{{unsubscribe_url}}` syntax. Paste into custom HTML editor |
51
+ | Mailchimp | `*\|UNSUB\|*` syntax. Use "Code your own" template. Includes `mc:edit` regions |
52
+ | Beehiiv | `%%unsubscribe_url%%` syntax. Works with custom HTML block |
53
+ | Resend | `{unsubscribeUrl}` syntax. React Email `.tsx` output available on request |
54
+ | Generic | `[UNSUBSCRIBE_URL]` placeholder -- replace before sending |
55
+
56
+ ## Output formats
57
+
58
+ - **Standard HTML** (default): inline-styled, table-based, 600px max-width
59
+ - **Plain text**: always included unless you opt out
60
+ - **React Email** (on request): `.tsx` component output for Resend / dev teams
61
+
62
+ ## Parameters
63
+
64
+ | Param | Required | Notes |
65
+ |---|---|---|
66
+ | topic | Yes | What the newsletter is about |
67
+ | audience | Yes | Who is reading |
68
+ | cta | Yes | Primary action you want readers to take |
69
+ | company_name | No | Brand name for header and footer |
70
+ | tagline | No | One-line description for footer |
71
+ | city_country | No | Footer location (e.g. "San Francisco, US") |
72
+ | cta_url | No | Actual link for CTA button -- placeholder used if omitted |
73
+ | brand_color | No | Hex code -- used for strip, stat border, category label |
74
+ | background | No | dark / light / custom hex (default: dark) |
75
+ | display_font | No | editorial serif / modern sans / system fonts (default: Instrument Serif) |
76
+ | button_style | No | pill / softly rounded / sharp (default: pill) |
77
+ | visual_style | No | editorial / technical+data / warm+founder / bold+campaign |
78
+ | tone | No | educational / conversational / bold+direct / formal / playful |
79
+ | platform | No | loops / mailchimp / beehiiv / resend (default: generic) |
80
+ | personalization | No | none / first name / first name + company (default: none) |
81
+ | length | No | brief (300w) / standard (500-700w) / deep dive (800w+) |
82
+ | format | No | editorial article / numbered breakdown / personal story / data report |
83
+ | subject_line | No | If omitted, 3 options are suggested |
84
+ | secondary_sections | No | sponsor block / product callout / event / quick links |
85
+
86
+ ## No API keys required
87
+
88
+ Pure AI skill. No external services, no scraping, no dependencies to install.
89
+
90
+ ## Design principles
91
+
92
+ - Max width 600px (email client standard)
93
+ - Inline styles only -- no external CSS, email clients strip it
94
+ - Table-based layout for Outlook compatibility
95
+ - Georgia serif for hero headlines, Arial/system font for body
96
+ - CTA buttons use the table+td VML-compatible structure
97
+ - All images include alt text
98
+ - Dark mode aware where platform supports it
@@ -0,0 +1,395 @@
1
+ ---
2
+ name: email-newsletter
3
+ description: Drafts and designs a complete HTML email newsletter from a topic or content brief. Outputs paste-ready HTML for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform. Includes subject line options and plain-text fallback. Trigger when a user says "write a newsletter", "draft an email newsletter", "create an HTML email", "design an email for my subscribers", or "write a newsletter about [topic]".
4
+ compatibility: [claude-code, gemini-cli, github-copilot]
5
+ author: OpenDirectory
6
+ version: 1.0.0
7
+ ---
8
+
9
+ # Email Newsletter
10
+
11
+ Draft and design a complete HTML email newsletter from a topic or content brief. Output is paste-ready for Loops, Mailchimp, Beehiiv, Resend, or any standard email platform.
12
+
13
+ ---
14
+
15
+ **Critical rule:** Table-based HTML with inline styles only. No CSS classes, no flexbox, no grid, no `<style>` blocks. Every element gets `style=""` directly. This is not optional -- email clients strip everything else.
16
+
17
+ ---
18
+
19
+ ## Step 1: Brief Intake
20
+
21
+ Need three things to start. If all three present in the message: skip to Step 2.
22
+
23
+ If any missing, ask exactly:
24
+
25
+ > "To get started, I need three things:
26
+ > 1. **Topic** -- what is this newsletter about?
27
+ > 2. **Audience** -- who is reading? (role, company size, how they know you)
28
+ > 3. **Primary CTA** -- what one action do you want readers to take?"
29
+
30
+ Wait for all three before continuing.
31
+
32
+ ---
33
+
34
+ ## Step 2: Complete Intake
35
+
36
+ Ask all questions in one message, grouped by category. User can skip any -- defaults apply.
37
+
38
+ > "A few questions before I draft -- answer what you know, skip the rest:
39
+ >
40
+ > **Content**
41
+ > 1. **Length** -- brief (300 words, punchy) / standard (500-700) / deep dive (800+ words)?
42
+ > 2. **Format** -- editorial article / numbered breakdown / personal story / data report?
43
+ > 3. **Issue context** -- one-time send / part of weekly series / monthly digest?
44
+ > 4. **CTA URL** -- what's the actual link? (or I'll use a placeholder)
45
+ >
46
+ > **Brand**
47
+ > 5. **Company / brand name** -- for header and footer
48
+ > 6. **Tagline** -- one-line description (optional, for footer)
49
+ > 7. **City & country** -- for footer (e.g. "San Francisco, US")
50
+ > 8. **Primary brand color** -- hex? (e.g. #856FE6)
51
+ > 9. **Secondary accent** -- keep default yellow-green (#D8F90A) / use brand color / something else?
52
+ >
53
+ > **Design**
54
+ > 10. **Background** -- dark (editorial/SaaS) / light (clean/corporate) / custom hex?
55
+ > 11. **Display font** -- editorial serif (Instrument Serif) / clean modern sans / system fonts only?
56
+ > 12. **Button style** -- pill (very rounded) / softly rounded / sharp corners?
57
+ > 13. **Visual style** -- editorial / technical+data / warm+founder / bold+campaign?
58
+ >
59
+ > **Platform & Technical**
60
+ > 14. **Platform** -- Loops / Mailchimp / Beehiiv / Resend / other?
61
+ > 15. **Tone** -- educational / conversational / bold+direct / formal / playful?
62
+ > 16. **Personalization** -- none / first name / first name + company?
63
+ > 17. **Subject line** -- have one / want 3 options?
64
+ > 18. **Secondary sections** -- sponsor block / product callout / event / quick links / none?
65
+ > 19. **Plain-text version** -- yes (recommended) / no?"
66
+
67
+ **Defaults if skipped:**
68
+
69
+ | Question | Default |
70
+ |---|---|
71
+ | Length | standard (500-700 words) |
72
+ | Format | editorial article |
73
+ | Issue context | one-time send |
74
+ | CTA URL | `[CTA_URL]` placeholder |
75
+ | Company name | `[YOUR BRAND]` placeholder |
76
+ | Tagline | none |
77
+ | City & country | `[CITY, COUNTRY]` placeholder |
78
+ | Brand color | none (use `#D8F90A` for all accents) |
79
+ | Secondary accent | `#D8F90A` (yellow-green default) |
80
+ | Background | dark |
81
+ | Display font | Instrument Serif (editorial serif) |
82
+ | Button style | pill |
83
+ | Visual style | editorial |
84
+ | Platform | generic |
85
+ | Tone | conversational |
86
+ | Personalization | none |
87
+ | Subject line | generate 3 options |
88
+ | Secondary sections | none |
89
+ | Plain-text | yes |
90
+
91
+ ---
92
+
93
+ ## Step 2.5: Design Direction (internal -- not shown to user)
94
+
95
+ From Step 2 answers, determine:
96
+ - Visual character (from question 13, or inferred from tone + format if skipped)
97
+ - ONE unmissable element -- identify before Step 3
98
+ - Template path (see Step 5)
99
+
100
+ Character defaults if question 13 skipped:
101
+ - Educational / formal tone: Editorial
102
+ - Metrics-heavy content (stats, benchmarks, reports): Technical/data-forward
103
+ - Product launches, events, campaigns: Bold/campaign
104
+
105
+ Never ask the user for design direction separately -- derive it from their answers.
106
+
107
+ ---
108
+
109
+ ## Step 3: Structure Design
110
+
111
+ Read `references/html-email-guide.md` for layout rules before choosing sections.
112
+
113
+ Based on topic + audience + CTA + secondary sections requested, select sections from this library:
114
+
115
+ | Section | Include when |
116
+ |---|---|
117
+ | header | Always -- logo placeholder + issue number or date |
118
+ | hero | Always -- big headline + 1-2 sentence hook |
119
+ | intro | Conversational or educational tone -- short personal note |
120
+ | main-content | Primary article or insight (text-heavy) |
121
+ | stat-callout | There is a compelling stat, quote, or data point |
122
+ | secondary-section | Secondary CTA was requested |
123
+ | product-cta | Brand context present and soft product plug fits |
124
+ | sponsor-block | Sponsor section was requested |
125
+ | quick-links | Curated links section was requested |
126
+ | footer | Always -- unsubscribe link + company name |
127
+
128
+ Output the chosen structure as a numbered list with one-line purpose per section:
129
+
130
+ ```
131
+ Proposed structure:
132
+ 1. Header -- logo + Issue #1 / [date]
133
+ 2. Hero -- headline + hook paragraph
134
+ 3. Intro -- short personal framing
135
+ 4. Main Content -- [topic] breakdown
136
+ 5. Stat Callout -- key data point from the story
137
+ 6. CTA -- [cta text]
138
+ 7. Footer -- unsubscribe + company
139
+
140
+ Does this structure work, or should I adjust any sections?
141
+ ```
142
+
143
+ Wait for confirmation before Step 4.
144
+
145
+ ---
146
+
147
+ ## Step 4: Content Draft
148
+
149
+ Write copy for each section in sequence. No HTML yet -- clean prose only.
150
+
151
+ **Rules per section:**
152
+ - **Header**: Issue number + date. No copy needed.
153
+ - **Hero headline**: 8 words max, outcome-focused, no starting with "I/We/Our"
154
+ - **Hero hook**: 1-2 sentences, problem or curiosity gap, pulls reader in
155
+ - **Intro**: 2-3 sentences, personal or contextual, not corporate-speak, contractions OK
156
+ - **Main content**: 250-400 words, scannable -- use **bold phrases** for key points, short paragraphs (1-3 lines), no walls of text, no bullet overload
157
+ - **Stat callout**: One stat or quote, 20 words max, punchy
158
+ - **Product CTA**: 2-3 sentences, value-forward, not "Check out our product" -- tell them what changes for them
159
+ - **CTA button text**: 3-5 words, action verb + benefit ("Read the full breakdown", "Save my seat", "Get the guide")
160
+ - **Footer**: Unsubscribe link placeholder + company name
161
+
162
+ Read `references/subject-line-formulas.md` then write 3 subject line options (if subject line not provided by user):
163
+ - Option A: Curiosity gap formula
164
+ - Option B: Direct benefit formula
165
+ - Option C: Number/list formula
166
+
167
+ Do not use em dashes. Do not use: "powerful", "seamless", "game-changing", "leverage", "innovative", "unlock", "transform", "elevate", "cutting-edge", "robust".
168
+
169
+ ---
170
+
171
+ ## Step 5: HTML Generation
172
+
173
+ Read `references/design-system.md` and `references/html-email-guide.md` before generating HTML.
174
+
175
+ **Template or custom -- decide based on Step 2 answers:**
176
+
177
+ **Use `templates/dark-newsletter.html` as base when ALL of:**
178
+ - background = dark (or not specified)
179
+ - display font = Instrument Serif (or not specified)
180
+ - no custom background hex provided
181
+
182
+ **Use `templates/light-newsletter.html` as base when ALL of:**
183
+ - background = light OR tone = formal
184
+ - display font = Instrument Serif (or not specified)
185
+ - no custom background hex provided
186
+
187
+ **Generate custom HTML from scratch when ANY of:**
188
+ - custom background hex provided (not dark, not white)
189
+ - display font = modern sans or system fonts only
190
+ - combination of answers produces a design neither template serves
191
+
192
+ For custom generation: use `references/design-system.md` Custom Generation Guide as the full token spec. Apply user's background/font/button/accent choices throughout.
193
+
194
+ **Then (for template path):**
195
+ 1. Select only the sections needed from the template (based on Step 3 structure)
196
+ 2. Fill in all `[PLACEHOLDER]` values with content from Step 4
197
+ 3. Apply brand color substitution (see below)
198
+ 4. Verify all `[UNSUBSCRIBE_URL]` placeholders are still present (platform tuning happens in Step 6)
199
+
200
+ **Brand color substitution rules:**
201
+
202
+ If `brand_color` is provided:
203
+ - Replace brand strip `bgcolor` (`#D8F90A` in the `height:2px` row) with brand_color
204
+ - Replace stat callout left border color with brand_color
205
+ - Replace category label color with brand_color
206
+ - If brand_color luminance is high (yellows, greens, oranges -- most neons): replace step badge `#D8F90A` with brand_color too
207
+ - If brand_color luminance is low (dark navy, forest, charcoal): keep step badges and CTA button as `#D8F90A`, only use brand_color for strip + stat border
208
+
209
+ If `brand_color` is NOT provided: keep all `#D8F90A` values as-is.
210
+
211
+ **Content substitution rules (from Step 2 answers):**
212
+ - If `company_name` provided: replace all `[YOUR BRAND]` and `[COMPANY NAME]` placeholders
213
+ - If `city_country` provided: replace `[CITY, COUNTRY]` placeholder
214
+ - If `tagline` provided: add as subtitle line in footer after company name
215
+ - If `cta_url` provided: replace all `[CTA_URL]` placeholders with actual URL
216
+ - If `personalization = first_name`: add platform-appropriate first name variable to hero greeting -- e.g. `Hey %%first_name%%,` on Beehiiv, `Hey {{first_name}},` on Loops, `Hey *|FNAME|*,` on Mailchimp
217
+ - If `personalization = first_name + company`: add both variables where contextually appropriate
218
+
219
+ **Brand color visual tension check (on dark email):**
220
+
221
+ Does the brand color visually pop on `#111111`? Test mentally: would it be visible as a 2px strip?
222
+ - High-saturation colors (purples, blues, teals, pinks, yellows, oranges, greens): YES -- use for strip + stat border + category label
223
+ - Low-saturation / near-neutral (warm greys, beige, off-white): strip only; category label reverts to `#555555`
224
+ - Near-black (very dark navy, forest, charcoal below ~`#2A2A2A`): skip brand_color for ALL accent uses, fall back to `#D8F90A` for every element
225
+
226
+ **Accent discipline rule:** brand_color appears in AT MOST 3 places: brand strip, stat border, category label. Never in body copy, headlines, button backgrounds, or section backgrounds. Over-branding kills the premium feel.
227
+
228
+ **CTA button text color:**
229
+ - On `#D8F90A` button background: always use `#0A0A0A` text (it's a light color)
230
+ - On `#111111` button background (inside yellow callout card): always use `#F2F2F2` text
231
+ - On brand_color button: use `#0A0A0A` if brand is light, `#FFFFFF` if brand is dark
232
+
233
+ **Required on every `<td>` with a background color:**
234
+ Both the `bgcolor=` HTML attribute AND the inline `background-color:` style. Example:
235
+ ```html
236
+ <td bgcolor="#D8F90A" style="background-color:#D8F90A;">
237
+ ```
238
+ The attribute handles Outlook. The style handles everything else. Never use just one.
239
+
240
+ **Design excellence (frontend-design principles, email-adapted):**
241
+
242
+ Email's table constraints don't limit design ambition. Push within them:
243
+
244
+ - **Typography to its extreme**: 4-5 word headlines = 60px, `-0.04em` tracking. 6-7 word headlines = 56px, `-0.03em`. 8 words = 48px. Never size down for safety -- the headline is a poster, not a label. Instrument Serif italic on stat quotes adds literary weight no other element can match.
245
+
246
+ - **Density contrast as craft signal**: Hero = maximum open space (64px top). Body paragraphs = tight and dense. CTA callout card = maximum open space again (64px). Open → tight → open is the rhythm that reads as intentional design, not template output.
247
+
248
+ - **Background depth via section alternation** (all email-safe):
249
+ - Header: `#0A0A0A`
250
+ - Hero: `#111111`
251
+ - Stat callout outer: `#111111`, inner elevated card: `#1A1A1A`
252
+ - Body paragraphs: `#161616` (subtle elevation creates depth without color)
253
+ - Step cards: `#111111` (contrast with body)
254
+ - CTA callout card: `#D8F90A` (the ONLY bright element -- never dilute)
255
+ - Footer: `#080808`
256
+
257
+ - **Accent scarcity = luxury**: One yellow callout card in a sea of dark reads premium. Yellow appearing in six places reads cheap. The CTA card's power comes entirely from being the single bright element in a dark email.
258
+
259
+ - **Unforgettable test**: Before saving, state in one sentence what a reader would describe to a colleague 3 hours later. If it's vague ("it was dark and clean") -- the visual anchor isn't strong enough. Make it specific ("the yellow card with the big serif headline").
260
+
261
+ - **Stat callout as editorial pull quote**: 4px left border (not 3px). 26px italic Instrument Serif on the quote text. 32px inner padding. This is the closest an email gets to a magazine pull quote. Treat it like one.
262
+
263
+ ---
264
+
265
+ ## Step 6: Platform Tuning
266
+
267
+ Read `references/platform-compat.md` and apply platform-specific adjustments:
268
+
269
+ | Platform | Action |
270
+ |---|---|
271
+ | Loops | Replace `[UNSUBSCRIBE_URL]` with `{{unsubscribe_url}}`. Replace `[FIRST_NAME]` refs with `{{first_name}}` |
272
+ | Mailchimp | Replace `[UNSUBSCRIBE_URL]` with `*\|UNSUB\|*`. Add `mc:edit="[section-name]"` to editable `<td>` blocks |
273
+ | Beehiiv | Replace `[UNSUBSCRIBE_URL]` with `%%unsubscribe_url%%`. Replace `[FIRST_NAME]` with `%%first_name%%` |
274
+ | Resend | Replace `[UNSUBSCRIBE_URL]` with `{unsubscribeUrl}`. Note: React Email `.tsx` output available on request |
275
+ | Generic/Other | Keep `[UNSUBSCRIBE_URL]` as placeholder with comment: `<!-- Replace with your unsubscribe link -->` |
276
+
277
+ ---
278
+
279
+ ## Step 7: Self-QA
280
+
281
+ Check the generated HTML before output. Fix every issue found -- do not skip.
282
+
283
+ **Rendering checks:**
284
+ - [ ] All styles inline -- no `<style>` blocks, no `class=` attributes anywhere
285
+ - [ ] All `<table>` have `cellpadding="0" cellspacing="0" border="0"`
286
+ - [ ] Images (if any) have `alt=""`, `border="0"`, `display:block` in style
287
+ - [ ] Max-width 600px enforced on container table
288
+ - [ ] CTA button uses `<table>` + `<td>` structure with `bgcolor=` attribute, not just `<a>` with `display:block`
289
+ - [ ] No `flexbox`, `grid`, `position:`, `float:`, CSS variables (`--var`), `min-height`, `max-height` in any inline style
290
+ - [ ] `border-radius` on `<td>` only -- not on `<table>` or `<a>` (Outlook renders `<td>` radius)
291
+ - [ ] Footer has unsubscribe link with platform-correct variable
292
+
293
+ **Content checks:**
294
+ - [ ] Hero headline is 8 words or fewer
295
+ - [ ] CTA button text is 3-5 words
296
+ - [ ] No em dashes (-- is fine, not --)
297
+ - [ ] No banned words: "powerful", "seamless", "game-changing", "leverage", "innovative", "unlock", "transform", "elevate", "cutting-edge", "robust"
298
+ - [ ] Plain-text version strips all HTML cleanly (if requested)
299
+
300
+ **Design quality checks:**
301
+ - [ ] ONE unmissable element from Step 2.5 is visually dominant -- not buried between equal-weight sections
302
+ - [ ] Typography hierarchy clear: H1 >> H2 >> body -- size contrast at least 2:1 between each level
303
+ - [ ] All spacing values from valid rhythm only: 8 / 16 / 20 / 24 / 32 / 40 / 52 / 64px -- no arbitrary values (18px, 22px, 30px, 45px, etc.)
304
+ - [ ] Brand color appears in 3 or fewer places -- count instances; if more, remove from lowest-priority element
305
+ - [ ] No email slop patterns -- check against the slop list in `references/design-system.md`
306
+
307
+ If any check fails: fix inline, then re-run the checklist mentally.
308
+
309
+ ---
310
+
311
+ ## Step 8: Subject Line Presentation
312
+
313
+ If 3 subject line options were generated, present them with a recommendation:
314
+
315
+ ```
316
+ **Subject Line Options**
317
+
318
+ A. [subject] -- [formula used, best for what audience/context]
319
+ B. [subject] -- [formula used]
320
+ C. [subject] -- [formula used]
321
+
322
+ Recommendation: [A/B/C] -- [one sentence reason based on audience and tone]
323
+ ```
324
+
325
+ If user provided their own subject line, skip this step.
326
+
327
+ ---
328
+
329
+ ## Step 9: Save Files + Present Summary
330
+
331
+ **Save the HTML to a file first -- do not dump it in the chat.**
332
+
333
+ ```bash
334
+ mkdir -p docs/newsletters
335
+ ```
336
+
337
+ Write the full HTML to:
338
+ `docs/newsletters/[topic-slug]-[YYYY-MM-DD].html`
339
+
340
+ Where `[topic-slug]` is the topic lowercased with spaces replaced by hyphens (e.g. "AI B2B Sales" → `ai-b2b-sales`).
341
+
342
+ If a plain-text version was requested, also write it to:
343
+ `docs/newsletters/[topic-slug]-[YYYY-MM-DD].txt`
344
+
345
+ **Then present this summary in the chat (no HTML code fence):**
346
+
347
+ ```
348
+ ## Newsletter: [topic slug]
349
+ Date: [today's date] | Platform: [platform] | Tone: [tone]
350
+
351
+ Saved to: docs/newsletters/[topic-slug]-[YYYY-MM-DD].html
352
+
353
+ ---
354
+
355
+ ### Subject Lines
356
+ A. [subject A] -- [formula]
357
+ B. [subject B] -- [formula]
358
+ C. [subject C] -- [formula]
359
+ Recommended: [letter] -- [one-sentence reason]
360
+
361
+ ---
362
+
363
+ ### Send Checklist
364
+ - [ ] Replace [CTA_URL] with your actual link
365
+ - [ ] Replace [COMPANY NAME] and [CITY, COUNTRY] in footer
366
+ - [ ] Replace [YOUR BRAND] in header with your brand name (or swap in a logo image)
367
+ - [ ] Verify unsubscribe variable works in [platform]
368
+ - [ ] Send a test email to yourself before launching
369
+ ```
370
+
371
+ Do not print the HTML in the chat. The file path tells the user where to find it.
372
+
373
+ ---
374
+
375
+ ## Section Reference
376
+
377
+ | Section | Purpose |
378
+ |---|---|
379
+ | header | Logo + issue number or date |
380
+ | hero | Big headline + 1-2 sentence hook |
381
+ | intro | Short personal note or context |
382
+ | main-content | Primary article or insight (text-heavy) |
383
+ | image-block | Full-width image + caption |
384
+ | stat-callout | Highlighted stat or quote in a box |
385
+ | secondary-section | Second story or feature |
386
+ | product-cta | Soft product plug or feature highlight |
387
+ | sponsor-block | Sponsored content (clearly labeled) |
388
+ | quick-links | Curated links section (3-5 items) |
389
+ | footer | Unsubscribe link, company info, legal |
390
+
391
+ ## Output Formats (on request)
392
+
393
+ - **Standard HTML** (default): inline-styled, table-based, works everywhere
394
+ - **React Email**: `.tsx` component output -- request explicitly, good for Resend + dev teams
395
+ - **Plain text**: stripped fallback always included unless user opts out
@@ -0,0 +1,35 @@
1
+ {
2
+ "skill_name": "email-newsletter",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Write a newsletter about how AI is changing B2B sales. Audience: VPs of Sales at 100-500 person SaaS companies. CTA: join our upcoming webinar. Tone: direct and confident. Platform: Beehiiv. Brand color: #856FE6.",
7
+ "expected_output": "Topic + audience + CTA present -- skips Step 1. Asks all 19 questions in Step 2 grouped into Content / Brand / Design / Platform categories, since company name, CTA URL, city, display font, button style, personalization, and issue context were not provided. After user answers: reads templates/dark-newsletter.html as base (dark background default, Instrument Serif default, no custom hex). Design direction is derived internally (not stated to user) -- technical+data-forward from the data-heavy content. Hero headline 8 words or fewer in Instrument Serif 56px with Georgia fallback. Brand strip uses #856FE6. Stat callout has border-left:4px solid #856FE6. Step badges stay #D8F90A (purple luminance too low). Category label color #856FE6. Accent discipline: #856FE6 appears in exactly 3 places. CTA pill button uses #D8F90A with #0A0A0A text. If company_name provided in answers: replaces [YOUR BRAND] and [COMPANY NAME]. If cta_url provided: replaces [CTA_URL]. Footer uses %%unsubscribe_url%% (Beehiiv). HTML saved to docs/newsletters/ai-b2b-sales-[date].html. Chat shows only subject lines + send checklist -- no HTML code fence.",
8
+ "files": []
9
+ },
10
+ {
11
+ "id": 2,
12
+ "prompt": "Draft an email newsletter for our summer product launch. Audience: existing customers aged 25-40 who bought last year. CTA: shop the collection. Tone: playful. Platform: Mailchimp.",
13
+ "expected_output": "Topic + audience + CTA present -- skips Step 1. Asks all 19 questions in Step 2 (company name, brand color, CTA URL, city, display font, button style, background, visual style, personalization, etc. not provided). After answers: uses templates/dark-newsletter.html (playful tone = dark, not formal). Design direction internal -- bold+campaign for a product launch. Hero headline energetic, 8 words or fewer, no I/We/Our. CTA pill button in hero uses #D8F90A. Yellow CTA callout card present as visual anchor. If company_name and cta_url provided: replace placeholders. Footer uses *|UNSUB|* (Mailchimp). mc:edit attributes added to editable <td> sections. No em dashes. No banned words. 3 subject lines generated. HTML saved to docs/newsletters/summer-product-launch-[date].html. No HTML in chat.",
14
+ "files": []
15
+ },
16
+ {
17
+ "id": 3,
18
+ "prompt": "Write a newsletter.",
19
+ "expected_output": "Topic, audience, and CTA are all missing. Does NOT open any template or generate any HTML. Asks for all three in Step 1 exactly: 'To get started, I need three things: 1. Topic 2. Audience 3. Primary CTA'. Stops and waits. After user provides all three, proceeds to Step 2 and asks all 19 questions in one message grouped into Content / Brand / Design / Platform categories.",
20
+ "files": []
21
+ },
22
+ {
23
+ "id": 4,
24
+ "prompt": "Write a monthly developer digest newsletter. Topic: notable open source releases this month. Audience: senior engineers and engineering managers. CTA: read the full digest. Platform: Resend. Tone: educational.",
25
+ "expected_output": "Topic + audience + CTA present -- skips Step 1. Asks all 19 questions in Step 2 (company name, brand color, CTA URL, city, background, display font, button style, visual style, personalization, issue context, length not provided). After answers: reads templates/dark-newsletter.html (dark default, Instrument Serif default). Design direction internal -- technical+data-forward for developer digest. Step cards section included for numbered releases. Hero headline uses Instrument Serif 56px with Georgia fallback. If company_name provided: replaces placeholders. Resend unsubscribe variable {unsubscribeUrl} in footer. Note in send checklist that React Email .tsx output available on request for Resend. No HTML in chat -- saved to docs/newsletters/developer-digest-[date].html. 3 subject lines generated.",
26
+ "files": []
27
+ },
28
+ {
29
+ "id": 5,
30
+ "prompt": "Write a formal investor update newsletter. Audience: our seed-round investors. CTA: read the full update. Tone: formal. Platform: Loops. Brand color: #1A3A5C.",
31
+ "expected_output": "Topic + audience + CTA present -- skips Step 1. Asks all 19 questions in Step 2 (company name, CTA URL, city, background, display font, button style, visual style, personalization, length, issue context not provided). After answers: reads templates/light-newsletter.html (formal tone triggers light template). Design direction internal -- editorial for formal investor update. Brand color #1A3A5C is dark (low luminance, near-black) -- used for header strip and stat border only, NOT for step badges or CTA button. CTA button uses #111111 on light template. If company_name provided: replaces [YOUR BRAND] and [COMPANY NAME]. Footer uses {{unsubscribe_url}} (Loops syntax). Hero headline in Instrument Serif 48-56px, Georgia fallback. No step cards (formal tone, investor update doesn't suit numbered cards). Saved to docs/newsletters/investor-update-[date].html.",
32
+ "files": []
33
+ }
34
+ ]
35
+ }