@opendirectory.dev/skills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/.claude/skills/claude-md-generator/.env.example +7 -0
  2. package/.claude/skills/claude-md-generator/README.md +78 -0
  3. package/.claude/skills/claude-md-generator/SKILL.md +248 -0
  4. package/.claude/skills/claude-md-generator/evals/evals.json +35 -0
  5. package/.claude/skills/claude-md-generator/references/section-guide.md +175 -0
  6. package/dist/e2e.test.d.ts +1 -0
  7. package/dist/e2e.test.js +62 -0
  8. package/dist/fs-adapters.d.ts +4 -0
  9. package/dist/fs-adapters.js +101 -0
  10. package/dist/fs-adapters.test.d.ts +1 -0
  11. package/dist/fs-adapters.test.js +108 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +211 -0
  14. package/dist/transformers.d.ts +6 -0
  15. package/dist/transformers.js +2 -0
  16. package/package.json +25 -0
  17. package/registry.json +226 -0
  18. package/skills/blog-cover-image-cli/.github/workflows/publish.yml +19 -0
  19. package/skills/blog-cover-image-cli/LICENSE +15 -0
  20. package/skills/blog-cover-image-cli/README.md +126 -0
  21. package/skills/blog-cover-image-cli/SKILL.md +7 -0
  22. package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/README.md +30 -0
  23. package/skills/blog-cover-image-cli/agent-skill/blog-cover-generator/SKILL.md +72 -0
  24. package/skills/blog-cover-image-cli/bin/cli.js +226 -0
  25. package/skills/blog-cover-image-cli/examples/100x_UX_Research_AI_Agent.png +0 -0
  26. package/skills/blog-cover-image-cli/examples/Firecrawl-supabase-bolt.png +0 -0
  27. package/skills/blog-cover-image-cli/examples/Git-City_Case_study_Cover_Image.jpg +0 -0
  28. package/skills/blog-cover-image-cli/examples/THE DISTRIBUTION LAYER (2).png +0 -0
  29. package/skills/blog-cover-image-cli/examples/canva-perplexity-duolingo-cover-image.png +0 -0
  30. package/skills/blog-cover-image-cli/examples/gamma-mistral-veed.png +0 -0
  31. package/skills/blog-cover-image-cli/examples/server-survival-case-study-cover-image(1).png +0 -0
  32. package/skills/blog-cover-image-cli/examples/viral-meme-automation.png +0 -0
  33. package/skills/blog-cover-image-cli/index.js +2 -0
  34. package/skills/blog-cover-image-cli/package-lock.json +2238 -0
  35. package/skills/blog-cover-image-cli/package.json +37 -0
  36. package/skills/blog-cover-image-cli/src/geminiGenerator.js +126 -0
  37. package/skills/blog-cover-image-cli/src/imageValidator.js +54 -0
  38. package/skills/blog-cover-image-cli/src/logoFetcher.js +86 -0
  39. package/skills/claude-md-generator/.env.example +7 -0
  40. package/skills/claude-md-generator/README.md +78 -0
  41. package/skills/claude-md-generator/SKILL.md +254 -0
  42. package/skills/claude-md-generator/evals/evals.json +35 -0
  43. package/skills/claude-md-generator/references/section-guide.md +175 -0
  44. package/skills/cook-the-blog/README.md +86 -0
  45. package/skills/cook-the-blog/SKILL.md +130 -0
  46. package/skills/dependency-update-bot/.env.example +13 -0
  47. package/skills/dependency-update-bot/README.md +101 -0
  48. package/skills/dependency-update-bot/SKILL.md +376 -0
  49. package/skills/dependency-update-bot/evals/evals.json +45 -0
  50. package/skills/dependency-update-bot/references/changelog-patterns.md +201 -0
  51. package/skills/docs-from-code/.env.example +13 -0
  52. package/skills/docs-from-code/README.md +97 -0
  53. package/skills/docs-from-code/SKILL.md +160 -0
  54. package/skills/docs-from-code/evals/evals.json +29 -0
  55. package/skills/docs-from-code/references/extraction-guide.md +174 -0
  56. package/skills/docs-from-code/references/output-template.md +135 -0
  57. package/skills/docs-from-code/scripts/extract_py.py +238 -0
  58. package/skills/docs-from-code/scripts/extract_ts.ts +284 -0
  59. package/skills/docs-from-code/scripts/package.json +18 -0
  60. package/skills/explain-this-pr/README.md +74 -0
  61. package/skills/explain-this-pr/SKILL.md +130 -0
  62. package/skills/explain-this-pr/evals/evals.json +35 -0
  63. package/skills/google-trends-api-skills/README.md +78 -0
  64. package/skills/google-trends-api-skills/SKILL.md +7 -0
  65. package/skills/google-trends-api-skills/google-trends-api/SKILL.md +163 -0
  66. package/skills/google-trends-api-skills/google-trends-api/references/api-responses.md +188 -0
  67. package/skills/google-trends-api-skills/google-trends-api/scripts/discover_keywords.py +344 -0
  68. package/skills/google-trends-api-skills/seo-keyword-research/SKILL.md +205 -0
  69. package/skills/google-trends-api-skills/seo-keyword-research/references/keyword-placement-guide.md +89 -0
  70. package/skills/google-trends-api-skills/seo-keyword-research/references/tech-blog-examples.md +207 -0
  71. package/skills/google-trends-api-skills/seo-keyword-research/scripts/blog_seo_research.py +373 -0
  72. package/skills/hackernews-intel/.env.example +33 -0
  73. package/skills/hackernews-intel/README.md +161 -0
  74. package/skills/hackernews-intel/SKILL.md +156 -0
  75. package/skills/hackernews-intel/evals/evals.json +35 -0
  76. package/skills/hackernews-intel/package.json +15 -0
  77. package/skills/hackernews-intel/scripts/monitor-hn.js +258 -0
  78. package/skills/kill-the-standup/.env.example +22 -0
  79. package/skills/kill-the-standup/README.md +84 -0
  80. package/skills/kill-the-standup/SKILL.md +169 -0
  81. package/skills/kill-the-standup/evals/evals.json +35 -0
  82. package/skills/kill-the-standup/references/standup-format.md +102 -0
  83. package/skills/linkedin-post-generator/.env.example +14 -0
  84. package/skills/linkedin-post-generator/README.md +107 -0
  85. package/skills/linkedin-post-generator/SKILL.md +228 -0
  86. package/skills/linkedin-post-generator/evals/evals.json +35 -0
  87. package/skills/linkedin-post-generator/references/linkedin-format.md +216 -0
  88. package/skills/linkedin-post-generator/references/output-template.md +154 -0
  89. package/skills/llms-txt-generator/.env.example +18 -0
  90. package/skills/llms-txt-generator/README.md +142 -0
  91. package/skills/llms-txt-generator/SKILL.md +176 -0
  92. package/skills/llms-txt-generator/evals/evals.json +35 -0
  93. package/skills/llms-txt-generator/references/llms-txt-spec.md +88 -0
  94. package/skills/llms-txt-generator/references/output-template.md +76 -0
  95. package/skills/llms-txt-generator/test-output/genzcareer.in/llms.txt +31 -0
  96. package/skills/luma-attendees-scraper/README.md +170 -0
  97. package/skills/luma-attendees-scraper/SKILL.md +7 -0
  98. package/skills/luma-attendees-scraper/luma_attendees_export.js +223 -0
  99. package/skills/meeting-brief-generator/.env.example +21 -0
  100. package/skills/meeting-brief-generator/README.md +90 -0
  101. package/skills/meeting-brief-generator/SKILL.md +275 -0
  102. package/skills/meeting-brief-generator/evals/evals.json +35 -0
  103. package/skills/meeting-brief-generator/references/brief-format.md +114 -0
  104. package/skills/meeting-brief-generator/references/output-template.md +150 -0
  105. package/skills/meta-ads-skill/README.md +100 -0
  106. package/skills/meta-ads-skill/SKILL.md +7 -0
  107. package/skills/meta-ads-skill/meta-ads-skill/SKILL.md +41 -0
  108. package/skills/meta-ads-skill/meta-ads-skill/references/report_templates.md +47 -0
  109. package/skills/meta-ads-skill/meta-ads-skill/references/workflows.md +51 -0
  110. package/skills/meta-ads-skill/meta-ads-skill/scripts/auth_check.py +22 -0
  111. package/skills/meta-ads-skill/meta-ads-skill/scripts/formatters.py +46 -0
  112. package/skills/newsletter-digest/.env.example +20 -0
  113. package/skills/newsletter-digest/README.md +147 -0
  114. package/skills/newsletter-digest/SKILL.md +221 -0
  115. package/skills/newsletter-digest/evals/evals.json +35 -0
  116. package/skills/newsletter-digest/feeds.json +7 -0
  117. package/skills/newsletter-digest/package.json +15 -0
  118. package/skills/newsletter-digest/references/digest-format.md +123 -0
  119. package/skills/newsletter-digest/references/output-template.md +136 -0
  120. package/skills/newsletter-digest/scripts/fetch-feeds.js +141 -0
  121. package/skills/newsletter-digest/scripts/ghost-publish.js +147 -0
  122. package/skills/noise2blog/.env.example +16 -0
  123. package/skills/noise2blog/README.md +107 -0
  124. package/skills/noise2blog/SKILL.md +229 -0
  125. package/skills/noise2blog/evals/evals.json +35 -0
  126. package/skills/noise2blog/references/blog-format.md +188 -0
  127. package/skills/noise2blog/references/output-template.md +184 -0
  128. package/skills/outreach-sequence-builder/.env.example +12 -0
  129. package/skills/outreach-sequence-builder/README.md +108 -0
  130. package/skills/outreach-sequence-builder/SKILL.md +248 -0
  131. package/skills/outreach-sequence-builder/evals/evals.json +36 -0
  132. package/skills/outreach-sequence-builder/references/output-template.md +171 -0
  133. package/skills/outreach-sequence-builder/references/sequence-format.md +167 -0
  134. package/skills/outreach-sequence-builder/references/signal-playbook.md +117 -0
  135. package/skills/position-me/README.md +71 -0
  136. package/skills/position-me/SKILL.md +7 -0
  137. package/skills/position-me/position-me/SKILL.md +50 -0
  138. package/skills/position-me/position-me/references/EVALUATION_SOP.md +40 -0
  139. package/skills/position-me/position-me/references/REPORT_TEMPLATE.md +58 -0
  140. package/skills/position-me/position-me/scripts/extract_links.py +49 -0
  141. package/skills/pr-description-writer/README.md +81 -0
  142. package/skills/pr-description-writer/SKILL.md +141 -0
  143. package/skills/pr-description-writer/evals/evals.json +35 -0
  144. package/skills/pr-description-writer/references/pr-format-guide.md +145 -0
  145. package/skills/producthunt-launch-kit/.env.example +7 -0
  146. package/skills/producthunt-launch-kit/README.md +95 -0
  147. package/skills/producthunt-launch-kit/SKILL.md +380 -0
  148. package/skills/producthunt-launch-kit/evals/evals.json +35 -0
  149. package/skills/producthunt-launch-kit/references/copy-rules.md +124 -0
  150. package/skills/reddit-icp-monitor/.env.example +16 -0
  151. package/skills/reddit-icp-monitor/README.md +117 -0
  152. package/skills/reddit-icp-monitor/SKILL.md +271 -0
  153. package/skills/reddit-icp-monitor/evals/evals.json +40 -0
  154. package/skills/reddit-icp-monitor/references/icp-format.md +131 -0
  155. package/skills/reddit-icp-monitor/references/reply-rules.md +110 -0
  156. package/skills/reddit-post-engine/.env.example +13 -0
  157. package/skills/reddit-post-engine/README.md +103 -0
  158. package/skills/reddit-post-engine/SKILL.md +303 -0
  159. package/skills/reddit-post-engine/evals/evals.json +35 -0
  160. package/skills/reddit-post-engine/references/subreddit-playbook.md +156 -0
  161. package/skills/schema-markup-generator/.env.example +19 -0
  162. package/skills/schema-markup-generator/README.md +114 -0
  163. package/skills/schema-markup-generator/SKILL.md +192 -0
  164. package/skills/schema-markup-generator/evals/evals.json +35 -0
  165. package/skills/schema-markup-generator/references/json-ld-spec.md +263 -0
  166. package/skills/schema-markup-generator/references/output-template.md +556 -0
  167. package/skills/show-hn-writer/.env.example +14 -0
  168. package/skills/show-hn-writer/README.md +88 -0
  169. package/skills/show-hn-writer/SKILL.md +303 -0
  170. package/skills/show-hn-writer/evals/evals.json +35 -0
  171. package/skills/show-hn-writer/references/hn-rules.md +74 -0
  172. package/skills/show-hn-writer/references/title-formulas.md +93 -0
  173. package/skills/stargazer/README.md +79 -0
  174. package/skills/stargazer/SKILL.md +7 -0
  175. package/skills/stargazer/stargazer-skill/SKILL.md +58 -0
  176. package/skills/stargazer/stargazer-skill/assets/.env.example +18 -0
  177. package/skills/stargazer/stargazer-skill/scripts/convert_to_csv.py +63 -0
  178. package/skills/stargazer/stargazer-skill/scripts/count_emails.py +52 -0
  179. package/skills/stargazer/stargazer-skill/scripts/stargazer_deep_extractor.py +450 -0
  180. package/skills/tweet-thread-from-blog/.env.example +14 -0
  181. package/skills/tweet-thread-from-blog/README.md +109 -0
  182. package/skills/tweet-thread-from-blog/SKILL.md +177 -0
  183. package/skills/tweet-thread-from-blog/evals/evals.json +35 -0
  184. package/skills/tweet-thread-from-blog/references/output-template.md +193 -0
  185. package/skills/tweet-thread-from-blog/references/thread-format.md +107 -0
  186. package/skills/twitter-GTM-find-skill/README.md +43 -0
  187. package/skills/twitter-GTM-find-skill/SKILL.md +7 -0
  188. package/skills/twitter-GTM-find-skill/twitter-GTM-find/SKILL.md +37 -0
  189. package/skills/twitter-GTM-find-skill/twitter-GTM-find/references/icp-checklist.md +35 -0
  190. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/package.json +23 -0
  191. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/run_pipeline.sh +8 -0
  192. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/debug.ts +23 -0
  193. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/extractor.ts +79 -0
  194. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/icp-filter.ts +87 -0
  195. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/index.ts +94 -0
  196. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/src/scraper.ts +41 -0
  197. package/skills/twitter-GTM-find-skill/twitter-GTM-find/scripts/tsconfig.json +13 -0
  198. package/skills/yc-intent-radar-skill/README.md +39 -0
  199. package/skills/yc-intent-radar-skill/SKILL.md +7 -0
  200. package/skills/yc-intent-radar-skill/yc-jobs-scraper/SKILL.md +59 -0
  201. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/auth.js +29 -0
  202. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/db.js +62 -0
  203. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/export_radar_candidates.js +40 -0
  204. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package-lock.json +1525 -0
  205. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/package.json +12 -0
  206. package/skills/yc-intent-radar-skill/yc-jobs-scraper/scripts/scraper.js +217 -0
  207. package/src/e2e.test.ts +35 -0
  208. package/src/fs-adapters.test.ts +91 -0
  209. package/src/fs-adapters.ts +65 -0
  210. package/src/index.ts +182 -0
  211. package/src/transformers.ts +6 -0
  212. package/tsconfig.json +8 -0
@@ -0,0 +1,229 @@
1
+ ---
2
+ name: noise2blog
3
+ description: Turns rough notes, bullet points, voice transcripts, or tweet dumps into a polished, publication-ready blog post. Optionally enriches with Tavily research to add supporting data and credibility to claims. Use when asked to write a blog post from notes, turn rough ideas into an article, expand bullet points into a full post, clean up a voice transcript into a blog, or repurpose a tweet thread as an article. Trigger when a user says "write a blog post from this", "turn these notes into a post", "expand this into an article", "make this publishable", "I have rough notes write a blog", or "clean up this transcript".
4
+ compatibility: [claude-code, gemini-cli, github-copilot]
5
+ author: OpenDirectory
6
+ version: 1.0.0
7
+ ---
8
+
9
+ # Noise to Blog
10
+
11
+ Take any rough input (bullet points, voice transcripts, tweet dumps, or short drafts) and produce a polished, publication-ready blog post. Every claim traces to the source material or Tavily-verified research.
12
+
13
+ ---
14
+
15
+ **Critical rule:** DO NOT INVENT SPECIFICS. Every claim, metric, and example in the blog post must come from the raw input or a Tavily search result. Never fabricate data, quotes, or outcomes.
16
+
17
+ ---
18
+
19
+ ## Step 1: Setup Check
20
+
21
+ Confirm required env vars are set:
22
+
23
+ ```bash
24
+ echo "GEMINI_API_KEY: ${GEMINI_API_KEY:+set}"
25
+ echo "TAVILY_API_KEY: ${TAVILY_API_KEY:-not set, Tavily enrichment will be skipped}"
26
+ ```
27
+
28
+ **If GEMINI_API_KEY is missing:**
29
+ Stop. Tell the user: "GEMINI_API_KEY is required. Get it at aistudio.google.com → Get API key. Add it to your .env file."
30
+
31
+ **If TAVILY_API_KEY is missing:**
32
+ Continue. Note that Tavily enrichment will be skipped. The blog post will be based entirely on the provided content. This is fine for personal stories, tutorials from experience, or opinion pieces.
33
+
34
+ **Confirm input is present.**
35
+ The user must provide one of:
36
+ - Pasted text (bullet points, rough notes, transcript, tweet dump, short draft)
37
+ - A URL to fetch
38
+
39
+ If no input, ask: "Share your rough notes, bullet points, or transcript. Paste them directly, or give me a URL to fetch the source."
40
+
41
+ ---
42
+
43
+ ## Step 2: Read and Analyze Input
44
+
45
+ **If input is a URL:**
46
+ Fetch the page content using WebFetch. Extract: title, author, publish date, all body text, key statistics, numbered lists, subheadings, quotes.
47
+
48
+ **If input is pasted text:**
49
+ Read it directly. Identify the input type:
50
+ - **Bullet points or rough notes**: fragmented ideas, incomplete sentences, stream of consciousness
51
+ - **Voice transcript**: conversational, repetitive, filler words (um, uh, like, you know), meandering sentences
52
+ - **Tweet thread dump**: short fragments, @mentions, hashtags, "1/8" numbering
53
+ - **Short draft**: structured but thin, needs expansion and polish
54
+
55
+ **QA checkpoint:** State before continuing:
56
+ 1. Input type detected
57
+ 2. Core thesis or main argument in one sentence
58
+ 3. The 3-5 strongest insights, facts, or ideas from the raw content
59
+ 4. Any claims that need external verification (benchmarks, statistics, product comparisons, research findings)
60
+
61
+ If you cannot identify a core thesis, ask: "What's the single most important thing you want readers to take away from this?"
62
+
63
+ ---
64
+
65
+ ## Step 3: Choose Blog Post Style
66
+
67
+ Four styles. Auto-detect from content signals. User override always respected.
68
+
69
+ | Style | When to use | Signals |
70
+ |-------|-------------|---------|
71
+ | Technical Tutorial | Step-by-step guide, how-to, code walkthrough | Numbered steps, commands, code snippets, "how to" in content |
72
+ | Case Study | Before/after story, build log, lessons learned | Specific results, timelines, first-person journey |
73
+ | Thought Leadership | Opinion, argument, counterintuitive claim | "I think", "the problem with X", contrarian position, debate framing |
74
+ | Explainer | What is X, why it matters, how it works | Concept-first, comparison-heavy, "most people don't know" |
75
+
76
+ **Detection logic:**
77
+ - Content has numbered steps or commands → Technical Tutorial
78
+ - Content has before/after, specific metrics, or narrative arc → Case Study
79
+ - Content argues against common wisdom or makes a strong opinion claim → Thought Leadership
80
+ - Content explains a concept, tool, or trend for people unfamiliar with it → Explainer
81
+
82
+ State chosen style and reasoning. If ambiguous, pick one and note the choice.
83
+
84
+ ---
85
+
86
+ ## Step 4: Enrich with Tavily Research
87
+
88
+ Skip this step silently if TAVILY_API_KEY is not set.
89
+
90
+ Search for supporting evidence for claims in the raw content that could benefit from verification or data. Good candidates:
91
+ - Product benchmarks or performance numbers
92
+ - Market statistics or industry trends
93
+ - Technical comparisons ("X is faster than Y")
94
+ - Any number the user mentioned from memory rather than a cited source
95
+
96
+ Run one Tavily search per claim that needs verification. Limit to 3 searches maximum to avoid over-sourcing:
97
+
98
+ ```bash
99
+ curl -s -X POST "https://api.tavily.com/search" \
100
+ -H "Content-Type: application/json" \
101
+ -d '{
102
+ "api_key": "'"$TAVILY_API_KEY"'",
103
+ "query": "SPECIFIC_CLAIM_OR_TOPIC",
104
+ "search_depth": "advanced",
105
+ "max_results": 5,
106
+ "include_answer": true
107
+ }'
108
+ ```
109
+
110
+ Keep results with `score >= 0.65`. Extract: title, url, content snippet.
111
+
112
+ **Rules for using Tavily results:**
113
+ - Use them to support or verify claims already present in the raw input. Never introduce entirely new claims from search results.
114
+ - Attribute sources naturally in the text: "according to [Source]", "data from [X] shows"
115
+ - If no Tavily result confirms a claim, leave the claim unverified rather than substituting an unrelated result
116
+
117
+ ---
118
+
119
+ ## Step 5: Generate the Blog Post
120
+
121
+ Read `references/blog-format.md` in full. Select the matching template from `references/output-template.md`. Internalize all rules before generating.
122
+
123
+ Write the Gemini request to a temp file to handle special characters safely:
124
+
125
+ ```bash
126
+ cat > /tmp/noise2blog-request.json << 'ENDJSON'
127
+ {
128
+ "system_instruction": {
129
+ "parts": [{
130
+ "text": "You are a tech writer who sounds like a real person. Rules: Active voice only. Short paragraphs, 1-3 lines max, then a blank line. Use contractions naturally (don't, won't, it's, can't, you're, they're). No em dashes — use a comma or period instead. No semicolons. Every sentence needs a concrete detail: a number, a tool name, a file name, a command, a result. No filler phrases: no 'In today's rapidly evolving', no 'Let's dive in', no 'It's worth noting', no 'In conclusion', no 'I hope this was helpful'. No banned words: incredible, amazing, leveraging, synergize, game-changing, groundbreaking, revolutionary, paradigm, cutting-edge, seamless, robust, unprecedented, delve, harness, utilize, transformative, disruptive, unlock, comprehensive, actionable, crucial, pivotal. Title must not start with I, My, or We. Open with a hook paragraph that does not announce the topic. Close with something actionable. Do not invent claims, metrics, or outcomes not present in the source material."
131
+ }]
132
+ },
133
+ "contents": [{
134
+ "parts": [{
135
+ "text": "RAW_CONTENT_AND_INSTRUCTIONS_HERE"
136
+ }]
137
+ }],
138
+ "generationConfig": {
139
+ "temperature": 0.7,
140
+ "maxOutputTokens": 4096
141
+ }
142
+ }
143
+ ENDJSON
144
+ ```
145
+
146
+ Replace `RAW_CONTENT_AND_INSTRUCTIONS_HERE` with:
147
+ - The raw input content
148
+ - The blog post style and structure instructions (from the selected template)
149
+ - Any Tavily research results gathered in Step 4
150
+ - Word target: 800-1,800 words
151
+
152
+ Post the request:
153
+
154
+ ```bash
155
+ curl -s -X POST \
156
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \
157
+ -H "Content-Type: application/json" \
158
+ -d @/tmp/noise2blog-request.json \
159
+ | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['candidates'][0]['content']['parts'][0]['text'])"
160
+ ```
161
+
162
+ Also produce:
163
+ - (B) A 1-2 sentence meta description for SEO preview text
164
+ - (C) One alternative title using a different hook angle
165
+
166
+ ---
167
+
168
+ ## Step 6: Self-QA
169
+
170
+ Run every check and fix violations before presenting:
171
+
172
+ - [ ] Title does not start with "I", "My", or "We"
173
+ - [ ] Title is specific and conversational (not "A Comprehensive Guide to X" or "The Ultimate Guide to Y")
174
+ - [ ] Opening paragraph hooks without announcing the topic ("In this post I will...")
175
+ - [ ] No em dashes in any line
176
+ - [ ] No semicolons
177
+ - [ ] No paragraph longer than 3 lines before a blank line
178
+ - [ ] No banned words: incredible, amazing, leveraging, game-changing, delve, harness, unlock, groundbreaking, cutting-edge, remarkable, paradigm, revolutionize, seamless, robust, utilize, unprecedented, comprehensive, actionable, crucial, pivotal
179
+ - [ ] No invented data: every claim traces to the raw input or a Tavily result
180
+ - [ ] Post does not end with "In conclusion", "To summarize", or "I hope this helped"
181
+ - [ ] 800-1,800 words (state the word count)
182
+ - [ ] Logical flow: opening → problem/context → body sections → actionable close
183
+
184
+ Fix any violation before presenting. State the final word count.
185
+
186
+ ---
187
+
188
+ ## Step 7: Output
189
+
190
+ Present the full blog post in a code block.
191
+
192
+ Present the meta description and alternative title below the main post.
193
+
194
+ Ask: "Ready to copy this to your editor? If you're publishing to a specific platform, let me know and I can format the frontmatter."
195
+
196
+ **On platform-specific request:**
197
+
198
+ Ghost:
199
+ ```yaml
200
+ ---
201
+ title: "POST_TITLE"
202
+ date: YYYY-MM-DD
203
+ tags: [tag1, tag2]
204
+ status: draft
205
+ ---
206
+ ```
207
+
208
+ dev.to:
209
+ ```yaml
210
+ ---
211
+ title: POST_TITLE
212
+ description: META_DESCRIPTION
213
+ tags: [tag1, tag2, tag3]
214
+ published: false
215
+ ---
216
+ ```
217
+
218
+ Substack: Present as plain Markdown. Substack's editor imports markdown directly.
219
+
220
+ Hashnode:
221
+ ```yaml
222
+ ---
223
+ title: POST_TITLE
224
+ subtitle: META_DESCRIPTION
225
+ tags: [tag1, tag2]
226
+ ---
227
+ ```
228
+
229
+
@@ -0,0 +1,35 @@
1
+ {
2
+ "skill_name": "noise2blog",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Write a blog post from these notes: [pasted bullet points about a debugging session — found a race condition in a queue worker, fixed it by adding a mutex, 3 days of debugging, specific error messages mentioned]",
7
+ "expected_output": "Agent detects bullet points / rough notes as input type. Identifies core thesis (debugging race condition in queue worker). Chooses Case Study style based on narrative signals. Reads blog-format.md and output-template.md. Calls Gemini with anti-slop system prompt. Produces 800-1,400 word blog post: title does not start with I/My/We, opening paragraph hooks without announcing topic, no em dashes, no banned words, 1-3 line paragraphs with blank lines. States word count. Presents meta description and alternative title. Post ends with actionable close, not summary statement.",
8
+ "files": []
9
+ },
10
+ {
11
+ "id": 2,
12
+ "prompt": "Turn this voice transcript into a blog post: [rambling transcript with filler words, repeated ideas, conversational tone — about switching from REST to GraphQL, mentions 40% reduction in overfetching, team pushback initially]",
13
+ "expected_output": "Agent detects voice transcript input type. Strips filler language during analysis. Identifies core thesis (REST to GraphQL migration, measurable outcome). Detects Case Study or Thought Leadership style. If TAVILY_API_KEY is set, searches for supporting data on GraphQL adoption or overfetching benchmarks. Produces clean blog post that sounds like a real person — contractions present, no banned words. The specific 40% reduction number appears in the post since it came from the source material. Does not invent additional metrics. States word count.",
14
+ "files": []
15
+ },
16
+ {
17
+ "id": 3,
18
+ "prompt": "Turn this tweet thread into a blog post: [10 tweets arguing that most devs optimize the wrong database queries, mentions a specific production incident, no stats cited]",
19
+ "expected_output": "Agent detects tweet thread dump input type. Identifies Thought Leadership style from the contrarian argument signals. Notes that no statistics are cited in the raw input. If TAVILY_API_KEY is set, optionally searches for database query optimization data to support claims — but only uses results that confirm claims already in the tweets, does not introduce new arguments. Produces blog post using Thought Leadership template: claim stated in opening, common assumption section, evidence section, counterargument, nuance, actionable close. No invented metrics. Word count stated.",
20
+ "files": []
21
+ },
22
+ {
23
+ "id": 4,
24
+ "prompt": "Write a blog post from this URL: https://example-engineering-blog.com/article",
25
+ "expected_output": "Agent fetches URL content using WebFetch. Extracts title, body text, statistics, and structure. Identifies input type as article/URL. Detects blog style from content signals. Reads format rules and selects appropriate template. Generates blog post — does not plagiarize source, synthesizes the content into a new post in the author's voice. Every claim traces to content extracted from the URL. Presents word count, meta description, and alternative title. If the fetched URL returns an error, agent tells the user and asks them to paste the content directly.",
26
+ "files": []
27
+ },
28
+ {
29
+ "id": 5,
30
+ "prompt": "Write a blog post from my notes about deploying a Node.js app",
31
+ "expected_output": "Agent checks for GEMINI_API_KEY — it is missing. Agent stops immediately at Step 1. Tells the user: 'GEMINI_API_KEY is required. Get it at aistudio.google.com → Get API key. Add it to your .env file.' Does not attempt to fetch content or generate anything without the API key.",
32
+ "files": []
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,188 @@
1
+ # Blog Format Guide
2
+
3
+ ## Section 1: Why Format Matters
4
+
5
+ Most blog posts fail at the first paragraph. Readers scan — they read the title, the first sentence, and maybe one or two more. If nothing grabs them, they're gone. Format is not about aesthetics: it is about keeping someone reading past the first scroll.
6
+
7
+ Short paragraphs signal that reading this will not be painful. Concrete details signal that the author has done real work. A specific title signals that the post is about one thing, not a vague survey of a topic.
8
+
9
+ ---
10
+
11
+ ## Section 2: Title Rules
12
+
13
+ The title is the single highest-leverage element. A bad title kills a good post.
14
+
15
+ Must:
16
+ - Name the specific thing the post is about
17
+ - Create a reason to click (curiosity gap, specific benefit, or counterintuitive claim)
18
+ - Be under 70 characters
19
+ - Use conversational English
20
+
21
+ Must not:
22
+ - Start with "I", "My", or "We"
23
+ - Use: "A Comprehensive Guide to", "The Ultimate Guide to", "Everything You Need to Know About"
24
+ - Use clickbait that the post does not deliver on
25
+
26
+ Formats that work:
27
+ - Specific result: "How we cut deploy time from 47 minutes to 4"
28
+ - Counterintuitive claim: "The feature our users love most took 2 hours to build"
29
+ - How-to with specifics: "How to set up agent memory that actually persists"
30
+ - Problem statement: "Why your RAG pipeline is slower than it needs to be"
31
+ - Tool comparison with a point: "Playwright vs Puppeteer: what actually matters for E2E tests"
32
+
33
+ ---
34
+
35
+ ## Section 3: Opening Paragraph Rules
36
+
37
+ The opening paragraph must hook without announcing what you are about to do.
38
+
39
+ Must not:
40
+ - "In this post, I will..."
41
+ - "Today we're going to explore..."
42
+ - "This article covers..."
43
+ - "Welcome to this guide on..."
44
+ - Any variation of "let's dive in"
45
+
46
+ Do:
47
+ - Open with the most surprising or concrete thing from the post
48
+ - State a problem the reader recognizes
49
+ - Make a bold claim you will back up
50
+ - Drop into a specific moment or situation
51
+
52
+ Examples that work:
53
+ - "We spent three weeks debugging a race condition that turned out to be a single missing await."
54
+ - "Most developers add caching too late. By the time you notice the N+1 query, your database is already the bottleneck."
55
+ - "The CSV export feature took two hours. Users mentioned it in 40% of support tickets."
56
+
57
+ ---
58
+
59
+ ## Section 4: Body Rules
60
+
61
+ **Paragraph length:** 1-3 lines max, then a blank line. Never 4 consecutive lines without a break.
62
+
63
+ **Sentence length:** Mix short and long. Short sentences hit hard. Then follow up with a sentence that gives context, adds nuance, or shows the reader why it matters.
64
+
65
+ **Specificity:** Every section needs at least one concrete detail — a number, a file name, a command, a tool name, a before/after comparison. Remove any sentence that could apply to any post on the topic.
66
+
67
+ **Headers (H2):** 3-5 major sections. Each section covers one idea. Use headers to break the scan path for readers who skip ahead.
68
+
69
+ **Code blocks:** Use triple-backtick fenced blocks. Never inline code in a paragraph when a block would be clearer.
70
+
71
+ **Lists:** Use for steps, options, or comparisons. Do not force a list when prose would flow better.
72
+
73
+ ---
74
+
75
+ ## Section 5: Story Arcs by Style
76
+
77
+ ### Technical Tutorial
78
+ ```
79
+ [Hook — the end result, or what most people get wrong about this]
80
+ [Why this matters — who this is for, what problem it solves]
81
+ [Prerequisites — only what is actually needed]
82
+ [Step 1 — one action]
83
+ [Step 2 — one action]
84
+ [Step 3 — one action]
85
+ [Common mistake — what breaks here and why]
86
+ [Result — what working looks like]
87
+ [Actionable close — next step or variation]
88
+ ```
89
+
90
+ ### Case Study
91
+ ```
92
+ [Hook — the end result or the key moment that changed things]
93
+ [Setup — where things started, what the problem was]
94
+ [Decision — what was tried or changed]
95
+ [What happened — the outcome, including surprises]
96
+ [What we learned — the lesson extracted]
97
+ [What to take from this — for the reader, not just the author]
98
+ [Actionable close]
99
+ ```
100
+
101
+ ### Thought Leadership
102
+ ```
103
+ [Hook — the contrarian claim stated directly]
104
+ [The assumption — what most people believe and why]
105
+ [The evidence — what you actually observed]
106
+ [The implication — what changes if the claim is true]
107
+ [The counterargument — steelman the other side]
108
+ [The rebuttal — why the position holds]
109
+ [The nuance — edge cases and when this does not apply]
110
+ [Actionable close — what should change as a result]
111
+ ```
112
+
113
+ ### Explainer
114
+ ```
115
+ [Hook — what knowing this enables, or the common misconception]
116
+ [The problem with the standard explanation]
117
+ [What X actually is — plain English, one paragraph]
118
+ [How it works — mechanism, not just definition]
119
+ [Real example — concrete, not hypothetical]
120
+ [When to use it vs alternatives]
121
+ [Actionable close — try this or read this next]
122
+ ```
123
+
124
+ ---
125
+
126
+ ## Section 6: Closing Rules
127
+
128
+ End with exactly one of:
129
+ - An actionable next step: "Try this on your next feature branch and check if the diff size changes."
130
+ - A direct question that invites real responses: "What's the bottleneck in your current setup?"
131
+ - A pointer to the next logical resource: "If this applies to your stack, the GitHub repo is in the description."
132
+
133
+ Do not use:
134
+ - "In conclusion..."
135
+ - "To summarize..."
136
+ - "I hope this was helpful."
137
+ - "Thanks for reading."
138
+ - Two CTAs at once
139
+
140
+ ---
141
+
142
+ ## Section 7: Length Guide
143
+
144
+ | Post type | Target word count |
145
+ |-----------|------------------|
146
+ | Tutorial (focused, one task) | 800-1,200 words |
147
+ | Case study (a real story) | 1,000-1,600 words |
148
+ | Thought leadership (one argument) | 800-1,400 words |
149
+ | Explainer (one concept) | 900-1,500 words |
150
+
151
+ Under 600 words feels shallow unless it is a quick tip. Over 2,000 words requires a very strong argument for staying that long.
152
+
153
+ ---
154
+
155
+ ## Section 8: Banned Words
156
+
157
+ Do not use any of these in any paragraph or heading:
158
+
159
+ incredible, amazing, leveraging, synergize, game-changing, game changer, let's dive in, buckle up, it's worth noting, delve, harness, unlock, groundbreaking, cutting-edge, remarkable, paradigm, revolutionize, disruptive, transformative, thrilled, excited to share, powerful, innovative, comprehensive, actionable, crucial, vital, pivotal, elucidate, utilize, robust, seamless, unprecedented, state-of-the-art, at its core, the landscape of, in the world of, whether you're a beginner or an expert, from X to Y this covers everything, look no further, in today's rapidly evolving
160
+
161
+ If you see one of these in a draft section, rewrite that sentence before presenting.
162
+
163
+ ---
164
+
165
+ ## Section 9: No Em Dashes
166
+
167
+ Do not use em dashes (—) anywhere in the post. Replace with:
168
+ - A comma where a pause belongs
169
+ - A period to break a long sentence into two
170
+ - A colon before an explanation
171
+
172
+ ---
173
+
174
+ ## Section 10: Validation Checklist
175
+
176
+ Before presenting the draft, verify:
177
+
178
+ - [ ] Title does not start with "I", "My", or "We"
179
+ - [ ] Title is specific (not "a guide", not "the ultimate", not "everything about")
180
+ - [ ] Opening paragraph hooks without announcing the topic
181
+ - [ ] No em dashes in any line
182
+ - [ ] No semicolons
183
+ - [ ] No paragraph longer than 3 lines without a blank line
184
+ - [ ] No banned words
185
+ - [ ] Every claim traces to the raw input or a Tavily result
186
+ - [ ] Post ends with an action, a question, or a pointer — not a summary statement
187
+ - [ ] Word count is in target range (state the count)
188
+ - [ ] Logical flow throughout (each section leads to the next)
@@ -0,0 +1,184 @@
1
+ # Output Templates
2
+
3
+ Four templates: Technical Tutorial, Case Study, Thought Leadership, Explainer.
4
+
5
+ Select the template that matches the detected or user-specified style. Replace every [BRACKETED SLOT] with content from the raw input. Never leave bracket text in the output. Skip a slot entirely if there is no source material for it — do not invent content to fill it.
6
+
7
+ ---
8
+
9
+ ## Template 1: Technical Tutorial
10
+
11
+ Use when the raw content is a step-by-step guide, how-to, or code walkthrough.
12
+
13
+ ```markdown
14
+ [TITLE — specific result or what most people get wrong. Under 70 chars. Does not start with I/My/We.]
15
+
16
+ [HOOK — 2-3 sentences. The end result a reader achieves, or the mistake most people make. No "In this post". No "Let's dive in".]
17
+
18
+ [CONTEXT — 1-2 sentences. Who this is for and what problem it solves. Be specific about the situation.]
19
+
20
+ ## [PREREQUISITE SECTION TITLE — e.g. "What you need"]
21
+
22
+ [List only prerequisites that are genuinely required. Skip this section if there are none.]
23
+
24
+ ## [STEP 1 TITLE — one action, named concretely]
25
+
26
+ [Step 1 content. One task. Include the command, code, or UI action. 1-3 paragraphs max.]
27
+
28
+ ## [STEP 2 TITLE]
29
+
30
+ [Step 2 content.]
31
+
32
+ ## [STEP 3 TITLE]
33
+
34
+ [Step 3 content.]
35
+
36
+ ## [OPTIONAL: STEP 4 TITLE — common mistake or edge case at this stage]
37
+
38
+ [What breaks here and why. Only include if the raw input mentions it.]
39
+
40
+ ## [RESULT TITLE — e.g. "What it looks like when it works"]
41
+
42
+ [2-3 sentences describing the working end state. Include a concrete output — a log line, a screenshot description, a returned value.]
43
+
44
+ [ACTIONABLE CLOSE — one specific next step or variation the reader can try. Not "I hope this was helpful".]
45
+ ```
46
+
47
+ **Worked example:**
48
+
49
+ Raw input: Rough notes on setting up Playwright for E2E tests in a Next.js app — mentions `npx playwright install`, a config file location, the `page.goto()` pattern, and a note that webkit tests fail without a specific environment variable.
50
+
51
+ Generated title: "Setting up Playwright in a Next.js app without breaking webkit tests"
52
+
53
+ Generated opening: "Playwright installs in one command. Getting webkit tests to actually run in CI takes a bit more. Here's the setup that works without the two-hour debugging session."
54
+
55
+ ---
56
+
57
+ ## Template 2: Case Study
58
+
59
+ Use when the raw content is a build log, before/after story, lessons-learned post, or first-person journey.
60
+
61
+ ```markdown
62
+ [TITLE — the end result or the key moment. Under 70 chars. Does not start with I/My/We.]
63
+
64
+ [HOOK — 2-3 sentences. The end state or the most surprising outcome from the story. Drops the reader into the situation.]
65
+
66
+ ## [CONTEXT TITLE — e.g. "Where things started" or the specific problem]
67
+
68
+ [Setup: what the situation was before. Be specific about the pain or the constraint. 1-2 paragraphs.]
69
+
70
+ ## [DECISION TITLE — e.g. "What we tried" or "The change we made"]
71
+
72
+ [The specific action taken. What was built, changed, or dropped. Include concrete details: what was replaced with what, how long it took, who was involved.]
73
+
74
+ ## [OUTCOME TITLE — e.g. "What happened" or "The result"]
75
+
76
+ [The outcome, including anything unexpected. Specific numbers if available. Do not invent metrics not in the source.]
77
+
78
+ ## [LESSON TITLE — e.g. "What we learned" or "The thing nobody warned us about"]
79
+
80
+ [The extracted insight. Should be transferable to someone not in the exact same situation. 1-2 paragraphs.]
81
+
82
+ [ACTIONABLE CLOSE — what the reader should try, check, or think about based on this story.]
83
+ ```
84
+
85
+ **Worked example:**
86
+
87
+ Raw input: Voice transcript about rebuilding a feature that served 10k users — mentions moving from a cron job to an event-driven queue, reducing latency from 8 seconds to 400ms, and the unexpected issue with message ordering after the switch.
88
+
89
+ Generated title: "Moving 10,000 users from a cron job to a queue: what nobody tells you about message ordering"
90
+
91
+ ---
92
+
93
+ ## Template 3: Thought Leadership
94
+
95
+ Use when the raw content makes a strong opinion claim, argues against common advice, or takes a counterintuitive position.
96
+
97
+ ```markdown
98
+ [TITLE — the contrarian claim stated directly. Under 70 chars. Does not start with I/My/We.]
99
+
100
+ [HOOK — 2-3 sentences. The claim, stated plainly. Do not hedge. The reader should immediately know what you're arguing.]
101
+
102
+ ## [THE ASSUMPTION — e.g. "What most teams believe"]
103
+
104
+ [1-2 sentences stating the common belief. Be fair to the other side.]
105
+
106
+ [1-2 sentences explaining why people hold this belief. What evidence supports it?]
107
+
108
+ ## [THE EVIDENCE — e.g. "What actually happens" or "What the data shows"]
109
+
110
+ [Specific observations, results, or data points from the raw input. This is the core of the argument. 2-3 paragraphs.]
111
+
112
+ ## [THE IMPLICATION — e.g. "What changes if this is true"]
113
+
114
+ [Concrete consequences of accepting the claim. What should readers do differently? 1-2 paragraphs.]
115
+
116
+ ## [THE COUNTERARGUMENT — e.g. "The case against this"]
117
+
118
+ [Steelman the other side. The strongest objection to the claim. 1 paragraph.]
119
+
120
+ ## [THE NUANCE — e.g. "When I'm wrong"]
121
+
122
+ [Edge cases. When does the claim not hold? Being honest here makes the argument stronger. 1 paragraph.]
123
+
124
+ [ACTIONABLE CLOSE — what the reader should try or reconsider based on the argument. Ask for pushback specifically if the post invites debate.]
125
+ ```
126
+
127
+ **Worked example:**
128
+
129
+ Raw input: Tweet dump arguing that code reviews slow down small teams more than they help — mentions two data points about merge time, a quote from a teammate, and a suggestion to use async video reviews instead.
130
+
131
+ Generated title: "Code reviews are slowing your small team down"
132
+
133
+ ---
134
+
135
+ ## Template 4: Explainer
136
+
137
+ Use when the raw content explains a concept, tool, or trend for readers who are not already familiar with it.
138
+
139
+ ```markdown
140
+ [TITLE — what knowing this enables, or the common misconception. Under 70 chars. Does not start with I/My/We.]
141
+
142
+ [HOOK — 2-3 sentences. The most surprising or counterintuitive thing about this topic. Or the misconception most people have. No "In this post I'll explain".]
143
+
144
+ ## [PROBLEM WITH STANDARD EXPLANATION — e.g. "Why the usual explanation misses something"]
145
+
146
+ [1-2 paragraphs. What's wrong or incomplete about how most sources explain this.]
147
+
148
+ ## [WHAT IT ACTUALLY IS — e.g. one clear, plain English section title]
149
+
150
+ [Plain English definition. One paragraph. No jargon unless immediately explained.]
151
+
152
+ ## [HOW IT WORKS — the mechanism]
153
+
154
+ [The underlying mechanism, not just the interface. 2-3 paragraphs. Use an analogy if it helps. Include a concrete example — a specific tool, command, or situation.]
155
+
156
+ ## [REAL EXAMPLE — specific, not hypothetical]
157
+
158
+ [Walk through one real use case. Name specific files, tools, or scenarios from the raw input. Do not use generic placeholder examples like "imagine you have an app".]
159
+
160
+ ## [WHEN TO USE IT — and when not to]
161
+
162
+ [1-2 concrete situations where this is the right choice. 1-2 where it is the wrong choice. Be specific.]
163
+
164
+ [ACTIONABLE CLOSE — what to try next. A command to run, a resource to read, or a question to ask yourself.]
165
+ ```
166
+
167
+ **Worked example:**
168
+
169
+ Raw input: Notes explaining RAG (retrieval-augmented generation) to developers who've heard the term but don't understand why it's better than fine-tuning — includes an analogy to open-book exams vs memorizing, mentions specific latency tradeoffs.
170
+
171
+ Generated title: "RAG is not just a smarter search: what the open-book analogy gets wrong"
172
+
173
+ ---
174
+
175
+ ## Fill-In Rules
176
+
177
+ 1. Replace every [BRACKETED SLOT] with content from the raw input or Tavily results
178
+ 2. Never leave bracket text in the output
179
+ 3. Skip any slot that has no source material — do not invent content to fill it
180
+ 4. If a section has no relevant source content, remove the section header too
181
+ 5. Adjust sections to match the actual content (add or remove H2 sections as needed)
182
+ 6. Apply all rules from blog-format.md to every paragraph and sentence
183
+ 7. Count words before presenting; state the count
184
+ 8. Every claim in the output must trace to the source input or a named Tavily result
@@ -0,0 +1,12 @@
1
+ # outreach-sequence-builder — Environment Variables
2
+ # ===================================================
3
+ # Gemini is required. Composio is optional (enables Gmail draft creation).
4
+
5
+ # Required: Google Gemini API key for sequence generation
6
+ # Get it: aistudio.google.com, Get API key
7
+ GEMINI_API_KEY=your_gemini_api_key_here
8
+
9
+ # Optional: Composio API key for Gmail draft creation
10
+ # Get it: app.composio.dev, API Keys section
11
+ # Without this key, sequences are output as formatted text for copy-paste only
12
+ COMPOSIO_API_KEY=your_composio_api_key_here