@jairodri/huckleberry-cli 1.0.1 → 1.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 (745) hide show
  1. package/README.md +85 -0
  2. package/agents/cos.json +2 -5
  3. package/agents/hermes/AGENTS.md +25 -49
  4. package/agents/hermes/fix-kimaki/SKILL.md +19 -92
  5. package/agents/hermes/hermes-fixer.md +44 -74
  6. package/agents/hermes.json +6 -18
  7. package/kanban/SKILL.md +18 -18
  8. package/kanban/package.json +1 -1
  9. package/kanban/src/dispatcher.mjs +1 -1
  10. package/kanban/templates/blog-social-campaign.yaml +6 -2
  11. package/kanban/templates/social-campaign.yaml +9 -4
  12. package/mcp/jev-calibration.mjs +335 -0
  13. package/mcp/jev-client.mjs +119 -0
  14. package/mcp/jev-thresholds.json +27 -0
  15. package/package.json +13 -9
  16. package/scripts/doctor-watchdog.sh +73 -0
  17. package/scripts/install-services.sh +34 -27
  18. package/scripts/self-improve-weekly.sh +34 -0
  19. package/scripts/sync-skills.mjs +121 -0
  20. package/skills/ab-test-setup/SKILL.md +266 -0
  21. package/skills/ab-test-setup/evals/evals.json +105 -0
  22. package/skills/ab-test-setup/references/sample-size-guide.md +263 -0
  23. package/skills/ab-test-setup/references/test-templates.md +277 -0
  24. package/skills/agent-reach/SKILL.md +132 -0
  25. package/skills/agent-reach/references/career.md +29 -0
  26. package/skills/agent-reach/references/dev.md +62 -0
  27. package/skills/agent-reach/references/search.md +33 -0
  28. package/skills/agent-reach/references/social.md +232 -0
  29. package/skills/agent-reach/references/video.md +130 -0
  30. package/skills/agent-reach/references/web.md +50 -0
  31. package/skills/ai-agent-seo/SKILL.md +450 -0
  32. package/skills/ai-cold-email-intelligence/SKILL.md +54 -0
  33. package/skills/ai-cold-email-intelligence/references/prompts.md +21 -0
  34. package/skills/ai-consensus-builder/SKILL.md +324 -0
  35. package/skills/ai-seo/SKILL.md +399 -0
  36. package/skills/ai-seo/evals/evals.json +90 -0
  37. package/skills/ai-seo/references/content-patterns.md +284 -0
  38. package/skills/ai-seo/references/platform-ranking-factors.md +152 -0
  39. package/skills/ai-visibility-audit/SKILL.md +322 -0
  40. package/skills/analytics-tracking/SKILL.md +309 -0
  41. package/skills/analytics-tracking/evals/evals.json +90 -0
  42. package/skills/analytics-tracking/references/event-library.md +260 -0
  43. package/skills/analytics-tracking/references/ga4-implementation.md +300 -0
  44. package/skills/analytics-tracking/references/gtm-implementation.md +390 -0
  45. package/skills/article-generator/SKILL.md +216 -0
  46. package/skills/auto-indexing/SKILL.md +179 -0
  47. package/skills/auto-indexing/scripts/auto-indexing.js +257 -0
  48. package/skills/auto-skill/SKILL.md +151 -0
  49. package/skills/auto-skill/correction-queue.js +102 -0
  50. package/skills/auto-skill/dedup.js +97 -0
  51. package/skills/auto-skill/skill-router.js +224 -0
  52. package/skills/autoresearch/SKILL.md +334 -0
  53. package/skills/autoresearch/autoresearch-autoresearch/SKILL.md.baseline +329 -0
  54. package/skills/autoresearch/autoresearch-autoresearch/changelog.md +34 -0
  55. package/skills/autoresearch/autoresearch-autoresearch/dashboard.html +116 -0
  56. package/skills/autoresearch/autoresearch-autoresearch/evals.md +39 -0
  57. package/skills/autoresearch/autoresearch-autoresearch/results.json +44 -0
  58. package/skills/autoresearch/autoresearch-autoresearch/results.tsv +3 -0
  59. package/skills/autoresearch/eval-guide.md +121 -0
  60. package/skills/b2b-cold-outreach/SKILL.md +322 -0
  61. package/skills/birdclaw/SKILL.md +82 -0
  62. package/skills/brainstorm/SKILL.md +168 -0
  63. package/skills/brand-kit-playground/SKILL.md +312 -0
  64. package/skills/brand-kit-playground/references/html-architecture.md +316 -0
  65. package/skills/brand-kit-playground/references/steal-patterns.md +88 -0
  66. package/skills/brand-voice/SKILL.md +223 -0
  67. package/skills/brand-voice/references/honesty-as-positioning.md +60 -0
  68. package/skills/brand-voice/references/voice-modes.md +1158 -0
  69. package/skills/business-advisory-council/README.md +136 -0
  70. package/skills/business-advisory-council/SKILL.md +94 -0
  71. package/skills/business-advisory-council/business-advisory-council.py +492 -0
  72. package/skills/business-advisory-council/discord-components-decision.json +8 -0
  73. package/skills/business-advisory-council/examples/steve-conley-partnership.json +6 -0
  74. package/skills/business-advisory-council/steve-conley-call-brief.json +6 -0
  75. package/skills/churn-prevention/SKILL.md +305 -0
  76. package/skills/churn-prevention/evals/evals.json +93 -0
  77. package/skills/churn-prevention/references/cancel-flow-patterns.md +316 -0
  78. package/skills/churn-prevention/references/dunning-playbook.md +408 -0
  79. package/skills/claw-compactor/LICENSE +21 -0
  80. package/skills/claw-compactor/README.md +459 -0
  81. package/skills/claw-compactor/SKILL.md +329 -0
  82. package/skills/claw-compactor/benchmark/RESULTS.md +104 -0
  83. package/skills/claw-compactor/benchmark/__init__.py +1 -0
  84. package/skills/claw-compactor/benchmark/compressors.py +520 -0
  85. package/skills/claw-compactor/benchmark/data/sample_01_devops.json +82 -0
  86. package/skills/claw-compactor/benchmark/data/sample_02_trading.json +54 -0
  87. package/skills/claw-compactor/benchmark/data/sample_03_ml_short.json +38 -0
  88. package/skills/claw-compactor/benchmark/data/sample_04_mixed_long.json +318 -0
  89. package/skills/claw-compactor/benchmark/data/sample_05_sysadmin.json +56 -0
  90. package/skills/claw-compactor/benchmark/evaluate.py +278 -0
  91. package/skills/claw-compactor/benchmark/report.py +241 -0
  92. package/skills/claw-compactor/benchmark/results/benchmark_results.json +405 -0
  93. package/skills/claw-compactor/benchmark/run_benchmark.py +238 -0
  94. package/skills/claw-compactor/engram.yaml +49 -0
  95. package/skills/claw-compactor/proxy/README.md +87 -0
  96. package/skills/claw-compactor/proxy/dashboard.html +804 -0
  97. package/skills/claw-compactor/proxy/event-log.mjs +213 -0
  98. package/skills/claw-compactor/proxy/fair-queue.mjs +288 -0
  99. package/skills/claw-compactor/proxy/metrics-store.mjs +425 -0
  100. package/skills/claw-compactor/proxy/package-lock.json +125 -0
  101. package/skills/claw-compactor/proxy/package.json +15 -0
  102. package/skills/claw-compactor/proxy/portal.html +360 -0
  103. package/skills/claw-compactor/proxy/process-registry.mjs +447 -0
  104. package/skills/claw-compactor/proxy/rate-limiter.mjs +117 -0
  105. package/skills/claw-compactor/proxy/redis-client.mjs +75 -0
  106. package/skills/claw-compactor/proxy/retry.mjs +182 -0
  107. package/skills/claw-compactor/proxy/server.mjs +2100 -0
  108. package/skills/claw-compactor/proxy/session-affinity.mjs +177 -0
  109. package/skills/claw-compactor/proxy/start.sh +23 -0
  110. package/skills/claw-compactor/proxy/test/event-log.test.mjs +237 -0
  111. package/skills/claw-compactor/proxy/test/helpers.mjs +103 -0
  112. package/skills/claw-compactor/proxy/test/integration.test.mjs +297 -0
  113. package/skills/claw-compactor/proxy/test/metrics-store.test.mjs +243 -0
  114. package/skills/claw-compactor/proxy/test/process-registry.test.mjs +390 -0
  115. package/skills/claw-compactor/proxy/test/rate-limiter.test.mjs +121 -0
  116. package/skills/claw-compactor/proxy/test/redis-client.test.mjs +62 -0
  117. package/skills/claw-compactor/proxy/test/token-tracker.test.mjs +200 -0
  118. package/skills/claw-compactor/proxy/token-tracker.mjs +482 -0
  119. package/skills/claw-compactor/pyproject.toml +26 -0
  120. package/skills/claw-compactor/references/README.md +44 -0
  121. package/skills/claw-compactor/references/architecture.md +197 -0
  122. package/skills/claw-compactor/references/benchmarks.md +94 -0
  123. package/skills/claw-compactor/references/compression-prompts.md +39 -0
  124. package/skills/claw-compactor/references/compression-techniques.md +219 -0
  125. package/skills/claw-compactor/references/testing.md +160 -0
  126. package/skills/claw-compactor/scripts/audit_memory.py +216 -0
  127. package/skills/claw-compactor/scripts/compress_memory.py +236 -0
  128. package/skills/claw-compactor/scripts/compressed_context.py +280 -0
  129. package/skills/claw-compactor/scripts/dedup_memory.py +147 -0
  130. package/skills/claw-compactor/scripts/dictionary_compress.py +170 -0
  131. package/skills/claw-compactor/scripts/engram-auto.sh +152 -0
  132. package/skills/claw-compactor/scripts/engram_auto.py +695 -0
  133. package/skills/claw-compactor/scripts/engram_cli.py +474 -0
  134. package/skills/claw-compactor/scripts/estimate_tokens.py +131 -0
  135. package/skills/claw-compactor/scripts/generate_summary_tiers.py +292 -0
  136. package/skills/claw-compactor/scripts/lib/__init__.py +34 -0
  137. package/skills/claw-compactor/scripts/lib/config.py +289 -0
  138. package/skills/claw-compactor/scripts/lib/dedup.py +119 -0
  139. package/skills/claw-compactor/scripts/lib/dictionary.py +281 -0
  140. package/skills/claw-compactor/scripts/lib/engram.py +793 -0
  141. package/skills/claw-compactor/scripts/lib/engram_prompts.py +175 -0
  142. package/skills/claw-compactor/scripts/lib/engram_storage.py +254 -0
  143. package/skills/claw-compactor/scripts/lib/exceptions.py +24 -0
  144. package/skills/claw-compactor/scripts/lib/markdown.py +312 -0
  145. package/skills/claw-compactor/scripts/lib/rle.py +165 -0
  146. package/skills/claw-compactor/scripts/lib/tokenizer_optimizer.py +188 -0
  147. package/skills/claw-compactor/scripts/lib/tokens.py +68 -0
  148. package/skills/claw-compactor/scripts/mem_compress.py +788 -0
  149. package/skills/claw-compactor/scripts/observation_compressor.py +346 -0
  150. package/skills/claw-compactor/tests/__init__.py +0 -0
  151. package/skills/claw-compactor/tests/conftest.py +94 -0
  152. package/skills/claw-compactor/tests/test_audit_comprehensive.py +123 -0
  153. package/skills/claw-compactor/tests/test_audit_memory.py +67 -0
  154. package/skills/claw-compactor/tests/test_benchmark.py +122 -0
  155. package/skills/claw-compactor/tests/test_cli_commands.py +228 -0
  156. package/skills/claw-compactor/tests/test_compress_memory.py +109 -0
  157. package/skills/claw-compactor/tests/test_compress_memory_comprehensive.py +191 -0
  158. package/skills/claw-compactor/tests/test_compressed_context.py +145 -0
  159. package/skills/claw-compactor/tests/test_config.py +54 -0
  160. package/skills/claw-compactor/tests/test_dedup_memory.py +124 -0
  161. package/skills/claw-compactor/tests/test_dictionary.py +327 -0
  162. package/skills/claw-compactor/tests/test_dictionary_comprehensive.py +241 -0
  163. package/skills/claw-compactor/tests/test_engram.py +1091 -0
  164. package/skills/claw-compactor/tests/test_engram_auto.py +529 -0
  165. package/skills/claw-compactor/tests/test_error_handling.py +194 -0
  166. package/skills/claw-compactor/tests/test_estimate_tokens.py +99 -0
  167. package/skills/claw-compactor/tests/test_generate_summary_tiers.py +105 -0
  168. package/skills/claw-compactor/tests/test_integration.py +249 -0
  169. package/skills/claw-compactor/tests/test_lib_dedup.py +135 -0
  170. package/skills/claw-compactor/tests/test_lib_markdown.py +388 -0
  171. package/skills/claw-compactor/tests/test_lib_tokens.py +82 -0
  172. package/skills/claw-compactor/tests/test_main_entry.py +176 -0
  173. package/skills/claw-compactor/tests/test_markdown_advanced.py +284 -0
  174. package/skills/claw-compactor/tests/test_new_features.py +77 -0
  175. package/skills/claw-compactor/tests/test_observation_comprehensive.py +261 -0
  176. package/skills/claw-compactor/tests/test_observation_compressor.py +128 -0
  177. package/skills/claw-compactor/tests/test_performance.py +172 -0
  178. package/skills/claw-compactor/tests/test_pipeline.py +109 -0
  179. package/skills/claw-compactor/tests/test_real_workspace.py +161 -0
  180. package/skills/claw-compactor/tests/test_rle.py +114 -0
  181. package/skills/claw-compactor/tests/test_rle_comprehensive.py +151 -0
  182. package/skills/claw-compactor/tests/test_roundtrip.py +253 -0
  183. package/skills/claw-compactor/tests/test_roundtrip_comprehensive.py +192 -0
  184. package/skills/claw-compactor/tests/test_tiers_comprehensive.py +171 -0
  185. package/skills/claw-compactor/tests/test_token_economics.py +237 -0
  186. package/skills/claw-compactor/tests/test_tokenizer_optimizer.py +175 -0
  187. package/skills/claw-compactor/tests/test_tokenizer_optimizer_comprehensive.py +241 -0
  188. package/skills/claw-compactor/tests/test_tokens.py +27 -0
  189. package/skills/cmo/CHANGELOG.md +61 -0
  190. package/skills/cmo/SKILL.md +500 -0
  191. package/skills/cmo/references/ai-slop-patterns.md +56 -0
  192. package/skills/cmo/references/analytics-guide.md +152 -0
  193. package/skills/cmo/references/ideas-library.md +197 -0
  194. package/skills/cmo/rules/brand-file-map.md +198 -0
  195. package/skills/cmo/rules/brand-memory.md +158 -0
  196. package/skills/cmo/rules/cli-runtime-index.md +95 -0
  197. package/skills/cmo/rules/command-reference.md +167 -0
  198. package/skills/cmo/rules/communication.md +15 -0
  199. package/skills/cmo/rules/context-switch.md +101 -0
  200. package/skills/cmo/rules/ecosystem.md +125 -0
  201. package/skills/cmo/rules/error-recovery.md +98 -0
  202. package/skills/cmo/rules/learning-loop.md +170 -0
  203. package/skills/cmo/rules/monorepo.md +78 -0
  204. package/skills/cmo/rules/output-format.md +124 -0
  205. package/skills/cmo/rules/persona.md +15 -0
  206. package/skills/cmo/rules/playbooks.md +327 -0
  207. package/skills/cmo/rules/progressive-enhancement.md +231 -0
  208. package/skills/cmo/rules/publish-index.md +106 -0
  209. package/skills/cmo/rules/quality-gate.md +90 -0
  210. package/skills/cmo/rules/recency-grounding.md +124 -0
  211. package/skills/cmo/rules/safety.md +80 -0
  212. package/skills/cmo/rules/studio-api-index.md +138 -0
  213. package/skills/cmo/rules/studio-integration.md +147 -0
  214. package/skills/cmo/rules/sub-agents.md +167 -0
  215. package/skills/cold-email/SKILL.md +240 -0
  216. package/skills/cold-email/evals/evals.json +94 -0
  217. package/skills/cold-email/references/benchmarks.md +83 -0
  218. package/skills/cold-email/references/follow-up-sequences.md +81 -0
  219. package/skills/cold-email/references/frameworks.md +90 -0
  220. package/skills/cold-email/references/personalization.md +79 -0
  221. package/skills/cold-email/references/subject-lines.md +53 -0
  222. package/skills/competitive-intel/SKILL.md +433 -0
  223. package/skills/competitive-intel/references/competitive-frameworks.md +145 -0
  224. package/skills/competitor-alternatives/SKILL.md +362 -0
  225. package/skills/competitor-alternatives/evals/evals.json +93 -0
  226. package/skills/competitor-alternatives/references/content-architecture.md +271 -0
  227. package/skills/competitor-alternatives/references/templates.md +223 -0
  228. package/skills/concreteness-fixer/SKILL.md +483 -0
  229. package/skills/concreteness-fixer/scripts/validation/concreteness-validator.js +221 -0
  230. package/skills/concreteness-fixer/utils/execFileNoThrow.js +16 -0
  231. package/skills/content-atomizer/SKILL.md +424 -0
  232. package/skills/content-atomizer/references/hook-strategies.md +56 -0
  233. package/skills/content-atomizer/references/platform-specs.md +118 -0
  234. package/skills/content-atomizer/references/platforms/bluesky.md +64 -0
  235. package/skills/content-atomizer/references/platforms/instagram.md +77 -0
  236. package/skills/content-atomizer/references/platforms/linkedin.md +120 -0
  237. package/skills/content-atomizer/references/platforms/reddit.md +73 -0
  238. package/skills/content-atomizer/references/platforms/threads.md +64 -0
  239. package/skills/content-atomizer/references/platforms/tiktok.md +55 -0
  240. package/skills/content-atomizer/references/platforms/twitter.md +123 -0
  241. package/skills/content-atomizer/references/platforms/youtube.md +56 -0
  242. package/skills/content-atomizer/references/tweet-patterns.md +40 -0
  243. package/skills/content-repost-manager/SKILL.md +245 -0
  244. package/skills/content-repost-manager/scripts/content-repost-scan.py +133 -0
  245. package/skills/context-recovery/.clawdhub/origin.json +7 -0
  246. package/skills/context-recovery/SKILL.md +198 -0
  247. package/skills/context-recovery/_meta.json +6 -0
  248. package/skills/conversion-flow-cro/SKILL.md +248 -0
  249. package/skills/conversion-flow-cro/references/flow-benchmarks.md +158 -0
  250. package/skills/copy-editing/SKILL.md +474 -0
  251. package/skills/copy-editing/evals/evals.json +89 -0
  252. package/skills/copy-editing/references/plain-english-alternatives.md +394 -0
  253. package/skills/copywriting/SKILL.md +349 -0
  254. package/skills/copywriting/evals/evals.json +111 -0
  255. package/skills/copywriting/references/awareness-level-guide.md +227 -0
  256. package/skills/copywriting/references/copy-frameworks.md +389 -0
  257. package/skills/copywriting/references/natural-transitions.md +272 -0
  258. package/skills/creative/SKILL.md +365 -0
  259. package/skills/creative/modes/ad-creative.md +1748 -0
  260. package/skills/creative/modes/product-photo.md +1520 -0
  261. package/skills/creative/modes/product-video.md +1657 -0
  262. package/skills/creative/modes/social-graphics.md +1511 -0
  263. package/skills/creative/modes/talking-head.md +2208 -0
  264. package/skills/creative/references/VISUAL_INTELLIGENCE.md +1233 -0
  265. package/skills/deep-serp-article/SKILL.md +677 -0
  266. package/skills/deep-serp-article/SKILL.md.bak +530 -0
  267. package/skills/earned-media/SKILL.md +260 -0
  268. package/skills/email-sequences/SKILL.md +446 -0
  269. package/skills/email-sequences/references/sequence-templates.md +1217 -0
  270. package/skills/firecrawl/.skill-meta.json +13 -0
  271. package/skills/firecrawl/SKILL.md +154 -0
  272. package/skills/firecrawl/rules/install.md +63 -0
  273. package/skills/firecrawl/rules/security.md +26 -0
  274. package/skills/form-cro/SKILL.md +429 -0
  275. package/skills/form-cro/evals/evals.json +90 -0
  276. package/skills/free-tool-strategy/SKILL.md +325 -0
  277. package/skills/free-tool-strategy/evals/evals.json +90 -0
  278. package/skills/free-tool-strategy/references/tool-types.md +253 -0
  279. package/skills/frontend-slides/SKILL.md +248 -0
  280. package/skills/frontend-slides/STYLE_PRESETS.md +347 -0
  281. package/skills/frontend-slides/animation-patterns.md +110 -0
  282. package/skills/frontend-slides/html-template.md +347 -0
  283. package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
  284. package/skills/frontend-slides/viewport-base.css +153 -0
  285. package/skills/guardrail-framework/SKILL.md +319 -0
  286. package/skills/hook-generator/SKILL.md +438 -0
  287. package/skills/hook-generator/database/2026-PLATFORM-RESEARCH.md +211 -0
  288. package/skills/hook-generator/database/instagram-hooks.json +591 -0
  289. package/skills/hook-generator/database/linkedin-hooks.json +502 -0
  290. package/skills/hook-generator/database/medium-hooks.json +181 -0
  291. package/skills/hook-generator/database/tiktok-hooks.json +337 -0
  292. package/skills/hook-generator/database/twitter-hooks.json +567 -0
  293. package/skills/hook-generator/database/youtube-hooks.json +275 -0
  294. package/skills/hook-generator/package-lock.json +24 -0
  295. package/skills/hook-generator/package.json +5 -0
  296. package/skills/hook-generator/references/hook-generation-system.md +257 -0
  297. package/skills/hook-generator/references/hook-performance-analysis.json +153 -0
  298. package/skills/hook-generator/references/hooks-library.md +128 -0
  299. package/skills/hook-generator/references/platform-hook-frameworks.md +275 -0
  300. package/skills/hook-generator/scripts/generate-hooks-unified.js +722 -0
  301. package/skills/hook-generator/scripts/generate-hooks.js +225 -0
  302. package/skills/hook-generator/scripts/generate.sh +36 -0
  303. package/skills/hook-generator/scripts/ralph-hook-enhancer.js +864 -0
  304. package/skills/hook-generator/scripts/test-gemini-output.js +51 -0
  305. package/skills/humanizer/README.md +120 -0
  306. package/skills/humanizer/SKILL.md +699 -0
  307. package/skills/image-gen/SKILL.md +277 -0
  308. package/skills/image-gen/references/prompt-patterns.md +114 -0
  309. package/skills/image-gen/references/visual-metaphors.md +51 -0
  310. package/skills/impeccable/SKILL.md +86 -0
  311. package/skills/impeccable/reference/adapt.md +312 -0
  312. package/skills/impeccable/reference/adapt.native.md +58 -0
  313. package/skills/impeccable/reference/android.md +40 -0
  314. package/skills/impeccable/reference/animate.md +86 -0
  315. package/skills/impeccable/reference/audit.md +136 -0
  316. package/skills/impeccable/reference/audit.native.md +139 -0
  317. package/skills/impeccable/reference/bolder.md +31 -0
  318. package/skills/impeccable/reference/clarify.md +94 -0
  319. package/skills/impeccable/reference/colorize.md +86 -0
  320. package/skills/impeccable/reference/craft-floor.md +42 -0
  321. package/skills/impeccable/reference/craft.md +5 -0
  322. package/skills/impeccable/reference/critique.md +788 -0
  323. package/skills/impeccable/reference/degraded/asset-producer.md +90 -0
  324. package/skills/impeccable/reference/degraded/documenter.md +24 -0
  325. package/skills/impeccable/reference/degraded/finish-reviewer.md +37 -0
  326. package/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  327. package/skills/impeccable/reference/delight.md +70 -0
  328. package/skills/impeccable/reference/distill.md +111 -0
  329. package/skills/impeccable/reference/doctor.md +53 -0
  330. package/skills/impeccable/reference/document.md +416 -0
  331. package/skills/impeccable/reference/extract.md +69 -0
  332. package/skills/impeccable/reference/harden.md +336 -0
  333. package/skills/impeccable/reference/hooks.md +105 -0
  334. package/skills/impeccable/reference/init.md +125 -0
  335. package/skills/impeccable/reference/ios.md +45 -0
  336. package/skills/impeccable/reference/layout.md +84 -0
  337. package/skills/impeccable/reference/live-setup.md +102 -0
  338. package/skills/impeccable/reference/live.md +323 -0
  339. package/skills/impeccable/reference/new-work.md +110 -0
  340. package/skills/impeccable/reference/onboard.md +234 -0
  341. package/skills/impeccable/reference/operate.md +61 -0
  342. package/skills/impeccable/reference/optimize.md +258 -0
  343. package/skills/impeccable/reference/overdrive.md +127 -0
  344. package/skills/impeccable/reference/polish.md +97 -0
  345. package/skills/impeccable/reference/quieter.md +99 -0
  346. package/skills/impeccable/reference/routing.md +18 -0
  347. package/skills/impeccable/reference/shape.md +59 -0
  348. package/skills/impeccable/reference/typeset.md +80 -0
  349. package/skills/impeccable/reference/visualize.md +49 -0
  350. package/skills/impeccable/scripts/command-metadata.json +94 -0
  351. package/skills/impeccable/scripts/concept-seed.mjs +558 -0
  352. package/skills/impeccable/scripts/context-signals.mjs +334 -0
  353. package/skills/impeccable/scripts/context.mjs +1467 -0
  354. package/skills/impeccable/scripts/critique-storage.mjs +213 -0
  355. package/skills/impeccable/scripts/detect-csp.mjs +198 -0
  356. package/skills/impeccable/scripts/detect.mjs +21 -0
  357. package/skills/impeccable/scripts/detector/browser/injected/index.mjs +2023 -0
  358. package/skills/impeccable/scripts/detector/cli/main.mjs +438 -0
  359. package/skills/impeccable/scripts/detector/design-system.mjs +1046 -0
  360. package/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +8283 -0
  361. package/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
  362. package/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +372 -0
  363. package/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +1168 -0
  364. package/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1186 -0
  365. package/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +264 -0
  366. package/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
  367. package/skills/impeccable/scripts/detector/findings.mjs +18 -0
  368. package/skills/impeccable/scripts/detector/node/file-system.mjs +203 -0
  369. package/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
  370. package/skills/impeccable/scripts/detector/registry/antipatterns.mjs +617 -0
  371. package/skills/impeccable/scripts/detector/rules/checks.mjs +5580 -0
  372. package/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
  373. package/skills/impeccable/scripts/detector/shared/constants.mjs +112 -0
  374. package/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  375. package/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
  376. package/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
  377. package/skills/impeccable/scripts/doctor.mjs +336 -0
  378. package/skills/impeccable/scripts/embed-prompt.mjs +133 -0
  379. package/skills/impeccable/scripts/generate-image.mjs +240 -0
  380. package/skills/impeccable/scripts/hook-admin.mjs +801 -0
  381. package/skills/impeccable/scripts/hook-before-edit.mjs +508 -0
  382. package/skills/impeccable/scripts/hook-lib.mjs +2153 -0
  383. package/skills/impeccable/scripts/hook.mjs +78 -0
  384. package/skills/impeccable/scripts/lib/artifact-schema.mjs +93 -0
  385. package/skills/impeccable/scripts/lib/composition-catalog.mjs +200 -0
  386. package/skills/impeccable/scripts/lib/concept-catalog.mjs +384 -0
  387. package/skills/impeccable/scripts/lib/design-parser.mjs +925 -0
  388. package/skills/impeccable/scripts/lib/impeccable-config.mjs +658 -0
  389. package/skills/impeccable/scripts/lib/impeccable-paths.mjs +137 -0
  390. package/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
  391. package/skills/impeccable/scripts/lib/provider.mjs +5 -0
  392. package/skills/impeccable/scripts/lib/roll-selection.mjs +362 -0
  393. package/skills/impeccable/scripts/lib/staleness-deep.mjs +478 -0
  394. package/skills/impeccable/scripts/lib/staleness-notice.mjs +169 -0
  395. package/skills/impeccable/scripts/lib/staleness.mjs +457 -0
  396. package/skills/impeccable/scripts/lib/surface-briefs.mjs +151 -0
  397. package/skills/impeccable/scripts/lib/target-args.mjs +42 -0
  398. package/skills/impeccable/scripts/lib/target-slug.mjs +33 -0
  399. package/skills/impeccable/scripts/lib/template-extensions.mjs +146 -0
  400. package/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  401. package/skills/impeccable/scripts/live/accept-verify.mjs +60 -0
  402. package/skills/impeccable/scripts/live/browser-script-parts.mjs +55 -0
  403. package/skills/impeccable/scripts/live/completion.mjs +28 -0
  404. package/skills/impeccable/scripts/live/event-validation.mjs +199 -0
  405. package/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  406. package/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +73 -0
  407. package/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  408. package/skills/impeccable/scripts/live/frameworks/journal.mjs +197 -0
  409. package/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  410. package/skills/impeccable/scripts/live/frameworks/nuxt.mjs +161 -0
  411. package/skills/impeccable/scripts/live/frameworks/script-src.mjs +17 -0
  412. package/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  413. package/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  414. package/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  415. package/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  416. package/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  417. package/skills/impeccable/scripts/live/generation-preflight.mjs +149 -0
  418. package/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
  419. package/skills/impeccable/scripts/live/instructions.mjs +142 -0
  420. package/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
  421. package/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
  422. package/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
  423. package/skills/impeccable/scripts/live/poll-lanes.mjs +14 -0
  424. package/skills/impeccable/scripts/live/roots.mjs +508 -0
  425. package/skills/impeccable/scripts/live/session-store.mjs +563 -0
  426. package/skills/impeccable/scripts/live/source-lock.mjs +105 -0
  427. package/skills/impeccable/scripts/live/source-search.mjs +105 -0
  428. package/skills/impeccable/scripts/live/svelte-ast.mjs +961 -0
  429. package/skills/impeccable/scripts/live/svelte-component.mjs +1342 -0
  430. package/skills/impeccable/scripts/live/sveltekit-adapter.mjs +316 -0
  431. package/skills/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
  432. package/skills/impeccable/scripts/live/ui-core.mjs +180 -0
  433. package/skills/impeccable/scripts/live/vocabulary.mjs +171 -0
  434. package/skills/impeccable/scripts/live-accept.mjs +954 -0
  435. package/skills/impeccable/scripts/live-browser-dom.js +146 -0
  436. package/skills/impeccable/scripts/live-browser-session.js +123 -0
  437. package/skills/impeccable/scripts/live-browser.js +12520 -0
  438. package/skills/impeccable/scripts/live-commit-manual-edits.mjs +1244 -0
  439. package/skills/impeccable/scripts/live-complete.mjs +107 -0
  440. package/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
  441. package/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
  442. package/skills/impeccable/scripts/live-inject.mjs +503 -0
  443. package/skills/impeccable/scripts/live-insert.mjs +292 -0
  444. package/skills/impeccable/scripts/live-manual-edit-evidence.mjs +368 -0
  445. package/skills/impeccable/scripts/live-poll.mjs +429 -0
  446. package/skills/impeccable/scripts/live-resume.mjs +123 -0
  447. package/skills/impeccable/scripts/live-server.mjs +1669 -0
  448. package/skills/impeccable/scripts/live-status.mjs +71 -0
  449. package/skills/impeccable/scripts/live-target.mjs +30 -0
  450. package/skills/impeccable/scripts/live-wrap.mjs +927 -0
  451. package/skills/impeccable/scripts/live.mjs +359 -0
  452. package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  453. package/skills/impeccable/scripts/palette.mjs +628 -0
  454. package/skills/impeccable/scripts/pin.mjs +221 -0
  455. package/skills/impeccable/scripts/serve-question.mjs +932 -0
  456. package/skills/impeccable/scripts/surface-brief.mjs +74 -0
  457. package/skills/inkstone-admin/SKILL.md +66 -0
  458. package/skills/jev-hook-gate/SKILL.md +111 -0
  459. package/skills/keyword-research/SKILL.md +503 -0
  460. package/skills/keyword-research/references/dr-cap-and-confidence.md +62 -0
  461. package/skills/keyword-research/references/keyword-examples.md +769 -0
  462. package/skills/landing-page-architect/SKILL.md +585 -0
  463. package/skills/landing-page-architect/references/architecture-reference.md +32 -0
  464. package/skills/launch-strategy/SKILL.md +384 -0
  465. package/skills/launch-strategy/evals/evals.json +91 -0
  466. package/skills/launch-strategy/references/launch-checklist.md +209 -0
  467. package/skills/launch-strategy/references/launch-timeline.md +159 -0
  468. package/skills/lead-email-craft/SKILL.md +522 -0
  469. package/skills/lead-magnets/SKILL.md +310 -0
  470. package/skills/lead-magnets/references/benchmarks.md +129 -0
  471. package/skills/lead-magnets/references/format-guide.md +196 -0
  472. package/skills/link-building-seo/SKILL.md +210 -0
  473. package/skills/lint-report.txt +1 -0
  474. package/skills/manifest.json +129 -0
  475. package/skills/marketing-demo/SKILL.md +249 -0
  476. package/skills/marketing-demo/references/remotion-examples.md +281 -0
  477. package/skills/marketing-ideas/SKILL.md +167 -0
  478. package/skills/marketing-ideas/evals/evals.json +90 -0
  479. package/skills/marketing-ideas/references/ideas-by-category.md +366 -0
  480. package/skills/marketing-psychology/SKILL.md +374 -0
  481. package/skills/marketing-psychology/evals/evals.json +88 -0
  482. package/skills/marketing-psychology/references/case-studies.md +148 -0
  483. package/skills/narrative-research-article/SKILL.md +469 -0
  484. package/skills/narrative-research-article/references/lanusse-patterns.md +166 -0
  485. package/skills/notebooklm/SKILL.md +674 -0
  486. package/skills/off-page-seo/SKILL.md +219 -0
  487. package/skills/onboarding-cro/SKILL.md +220 -0
  488. package/skills/onboarding-cro/evals/evals.json +92 -0
  489. package/skills/onboarding-cro/references/experiments.md +258 -0
  490. package/skills/original-research/SKILL.md +388 -0
  491. package/skills/page-cro/SKILL.md +269 -0
  492. package/skills/page-cro/references/cro-benchmarks.md +140 -0
  493. package/skills/paper-marketing/SKILL.md +448 -0
  494. package/skills/paper-marketing/references/agent-quality-rubric.md +68 -0
  495. package/skills/paper-marketing/references/brand-system-template.md +120 -0
  496. package/skills/paper-marketing/references/paper-mcp-rules.md +71 -0
  497. package/skills/paper-marketing/references/platform-conventions.md +43 -0
  498. package/skills/paywall-upgrade-cro/SKILL.md +227 -0
  499. package/skills/paywall-upgrade-cro/evals/evals.json +93 -0
  500. package/skills/paywall-upgrade-cro/references/experiments.md +164 -0
  501. package/skills/platform-formatting/SKILL.md +51 -0
  502. package/skills/popup-cro/SKILL.md +454 -0
  503. package/skills/popup-cro/evals/evals.json +94 -0
  504. package/skills/positioning-angles/SKILL.md +524 -0
  505. package/skills/positioning-angles/references/ad-matrix-and-examples.md +176 -0
  506. package/skills/positioning-angles/references/angle-frameworks.md +187 -0
  507. package/skills/positioning-angles/references/dunford-positioning.md +135 -0
  508. package/skills/positioning-angles/references/hormozi-offer.md +247 -0
  509. package/skills/positioning-angles/references/schwartz-sophistication.md +166 -0
  510. package/skills/positioning-angles/references/unique-mechanism.md +162 -0
  511. package/skills/pricing-strategy/SKILL.md +346 -0
  512. package/skills/pricing-strategy/evals/evals.json +90 -0
  513. package/skills/pricing-strategy/references/research-methods.md +152 -0
  514. package/skills/pricing-strategy/references/tier-structure.md +307 -0
  515. package/skills/programmatic-seo/SKILL.md +238 -0
  516. package/skills/programmatic-seo/evals/evals.json +94 -0
  517. package/skills/programmatic-seo/references/playbooks.md +308 -0
  518. package/skills/project-rag/SKILL.md +127 -0
  519. package/skills/quality-gate/SKILL.md +519 -0
  520. package/skills/quality-gate/judge-personas/buyer.md +47 -0
  521. package/skills/quality-gate/judge-personas/expert.md +47 -0
  522. package/skills/quality-gate/judge-personas/outsider.md +47 -0
  523. package/skills/quality-gate/judge-personas/scanner.md +41 -0
  524. package/skills/quality-gate/judge-personas/skeptic.md +40 -0
  525. package/skills/referral-program/SKILL.md +290 -0
  526. package/skills/referral-program/evals/evals.json +89 -0
  527. package/skills/referral-program/references/affiliate-programs.md +163 -0
  528. package/skills/referral-program/references/program-examples.md +143 -0
  529. package/skills/review-sites/SKILL.md +279 -0
  530. package/skills/revops/SKILL.md +343 -0
  531. package/skills/revops/evals/evals.json +91 -0
  532. package/skills/revops/references/automation-playbooks.md +290 -0
  533. package/skills/revops/references/lifecycle-definitions.md +278 -0
  534. package/skills/revops/references/routing-rules.md +203 -0
  535. package/skills/revops/references/scoring-models.md +247 -0
  536. package/skills/saas-product-seo/SKILL.md +324 -0
  537. package/skills/sales-enablement/SKILL.md +349 -0
  538. package/skills/sales-enablement/evals/evals.json +91 -0
  539. package/skills/sales-enablement/references/deck-frameworks.md +263 -0
  540. package/skills/sales-enablement/references/demo-scripts.md +355 -0
  541. package/skills/sales-enablement/references/objection-library.md +270 -0
  542. package/skills/sales-enablement/references/one-pager-templates.md +208 -0
  543. package/skills/schema-markup/SKILL.md +179 -0
  544. package/skills/schema-markup/evals/evals.json +87 -0
  545. package/skills/schema-markup/references/schema-examples.md +398 -0
  546. package/skills/self-improve/SKILL.md +166 -0
  547. package/skills/self-improving-agent/README.md +243 -0
  548. package/skills/self-improving-agent/SKILL.md +437 -0
  549. package/skills/self-improving-agent/scripts/__init__.py +16 -0
  550. package/skills/self-improving-agent/scripts/__pycache__/auto_detect.cpython-314.pyc +0 -0
  551. package/skills/self-improving-agent/scripts/__pycache__/nlm_curation.cpython-314.pyc +0 -0
  552. package/skills/self-improving-agent/scripts/__pycache__/self_improving_agent.cpython-314.pyc +0 -0
  553. package/skills/self-improving-agent/scripts/auto_detect.py +270 -0
  554. package/skills/self-improving-agent/scripts/init_expertise_registry.py +89 -0
  555. package/skills/self-improving-agent/scripts/nlm_curation.py +259 -0
  556. package/skills/self-improving-agent/scripts/self-improving-agent +113 -0
  557. package/skills/self-improving-agent/scripts/self_improving_agent.py +603 -0
  558. package/skills/self-improving-agent/scripts/test_curation_scorer.py +20 -0
  559. package/skills/self-improving-agent/scripts/test_self_improving.py +184 -0
  560. package/skills/send-email/SKILL.md +426 -0
  561. package/skills/send-email/references/batch-email-examples.md +807 -0
  562. package/skills/send-email/references/best-practices.md +453 -0
  563. package/skills/send-email/references/installation.md +123 -0
  564. package/skills/send-email/references/single-email-examples.md +470 -0
  565. package/skills/send-email/references/webhooks.md +221 -0
  566. package/skills/seo-audit/SKILL.md +362 -0
  567. package/skills/seo-audit/references/ai-writing-detection.md +200 -0
  568. package/skills/seo-audit/references/architecture-patterns.md +271 -0
  569. package/skills/seo-audit/references/schema-templates.md +427 -0
  570. package/skills/seo-content/SKILL.md +510 -0
  571. package/skills/seo-content/references/anti-ai-detection.md +184 -0
  572. package/skills/seo-content/references/content-structures.md +148 -0
  573. package/skills/seo-content/references/eeat-examples.md +235 -0
  574. package/skills/seo-content/references/on-page-seo.md +261 -0
  575. package/skills/seo-content/references/pseo-playbooks.md +226 -0
  576. package/skills/seo-content/references/schema-templates.md +104 -0
  577. package/skills/seo-content/references/serp-analysis-format.md +151 -0
  578. package/skills/seo-machine/SKILL.md +331 -0
  579. package/skills/seo-machine/assets/brand-template.md +73 -0
  580. package/skills/seo-machine/assets/link-inventory-template.md +74 -0
  581. package/skills/seo-machine/assets/roadmap-template.md +184 -0
  582. package/skills/seo-machine/references/api-stack-recipes.md +230 -0
  583. package/skills/seo-machine/references/exa-recipes.md +260 -0
  584. package/skills/seo-machine/references/manual-research.md +73 -0
  585. package/skills/seo-machine/references/methodology.md +87 -0
  586. package/skills/seo-machine/references/off-page.md +123 -0
  587. package/skills/seo-machine/references/patterns/alternatives.md +176 -0
  588. package/skills/seo-machine/references/patterns/compare.md +105 -0
  589. package/skills/seo-machine/references/patterns/playbooks.md +106 -0
  590. package/skills/seo-machine/references/patterns/use-case.md +109 -0
  591. package/skills/seo-machine/references/quality-bars.md +99 -0
  592. package/skills/seo-machine/references/stacks/astro.md +156 -0
  593. package/skills/seo-machine/references/stacks/detection.md +61 -0
  594. package/skills/seo-machine/references/stacks/markdown-fallback.md +181 -0
  595. package/skills/seo-machine/references/stacks/nextjs.md +108 -0
  596. package/skills/seo-machine/references/stacks/rails-inertia.md +99 -0
  597. package/skills/seo-machine/references/striking-distance.md +116 -0
  598. package/skills/seo-machine/references/technical-audit.md +153 -0
  599. package/skills/seo-machine/scripts/link_audit.py +265 -0
  600. package/skills/seo-machine/scripts/tech_audit.py +221 -0
  601. package/skills/seo-machine/scripts/word_count.py +154 -0
  602. package/skills/sharp-thesis-validator/SKILL.md +393 -0
  603. package/skills/sharp-thesis-validator/examples.md +186 -0
  604. package/skills/signup-flow-cro/SKILL.md +359 -0
  605. package/skills/signup-flow-cro/evals/evals.json +88 -0
  606. package/skills/site-architecture/SKILL.md +357 -0
  607. package/skills/site-architecture/evals/evals.json +88 -0
  608. package/skills/site-architecture/references/mermaid-templates.md +216 -0
  609. package/skills/site-architecture/references/navigation-patterns.md +305 -0
  610. package/skills/site-architecture/references/site-type-templates.md +293 -0
  611. package/skills/skill-self-improvement/SKILL.md +151 -0
  612. package/skills/slideshow-script/SKILL.md +274 -0
  613. package/skills/slideshow-script/references/content-spec-schema.md +77 -0
  614. package/skills/slideshow-script/references/frameworks.md +84 -0
  615. package/skills/slideshow-script/references/paips-framework.md +37 -0
  616. package/skills/social-campaign/SKILL.md +419 -0
  617. package/skills/social-campaign/references/paper-mcp-workflow.md +48 -0
  618. package/skills/social-content/SKILL.md +359 -0
  619. package/skills/social-content/evals/evals.json +92 -0
  620. package/skills/social-content/references/platforms.md +170 -0
  621. package/skills/social-content/references/post-templates.md +177 -0
  622. package/skills/social-content/references/reverse-engineering.md +195 -0
  623. package/skills/social-worker/SKILL.md +204 -0
  624. package/skills/startup-launcher/SKILL.md +252 -0
  625. package/skills/startup-launcher/references/file-router.md +64 -0
  626. package/skills/startup-launcher/references/platform-matrix.md +65 -0
  627. package/skills/startup-launcher/references/platforms/alternativeto.md +283 -0
  628. package/skills/startup-launcher/references/platforms/appsumo.md +495 -0
  629. package/skills/startup-launcher/references/platforms/auraplusplus.md +736 -0
  630. package/skills/startup-launcher/references/platforms/betalist.md +98 -0
  631. package/skills/startup-launcher/references/platforms/capterra.md +276 -0
  632. package/skills/startup-launcher/references/platforms/crunchbase.md +514 -0
  633. package/skills/startup-launcher/references/platforms/dealify.md +291 -0
  634. package/skills/startup-launcher/references/platforms/dealmirror.md +313 -0
  635. package/skills/startup-launcher/references/platforms/desifounder.md +490 -0
  636. package/skills/startup-launcher/references/platforms/devhunt.md +210 -0
  637. package/skills/startup-launcher/references/platforms/devpost.md +448 -0
  638. package/skills/startup-launcher/references/platforms/fazier.md +56 -0
  639. package/skills/startup-launcher/references/platforms/firsto.md +489 -0
  640. package/skills/startup-launcher/references/platforms/g2.md +226 -0
  641. package/skills/startup-launcher/references/platforms/hackernews.md +99 -0
  642. package/skills/startup-launcher/references/platforms/hackernoon.md +385 -0
  643. package/skills/startup-launcher/references/platforms/indiedeals.md +367 -0
  644. package/skills/startup-launcher/references/platforms/indiehackers.md +80 -0
  645. package/skills/startup-launcher/references/platforms/kenmoo.md +231 -0
  646. package/skills/startup-launcher/references/platforms/labstartups.md +618 -0
  647. package/skills/startup-launcher/references/platforms/launchboard.md +307 -0
  648. package/skills/startup-launcher/references/platforms/launchfast.md +560 -0
  649. package/skills/startup-launcher/references/platforms/launchigniter.md +56 -0
  650. package/skills/startup-launcher/references/platforms/launchingnext.md +674 -0
  651. package/skills/startup-launcher/references/platforms/launchit.md +574 -0
  652. package/skills/startup-launcher/references/platforms/launchyourapp.md +677 -0
  653. package/skills/startup-launcher/references/platforms/libhunt.md +220 -0
  654. package/skills/startup-launcher/references/platforms/ltdhunt.md +221 -0
  655. package/skills/startup-launcher/references/platforms/microlaunch.md +45 -0
  656. package/skills/startup-launcher/references/platforms/openalternative.md +195 -0
  657. package/skills/startup-launcher/references/platforms/peerlist.md +56 -0
  658. package/skills/startup-launcher/references/platforms/peerpush.md +64 -0
  659. package/skills/startup-launcher/references/platforms/primeclub.md +282 -0
  660. package/skills/startup-launcher/references/platforms/productcanyon.md +190 -0
  661. package/skills/startup-launcher/references/platforms/producthunt.md +98 -0
  662. package/skills/startup-launcher/references/platforms/rankinpublic.md +315 -0
  663. package/skills/startup-launcher/references/platforms/rockethub.md +374 -0
  664. package/skills/startup-launcher/references/platforms/saasgenius.md +175 -0
  665. package/skills/startup-launcher/references/platforms/saashub.md +205 -0
  666. package/skills/startup-launcher/references/platforms/saasmantra.md +221 -0
  667. package/skills/startup-launcher/references/platforms/saaspirate.md +287 -0
  668. package/skills/startup-launcher/references/platforms/saaswarrior.md +190 -0
  669. package/skills/startup-launcher/references/platforms/saaszilla.md +194 -0
  670. package/skills/startup-launcher/references/platforms/selected.md +925 -0
  671. package/skills/startup-launcher/references/platforms/sideprojectors.md +86 -0
  672. package/skills/startup-launcher/references/platforms/softonic.md +240 -0
  673. package/skills/startup-launcher/references/platforms/sourceforge.md +251 -0
  674. package/skills/startup-launcher/references/platforms/stacksocial.md +244 -0
  675. package/skills/startup-launcher/references/platforms/startupstash.md +326 -0
  676. package/skills/startup-launcher/references/platforms/theresanaiforthat.md +253 -0
  677. package/skills/startup-launcher/references/platforms/tinylaunch.md +70 -0
  678. package/skills/startup-launcher/references/platforms/tinystartups.md +72 -0
  679. package/skills/startup-launcher/references/platforms/toolfolio.md +291 -0
  680. package/skills/startup-launcher/references/platforms/trustmrr.md +194 -0
  681. package/skills/startup-launcher/references/platforms/trylaunch.md +531 -0
  682. package/skills/startup-launcher/references/platforms/uneed.md +57 -0
  683. package/skills/startup-launcher/references/templates/asset-checklist.md +218 -0
  684. package/skills/startup-launcher/references/templates/launch-tracker.md +195 -0
  685. package/skills/startup-launcher/references/templates/product-brief.md +98 -0
  686. package/skills/summarize/.skill-meta.json +13 -0
  687. package/skills/summarize/SKILL.md +170 -0
  688. package/skills/summarize/rules/install.md +157 -0
  689. package/skills/summarize/rules/usage.md +207 -0
  690. package/skills/topical-authority/SKILL.md +307 -0
  691. package/skills/topical-authority/references/jake-ward-framework.md +201 -0
  692. package/skills/topical-authority/references/serp-clustering-algorithm.md +325 -0
  693. package/skills/topical-authority/scripts/orchestrator.js +367 -0
  694. package/skills/topical-authority/scripts/seo/analyze-competitor-coverage.js +3 -0
  695. package/skills/topical-authority/scripts/seo/audit-internal-links.js +3 -0
  696. package/skills/topical-authority/scripts/seo/build-clusters-from-serp.js +3 -0
  697. package/skills/topical-authority/scripts/seo/extract-keywords-from-forums.js +3 -0
  698. package/skills/topical-authority/scripts/seo/extract-paa-questions.js +3 -0
  699. package/skills/topical-authority/scripts/seo/fetch-serp-urls.js +3 -0
  700. package/skills/topical-authority/scripts/seo/gemini-serp-clustering.js +3 -0
  701. package/skills/topical-authority/scripts/seo/identify-content-gaps.js +3 -0
  702. package/skills/topical-authority/scripts/seo/identify-research-gaps.js +3 -0
  703. package/skills/topical-authority/scripts/seo/scrape-quora-questions.js +3 -0
  704. package/skills/topical-authority/scripts/seo/scrape-reddit-pain-points.js +3 -0
  705. package/skills/topical-authority/scripts/seo/weave-internal-links.js +3 -0
  706. package/skills/visual-style/SKILL.md +199 -0
  707. package/skills/voice-brand-alignment/SKILL.md +70 -0
  708. package/skills/voice-brand-alignment/references/ai-slop-patterns.md +405 -0
  709. package/skills/voice-brand-alignment/scripts/validation/gemini-voice-validator.js +96 -0
  710. package/skills/voice-extraction/SKILL.md +234 -0
  711. package/skills/voice-extraction/references/extraction-prompt.md +155 -0
  712. package/skills/voice-extraction/references/voice-dna-template.md +168 -0
  713. package/skills/voice-extraction/references/voice-elements.md +259 -0
  714. package/skills/voice-extraction/scripts/build-corpus.js +120 -0
  715. package/skills/voice-extraction/scripts/collect-sources.sh +168 -0
  716. package/skills/warm-outbound/SKILL.md +299 -0
  717. package/skills/warm-outbound/templates/warm-message.md +39 -0
  718. package/skills/weekly-newsletter-digest/SKILL.md +78 -0
  719. package/skills/x-playwriter/SKILL.md +428 -0
  720. package/skills/x-playwriter/scripts/x-browser.js +185 -0
  721. package/skills/x-post-generator-openclaw/SKILL.md +138 -0
  722. package/skills/x-post-generator-openclaw/scripts/generate-x-post.js +537 -0
  723. package/skills/x-posting-playwriter/SKILL.md +203 -0
  724. package/skills/x-research/SKILL.md +129 -0
  725. package/skills/x-research/x-research.sh +85 -0
  726. package/skills/youtube-summarize/SKILL.md +90 -0
  727. package/skills/youtube-summarize/scripts/youtube-summarize.sh +143 -0
  728. package/src/cli.js +349 -172
  729. package/src/harness/deepseek-adapter.js +102 -0
  730. package/src/harness/deepseek.js +225 -0
  731. package/src/harness/opencode-adapter.js +174 -0
  732. package/src/harness/pi-adapter.js +172 -0
  733. package/src/harness/registry.js +121 -0
  734. package/src/harness/telemetry.js +102 -0
  735. package/src/harness/types.js +165 -0
  736. package/src/interview.js +36 -4
  737. package/src/postinstall.js +10 -12
  738. package/templates/AGENTS.md +17 -17
  739. package/templates/ORG.md +1 -1
  740. package/templates/TOOLS.md +7 -2
  741. package/templates/opencode.json +26 -29
  742. package/wiki/doctor.md +54 -0
  743. package/wiki/inkstone.md +4 -4
  744. package/wiki/opencode.md +3 -3
  745. package/skills/curated.txt +0 -68
@@ -0,0 +1,470 @@
1
+ # Resend Examples
2
+
3
+ ## Table of Contents
4
+
5
+ - [Idempotency Keys](#idempotency-keys)
6
+ - [Error Handling](#error-handling)
7
+ - [Retry Logic](#retry-logic)
8
+ - [Complete Examples](#complete-examples)
9
+
10
+ ## Idempotency Keys
11
+
12
+ Use idempotency keys to prevent duplicate emails when retrying failed requests. Keys expire after 24 hours and have a max length of 256 characters.
13
+
14
+ **Key format:** Use `<event-type>/<entity-id>` pattern (e.g., `welcome-email/user-123`, `order-confirmation/order-456`).
15
+
16
+ **Behavior:** If same key is sent with a different payload, Resend returns a 409 error. If same key with same payload, returns the original response without resending.
17
+
18
+ ### Node.js
19
+
20
+ The Node.js SDK has a dedicated `idempotencyKey` option:
21
+
22
+ ```typescript
23
+ import { Resend } from 'resend';
24
+
25
+ const resend = new Resend(process.env.RESEND_API_KEY);
26
+
27
+ const { data, error } = await resend.emails.send(
28
+ {
29
+ from: 'Acme <onboarding@resend.dev>',
30
+ to: ['delivered@resend.dev'],
31
+ subject: 'Order Confirmation',
32
+ html: '<p>Your order has been confirmed.</p>',
33
+ },
34
+ {
35
+ idempotencyKey: `order-confirmation/${orderId}`,
36
+ }
37
+ );
38
+ ```
39
+
40
+ ### Python
41
+
42
+ ```python
43
+ import resend
44
+ import os
45
+
46
+ resend.api_key = os.environ["RESEND_API_KEY"]
47
+
48
+ email = resend.Emails.send({
49
+ "from": "Acme <onboarding@resend.dev>",
50
+ "to": ["delivered@resend.dev"],
51
+ "subject": "Order Confirmation",
52
+ "html": "<p>Your order has been confirmed.</p>",
53
+ }, idempotency_key=f"order-confirmation/{order_id}")
54
+ ```
55
+
56
+ ### Go
57
+
58
+ Other SDKs use the `Idempotency-Key` header:
59
+
60
+ ```go
61
+ import "github.com/resend/resend-go/v3"
62
+
63
+ client := resend.NewClient(os.Getenv("RESEND_API_KEY"))
64
+
65
+ params := &resend.SendEmailRequest{
66
+ From: "Acme <onboarding@resend.dev>",
67
+ To: []string{"delivered@resend.dev"},
68
+ Subject: "Order Confirmation",
69
+ Html: "<p>Your order has been confirmed.</p>",
70
+ Headers: map[string]string{
71
+ "Idempotency-Key": fmt.Sprintf("order-confirmation/%s", orderID),
72
+ },
73
+ }
74
+
75
+ sent, err := client.Emails.Send(params)
76
+ ```
77
+
78
+ ### cURL
79
+
80
+ ```bash
81
+ curl -X POST 'https://api.resend.com/emails' \
82
+ -H 'Authorization: Bearer re_xxxxxxxxx' \
83
+ -H 'Content-Type: application/json' \
84
+ -H 'Idempotency-Key: order-confirmation/12345' \
85
+ -d '{
86
+ "from": "Acme <onboarding@resend.dev>",
87
+ "to": ["delivered@resend.dev"],
88
+ "subject": "Order Confirmation",
89
+ "html": "<p>Your order has been confirmed.</p>"
90
+ }'
91
+ ```
92
+
93
+ ## Error Handling
94
+
95
+ ### Common Error Codes
96
+
97
+ | Code | Description | Action |
98
+ |------|-------------|--------|
99
+ | 400 | Bad request (invalid params) | Fix request parameters |
100
+ | 400 | `invalid_idempotency_key` | Key must be 1-256 characters |
101
+ | 401 | Invalid API key | Check RESEND_API_KEY |
102
+ | 403 | Domain not verified | Verify domain at resend.com/domains |
103
+ | 409 | `invalid_idempotent_request` | Key already used with different payload |
104
+ | 409 | `concurrent_idempotent_requests` | Same key request in progress, retry later |
105
+ | 422 | Unprocessable entity | Check email format/content |
106
+ | 429 | Rate limited | Implement backoff and retry |
107
+ | 500 | Server error | Retry with backoff |
108
+
109
+ ### Node.js
110
+
111
+ ```typescript
112
+ import { Resend } from 'resend';
113
+
114
+ const resend = new Resend(process.env.RESEND_API_KEY);
115
+
116
+ const { data, error } = await resend.emails.send({
117
+ from: 'Acme <onboarding@resend.dev>',
118
+ to: ['delivered@resend.dev'],
119
+ subject: 'Hello',
120
+ html: '<p>Hello world</p>',
121
+ });
122
+
123
+ if (error) {
124
+ console.error('Failed to send email:', error.message);
125
+
126
+ // Handle specific error types
127
+ if (error.name === 'validation_error') {
128
+ // Invalid parameters - don't retry
129
+ throw new Error(`Invalid email params: ${error.message}`);
130
+ }
131
+
132
+ if (error.name === 'rate_limit_exceeded') {
133
+ // Rate limited - retry after delay
134
+ console.log('Rate limited, retrying...');
135
+ }
136
+
137
+ return;
138
+ }
139
+
140
+ console.log('Email sent:', data.id);
141
+ ```
142
+
143
+ ### Python
144
+
145
+ ```python
146
+ import resend
147
+ import os
148
+
149
+ resend.api_key = os.environ["RESEND_API_KEY"]
150
+
151
+ try:
152
+ email = resend.Emails.send({
153
+ "from": "Acme <onboarding@resend.dev>",
154
+ "to": ["delivered@resend.dev"],
155
+ "subject": "Hello",
156
+ "html": "<p>Hello world</p>",
157
+ })
158
+ print(f"Email sent: {email['id']}")
159
+ except resend.exceptions.ValidationError as e:
160
+ # Invalid parameters - don't retry
161
+ print(f"Validation error: {e}")
162
+ except resend.exceptions.RateLimitError as e:
163
+ # Rate limited - retry after delay
164
+ print(f"Rate limited: {e}")
165
+ except resend.exceptions.ResendError as e:
166
+ # Other API error
167
+ print(f"API error: {e}")
168
+ ```
169
+
170
+ ### Go
171
+
172
+ ```go
173
+ import (
174
+ "fmt"
175
+ "github.com/resend/resend-go/v3"
176
+ )
177
+
178
+ client := resend.NewClient(os.Getenv("RESEND_API_KEY"))
179
+
180
+ params := &resend.SendEmailRequest{
181
+ From: "Acme <onboarding@resend.dev>",
182
+ To: []string{"delivered@resend.dev"},
183
+ Subject: "Hello",
184
+ Html: "<p>Hello world</p>",
185
+ }
186
+
187
+ sent, err := client.Emails.Send(params)
188
+ if err != nil {
189
+ // Check error type and handle accordingly
190
+ fmt.Printf("Failed to send email: %v\n", err)
191
+ return
192
+ }
193
+
194
+ fmt.Printf("Email sent: %s\n", sent.Id)
195
+ ```
196
+
197
+ ## Retry Logic
198
+
199
+ Implement exponential backoff for transient failures (rate limits, server errors). Don't retry 409 `invalid_idempotent_request` errors (different payload).
200
+
201
+ ### Node.js
202
+
203
+ ```typescript
204
+ import { Resend } from 'resend';
205
+
206
+ const resend = new Resend(process.env.RESEND_API_KEY);
207
+
208
+ async function sendEmailWithRetry(
209
+ params: Parameters<typeof resend.emails.send>[0],
210
+ options: { maxRetries?: number; idempotencyKey?: string } = {}
211
+ ) {
212
+ const { maxRetries = 3, idempotencyKey } = options;
213
+
214
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
215
+ const { data, error } = await resend.emails.send(
216
+ params,
217
+ idempotencyKey ? { idempotencyKey } : undefined
218
+ );
219
+
220
+ if (!error) {
221
+ return data;
222
+ }
223
+
224
+ // Don't retry validation errors or idempotency conflicts
225
+ if (error.name === 'validation_error' || error.name === 'invalid_idempotent_request') {
226
+ throw new Error(`${error.name}: ${error.message}`);
227
+ }
228
+
229
+ // Last attempt failed
230
+ if (attempt === maxRetries) {
231
+ throw new Error(`Failed after ${maxRetries + 1} attempts: ${error.message}`);
232
+ }
233
+
234
+ // Exponential backoff: 1s, 2s, 4s...
235
+ const delay = Math.pow(2, attempt) * 1000;
236
+ console.log(`Attempt ${attempt + 1} failed, retrying in ${delay}ms...`);
237
+ await new Promise(resolve => setTimeout(resolve, delay));
238
+ }
239
+ }
240
+
241
+ // Usage
242
+ const result = await sendEmailWithRetry(
243
+ {
244
+ from: 'Acme <onboarding@resend.dev>',
245
+ to: ['delivered@resend.dev'],
246
+ subject: 'Order Confirmation',
247
+ html: '<p>Your order is confirmed.</p>',
248
+ },
249
+ { idempotencyKey: `order-confirmation/${orderId}` }
250
+ );
251
+ ```
252
+
253
+ ### Python
254
+
255
+ ```python
256
+ import resend
257
+ import os
258
+ import time
259
+
260
+ resend.api_key = os.environ["RESEND_API_KEY"]
261
+
262
+ def send_email_with_retry(params, max_retries=3, idempotency_key=None):
263
+ for attempt in range(max_retries + 1):
264
+ try:
265
+ return resend.Emails.send(params, idempotency_key=idempotency_key)
266
+ except resend.exceptions.ValidationError:
267
+ # Don't retry validation errors
268
+ raise
269
+ except resend.exceptions.ResendError as e:
270
+ if attempt == max_retries:
271
+ raise Exception(f"Failed after {max_retries + 1} attempts: {e}")
272
+
273
+ # Exponential backoff: 1s, 2s, 4s...
274
+ delay = (2 ** attempt)
275
+ print(f"Attempt {attempt + 1} failed, retrying in {delay}s...")
276
+ time.sleep(delay)
277
+
278
+ # Usage
279
+ result = send_email_with_retry(
280
+ {
281
+ "from": "Acme <onboarding@resend.dev>",
282
+ "to": ["delivered@resend.dev"],
283
+ "subject": "Order Confirmation",
284
+ "html": "<p>Your order is confirmed.</p>",
285
+ },
286
+ idempotency_key=f"order-confirmation/{order_id}"
287
+ )
288
+ ```
289
+
290
+ ### Go
291
+
292
+ ```go
293
+ import (
294
+ "fmt"
295
+ "time"
296
+ "github.com/resend/resend-go/v3"
297
+ )
298
+
299
+ func sendEmailWithRetry(client *resend.Client, params *resend.SendEmailRequest, maxRetries int) (*resend.SendEmailResponse, error) {
300
+ var lastErr error
301
+
302
+ for attempt := 0; attempt <= maxRetries; attempt++ {
303
+ sent, err := client.Emails.Send(params)
304
+ if err == nil {
305
+ return sent, nil
306
+ }
307
+
308
+ lastErr = err
309
+
310
+ if attempt == maxRetries {
311
+ break
312
+ }
313
+
314
+ // Exponential backoff: 1s, 2s, 4s...
315
+ delay := time.Duration(1<<attempt) * time.Second
316
+ fmt.Printf("Attempt %d failed, retrying in %v...\n", attempt+1, delay)
317
+ time.Sleep(delay)
318
+ }
319
+
320
+ return nil, fmt.Errorf("failed after %d attempts: %w", maxRetries+1, lastErr)
321
+ }
322
+
323
+ // Usage
324
+ client := resend.NewClient(os.Getenv("RESEND_API_KEY"))
325
+
326
+ params := &resend.SendEmailRequest{
327
+ From: "Acme <onboarding@resend.dev>",
328
+ To: []string{"delivered@resend.dev"},
329
+ Subject: "Order Confirmation",
330
+ Html: "<p>Your order is confirmed.</p>",
331
+ Headers: map[string]string{
332
+ "Idempotency-Key": fmt.Sprintf("order-confirmation/%s", orderID),
333
+ },
334
+ }
335
+
336
+ sent, err := sendEmailWithRetry(client, params, 3)
337
+ ```
338
+
339
+ ## Complete Examples
340
+
341
+ ### Node.js - Production-Ready Email Service
342
+
343
+ ```typescript
344
+ import { Resend } from 'resend';
345
+ import { randomUUID } from 'crypto';
346
+
347
+ const resend = new Resend(process.env.RESEND_API_KEY);
348
+
349
+ interface SendEmailOptions {
350
+ to: string | string[];
351
+ subject: string;
352
+ html: string;
353
+ from?: string;
354
+ replyTo?: string;
355
+ idempotencyKey?: string;
356
+ maxRetries?: number;
357
+ }
358
+
359
+ async function sendEmail(options: SendEmailOptions) {
360
+ const {
361
+ to,
362
+ subject,
363
+ html,
364
+ from = 'Acme <noreply@acme.com>',
365
+ replyTo,
366
+ idempotencyKey = randomUUID(),
367
+ maxRetries = 3,
368
+ } = options;
369
+
370
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
371
+ const { data, error } = await resend.emails.send(
372
+ {
373
+ from,
374
+ to: Array.isArray(to) ? to : [to],
375
+ subject,
376
+ html,
377
+ ...(replyTo && { replyTo }),
378
+ },
379
+ { idempotencyKey }
380
+ );
381
+
382
+ if (!error) {
383
+ return { success: true, id: data.id };
384
+ }
385
+
386
+ // Don't retry client errors or idempotency conflicts
387
+ if (error.name === 'validation_error' || error.name === 'not_found' || error.name === 'invalid_idempotent_request') {
388
+ return { success: false, error: error.message, retryable: false };
389
+ }
390
+
391
+ if (attempt < maxRetries) {
392
+ const delay = Math.pow(2, attempt) * 1000;
393
+ await new Promise(r => setTimeout(r, delay));
394
+ }
395
+ }
396
+
397
+ return { success: false, error: 'Max retries exceeded', retryable: true };
398
+ }
399
+
400
+ // Usage
401
+ const result = await sendEmail({
402
+ to: 'delivered@resend.dev',
403
+ subject: 'Welcome!',
404
+ html: '<h1>Welcome to Acme</h1>',
405
+ idempotencyKey: `welcome-email/${userId}`,
406
+ });
407
+ ```
408
+
409
+ ### Python - Production-Ready Email Service
410
+
411
+ ```python
412
+ import resend
413
+ import os
414
+ import time
415
+ import uuid
416
+ from dataclasses import dataclass
417
+ from typing import Optional, Union, List
418
+
419
+ resend.api_key = os.environ["RESEND_API_KEY"]
420
+
421
+ @dataclass
422
+ class EmailResult:
423
+ success: bool
424
+ id: Optional[str] = None
425
+ error: Optional[str] = None
426
+ retryable: bool = False
427
+
428
+ def send_email(
429
+ to: Union[str, List[str]],
430
+ subject: str,
431
+ html: str,
432
+ from_addr: str = "Acme <noreply@acme.com>",
433
+ reply_to: Optional[str] = None,
434
+ idempotency_key: Optional[str] = None,
435
+ max_retries: int = 3,
436
+ ) -> EmailResult:
437
+ idempotency_key = idempotency_key or str(uuid.uuid4())
438
+ recipients = [to] if isinstance(to, str) else to
439
+
440
+ params = {
441
+ "from": from_addr,
442
+ "to": recipients,
443
+ "subject": subject,
444
+ "html": html,
445
+ }
446
+ if reply_to:
447
+ params["reply_to"] = reply_to
448
+
449
+ for attempt in range(max_retries + 1):
450
+ try:
451
+ result = resend.Emails.send(params, idempotency_key=idempotency_key)
452
+ return EmailResult(success=True, id=result["id"])
453
+ except resend.exceptions.ValidationError as e:
454
+ return EmailResult(success=False, error=str(e), retryable=False)
455
+ except resend.exceptions.ResendError as e:
456
+ if attempt < max_retries:
457
+ time.sleep(2 ** attempt)
458
+ else:
459
+ return EmailResult(success=False, error=str(e), retryable=True)
460
+
461
+ return EmailResult(success=False, error="Max retries exceeded", retryable=True)
462
+
463
+ # Usage
464
+ result = send_email(
465
+ to="delivered@resend.dev",
466
+ subject="Welcome!",
467
+ html="<h1>Welcome to Acme</h1>",
468
+ idempotency_key=f"welcome-email/{user_id}",
469
+ )
470
+ ```
@@ -0,0 +1,221 @@
1
+ # Webhooks
2
+
3
+ Receive real-time notifications when email events occur (delivered, bounced, opened, etc.).
4
+
5
+ ## When to Use Webhooks
6
+
7
+ - Track delivery status in your database
8
+ - Remove bounced addresses from mailing lists
9
+ - Trigger follow-up actions when emails are opened/clicked
10
+ - Create alerts for failures or complaints
11
+ - Build custom analytics dashboards
12
+
13
+ ## Event Types
14
+
15
+ ### Email Events
16
+
17
+ | Event | Trigger | Use Case |
18
+ |-------|---------|----------|
19
+ | `email.sent` | API request successful, delivery attempted | Confirm email accepted |
20
+ | `email.delivered` | Email reached recipient's mail server | Confirm successful delivery |
21
+ | `email.bounced` | Mail server permanently rejected (hard bounce) | Remove from list, alert user |
22
+ | `email.complained` | Recipient marked as spam | Unsubscribe, review content |
23
+ | `email.opened` | Recipient opened email | Track engagement |
24
+ | `email.clicked` | Recipient clicked a link | Track engagement |
25
+ | `email.delivery_delayed` | Temporary delivery issue (soft bounce) | Monitor, may resolve automatically |
26
+ | `email.failed` | Send error (invalid recipient, quota, etc.) | Debug, alert |
27
+
28
+ ### Bounce Types
29
+
30
+ | Type | Event | Action |
31
+ |------|-------|--------|
32
+ | **Hard bounce (Permanent)** | `email.bounced` | Remove address immediately - never retry |
33
+ | **Soft bounce (Transient)** | `email.delivery_delayed` | Monitor - Resend retries automatically |
34
+ | **Undetermined** | `email.bounced` | Treat as hard bounce if repeated |
35
+
36
+ **Hard bounces** (`email.bounced`) are permanent failures. The address is invalid and will never accept mail. Continuing to send to hard-bounced addresses destroys your sender reputation.
37
+
38
+ | Subtype | Cause |
39
+ |---------|-------|
40
+ | General | Recipient's email provider sent a hard bounce |
41
+ | NoEmail | Address doesn't exist or couldn't be determined |
42
+
43
+ **Soft bounces** (`email.delivery_delayed`) are temporary issues. Resend automatically retries these. If delivery ultimately fails after retries, you'll receive an `email.bounced` event.
44
+
45
+ | Subtype | Cause | May Resolve If... |
46
+ |---------|-------|-------------------|
47
+ | General | Temporary rejection | Underlying issue clears |
48
+ | MailboxFull | Recipient's inbox at capacity | Recipient frees space |
49
+ | MessageTooLarge | Exceeds provider size limit | You reduce message size |
50
+ | ContentRejected | Contains disallowed content | You modify content |
51
+ | AttachmentRejected | Attachment type/size rejected | You modify attachment |
52
+
53
+ **Undetermined bounces** occur when the bounce message doesn't contain enough information for Resend to determine the reason. Treat repeated undetermined bounces as hard bounces.
54
+
55
+ ### Other Events
56
+
57
+ | Event | Trigger |
58
+ |-------|---------|
59
+ | `domain.created` / `updated` / `deleted` | Domain configuration changes |
60
+ | `contact.created` / `updated` / `deleted` | Contact list changes (not from CSV imports) |
61
+
62
+ ## Setup
63
+
64
+ 1. **Create endpoint** - POST endpoint that returns HTTP 200
65
+ 2. **Add webhook** - In Resend dashboard (resend.com/webhooks), add your URL and select events
66
+ 3. **Verify signatures** - **REQUIRED** - See [Signature Verification](#signature-verification)
67
+ 4. **Test locally** - Use ngrok or similar for local development
68
+
69
+ ## Signature Verification
70
+
71
+ **You MUST verify webhook signatures.** Without verification, attackers can send fake webhooks to your endpoint.
72
+
73
+ ### Why Verification Matters
74
+
75
+ - Webhooks are unauthenticated HTTP POST requests
76
+ - Anyone who knows your endpoint URL can send fake events
77
+ - Verification ensures the webhook genuinely came from Resend
78
+ - Unique signatures prevent replay attacks
79
+
80
+ ### Required Headers
81
+
82
+ Every webhook includes these headers for verification:
83
+
84
+ | Header | Purpose |
85
+ |--------|---------|
86
+ | `svix-id` | Unique message identifier |
87
+ | `svix-timestamp` | Unix timestamp when sent |
88
+ | `svix-signature` | Cryptographic signature |
89
+
90
+ ### Get Your Webhook Secret
91
+
92
+ Find your signing secret in the Resend dashboard:
93
+ 1. Go to resend.com/webhooks
94
+ 2. Click on your webhook
95
+ 3. Copy the signing secret (starts with `whsec_`)
96
+
97
+ Store it securely as `RESEND_WEBHOOK_SECRET` environment variable.
98
+
99
+ ### Using Resend SDK (Recommended)
100
+
101
+ Example using Next.js:
102
+
103
+ ```typescript
104
+ import { Resend } from 'resend';
105
+ import { NextRequest, NextResponse } from 'next/server';
106
+ import { db } from '@/lib/db'; // Your database client (Prisma, Drizzle, etc.)
107
+
108
+ const resend = new Resend(process.env.RESEND_API_KEY);
109
+
110
+ export async function POST(req: NextRequest) {
111
+ try {
112
+ // CRITICAL: Use raw body, not parsed JSON
113
+ const payload = await req.text();
114
+
115
+ // Throws an error if the webhook is invalid
116
+ // Otherwise, returns the parsed payload object
117
+ const event = resend.webhooks.verify({
118
+ payload,
119
+ headers: {
120
+ 'svix-id': req.headers.get('svix-id'),
121
+ 'svix-timestamp': req.headers.get('svix-timestamp'),
122
+ 'svix-signature': req.headers.get('svix-signature'),
123
+ },
124
+ secret: process.env.RESEND_WEBHOOK_SECRET,
125
+ });
126
+
127
+ // Handle the verified event
128
+ switch (event.type) {
129
+ case 'email.delivered':
130
+ // update database with the email delivery status
131
+ break;
132
+
133
+ case 'email.bounced':
134
+ // Hard bounce - remove from mailing list immediately
135
+ break;
136
+
137
+ case 'email.complained':
138
+ // Spam complaint - unsubscribe and flag
139
+ break;
140
+
141
+ default:
142
+ // handle other events
143
+ return new Response('OK', { status: 200, body: 'Event skipped' });
144
+ }
145
+
146
+ return new NextResponse('OK', { status: 200 });
147
+ } catch (error) {
148
+ console.error('Webhook verification failed:', error);
149
+ return new NextResponse('Invalid signature', { status: 400 });
150
+ }
151
+ }
152
+ ```
153
+
154
+ ## Common Mistakes
155
+
156
+ | Mistake | Fix |
157
+ |---------|-----|
158
+ | Not verifying signatures | **Always verify** - attackers can send fake webhooks |
159
+ | Using parsed JSON body | Use raw request body - JSON parsing breaks signature |
160
+ | Using `express.json()` middleware | Use `express.raw()` for webhook routes |
161
+ | Hardcoding webhook secret | Store in environment variable |
162
+ | Returning non-200 status for valid webhooks | Return 200 OK to acknowledge receipt |
163
+
164
+ ## Retry Schedule
165
+
166
+ If your endpoint doesn't return HTTP 200, Resend retries with exponential backoff:
167
+
168
+ | Attempt | Delay After Failure |
169
+ |---------|---------------------|
170
+ | 1 | Immediate |
171
+ | 2 | 5 seconds |
172
+ | 3 | 5 minutes |
173
+ | 4 | 30 minutes |
174
+ | 5 | 2 hours |
175
+ | 6 | 5 hours |
176
+ | 7 | 10 hours |
177
+
178
+ Example: A webhook that fails 3 times before succeeding will be delivered ~35 minutes after the first attempt.
179
+
180
+ **Tip:** Always return 200 quickly, then process asynchronously if needed. You can manually replay failed webhooks from the dashboard.
181
+
182
+ ## IP Allowlist
183
+
184
+ If your firewall requires allowlisting, webhooks come from:
185
+
186
+ ```
187
+ 44.228.126.217
188
+ 50.112.21.217
189
+ 52.24.126.164
190
+ 54.148.139.208
191
+ ```
192
+
193
+ IPv6: `2600:1f24:64:8000::/52`
194
+
195
+ ## Local Development
196
+
197
+ Use tunneling tools to test webhooks locally:
198
+
199
+ ```bash
200
+ # ngrok
201
+ ngrok http 3000
202
+
203
+ # use the port that your server is running on (e.g. 3000)
204
+ # Then use the ngrok URL in Resend dashboard
205
+ # https://abc123.ngrok.io/webhooks/resend
206
+ ```
207
+
208
+ ## Event Payload Example
209
+
210
+ ```json
211
+ {
212
+ "type": "email.delivered",
213
+ "created_at": "2024-01-15T12:00:00.000Z",
214
+ "data": {
215
+ "email_id": "ae2014de-c168-4c61-8267-70d2662a1ce1",
216
+ "from": "Acme <noreply@acme.com>",
217
+ "to": ["delivered@resend.dev"],
218
+ "subject": "Welcome to Acme"
219
+ }
220
+ }
221
+ ```