@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,138 @@
1
+ ---
2
+ name: x-post-generator-openclaw
3
+ description: "Generate complete X/Twitter posts using 2026 best practices. Includes brand voice loading, proven hook patterns, self-scoring, and humanizer +..."
4
+ depends-on: [hook-generator, humanizer, quality-gate, sharp-thesis-validator]
5
+ ---
6
+
7
+ # X Post Generator for OpenClaw
8
+
9
+ Transform a selected hook into a complete, scored X post or thread. Uses Gemini CLI (free, no API keys).
10
+
11
+ **This skill = the script.** The script generates a draft + self-score. The agent running this skill MUST chain humanizer + quality-gate afterward.
12
+
13
+ ## Pipeline (MANDATORY)
14
+
15
+ ```
16
+ hook-generator → sharp-thesis-validator (social) → user selects hook → this script → humanizer skill → quality-gate (mode: x)
17
+ ↓ FAIL = BLOCK
18
+ ↓ PASS = continue
19
+ ↓
20
+ PASS → present to user
21
+ FAIL → rewrite (max 3 loops)
22
+ ```
23
+
24
+ **Sharp-Thesis Validation (Phase 0):** Before proceeding, validate the hook passes the Cerebras Test in social mode:
25
+ ```
26
+ sharp-thesis-validator --mode social --brand {brand} "{hook}"
27
+ ```
28
+ - PASS: Proceed to script execution
29
+ - FAIL: STOP, return reframing suggestions
30
+
31
+ **Awareness Gate (Phase 00, MANDATORY):** Before hook generation, determine the target audience's awareness level. See `references/awareness-level-guide.md`. If unclear from context, ask the user.
32
+
33
+ **The script does NOT replace humanizer or quality-gate.** It produces a draft. Those skills validate it.
34
+
35
+ ## What the Script Does
36
+
37
+ 1. Loads brand voice from `brand/voice-dna.md` (first priority), then falls back to `brand/voice-profile.md` or `brand-assets/voice-guide.md`
38
+ 2. Loads ICP + pain points from `icp-profile.md`
39
+ 3. Loads proven Twitter hook patterns from `hook-generator/database/twitter-hooks.json`
40
+ 4. Generates single post or thread via Gemini CLI
41
+ 5. Applies regex humanization (basic)
42
+ 6. Self-scores on 5 dimensions (hook_strength, voice_authenticity, specificity, value_density, algorithm_fit)
43
+ 7. Saves post + metadata to `/tmp/xpost-{timestamp}.txt` and `.json`
44
+ 8. Exits with code 2 if self-score says REWRITE
45
+
46
+ ## What the Agent Must Do After
47
+
48
+ 1. Read the saved draft
49
+ 2. Run **humanizer** skill on it (full AI-pattern removal, not just regex)
50
+ 3. Spawn **quality-gate** with `mode: x` and the draft path
51
+ 4. If FAIL: rewrite with feedback, max 3 loops
52
+ 5. If PASS: present to user
53
+
54
+ ## Usage
55
+
56
+ ```bash
57
+ # Single post
58
+ node scripts/generate-x-post.js \
59
+ --hook "I cut my AI memory by 99%. The result?" \
60
+ --topic "lightweight AI tools" \
61
+ --brand aiwithjai \
62
+ --objective engagement
63
+
64
+ # Thread
65
+ node scripts/generate-x-post.js \
66
+ --hook "I rewrote my entire stack in Rust..." \
67
+ --topic "Rust for indie hackers" \
68
+ --brand aiwithjai \
69
+ --objective engagement \
70
+ --thread
71
+ ```
72
+
73
+ ### Parameters
74
+
75
+ | Param | Required | Description |
76
+ |-------|----------|-------------|
77
+ | `--hook` | Yes | Selected hook from hook-generator |
78
+ | `--topic` | Yes | Topic for context |
79
+ | `--brand` | No | Brand name (loads voice + ICP from brand/ dir) |
80
+ | `--objective` | No | `engagement` (default), `blog-traffic`, `authority` |
81
+ | `--format` | No | `single` (default) or `thread` |
82
+ | `--thread` | No | Shorthand for `--format thread` |
83
+
84
+ ### Objectives
85
+
86
+ 1. **engagement**: Reveal 90-95%. Max replies/shares.
87
+ 2. **blog-traffic**: Reveal 50%, tease 50%. DM for link.
88
+ 3. **authority**: Reveal 70-80%. Methodology focus.
89
+
90
+ ## Brand Resolution
91
+
92
+ The script searches these roots for brand dirs:
93
+ - `./businesses/{brand}/`
94
+ - `/Users/Shared/clawd/newsletter/brands/{brand}/`
95
+
96
+ Looks for: `voice-dna.md` (first priority), `voice-profile.md`, `voice-guide.md`, `icp-profile.md`, `audience.md`
97
+
98
+ ## 2026 X Algorithm Rules (Built Into Prompt)
99
+
100
+ **Do:**
101
+ - No external URLs (30-60% reach penalty)
102
+ - Reply to every reply in first 30-60 min
103
+ - "Save this" / "Bookmark" CTAs (saves weighted heavily)
104
+ - Short punchy lines with white space
105
+ - Lead with failed stories over success stories
106
+
107
+ **Don't:**
108
+ - Include external URLs
109
+ - Edit post after 10+ min (algo reset)
110
+ - Use more than 2 hashtags
111
+ - Post without humanization
112
+
113
+ ## Self-Scoring Dimensions
114
+
115
+ | Dimension | Weight | What it checks |
116
+ |-----------|--------|---------------|
117
+ | hook_strength | High | Does the opening stop the scroll? |
118
+ | voice_authenticity | High | Sounds human, not AI? |
119
+ | specificity | Med | Concrete details vs vague claims? |
120
+ | value_density | Med | Useful info per character? |
121
+ | algorithm_fit | Low | 2026 X algo friendly? |
122
+
123
+ Exit code 2 = self-score failed, agent must humanize + quality-gate before presenting.
124
+
125
+ ## Files
126
+
127
+ - `scripts/generate-x-post.js` — Main entry (Gemini CLI, no API keys)
128
+ - `database/twitter-hooks.json` — Proven hooks with engagement data (in hook-generator skill)
129
+
130
+ ## Models
131
+
132
+ All via Gemini CLI (free tier, no API key needed):
133
+ - Generation: gemini-2.5-flash-lite
134
+ - Self-scoring: gemini-2.5-flash-lite
135
+
136
+ ## Cost
137
+
138
+ $0.00 — all Gemini CLI free tier.
@@ -0,0 +1,537 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { spawnSync } = require('child_process');
6
+
7
+ const BRAND_ROOTS = [
8
+ './businesses',
9
+ ];
10
+
11
+ function parseArgs() {
12
+ const args = process.argv.slice(2);
13
+ const opts = {};
14
+ for (let i = 0; i < args.length; i++) {
15
+ if (args[i].startsWith('--')) {
16
+ const key = args[i].slice(2);
17
+ const val = args[i + 1];
18
+ if (val && !val.startsWith('--')) {
19
+ opts[key] = val;
20
+ i++;
21
+ } else {
22
+ opts[key] = true;
23
+ }
24
+ }
25
+ }
26
+ return opts;
27
+ }
28
+
29
+ function findFile(dir, candidates) {
30
+ for (const name of candidates) {
31
+ const p = path.join(dir, name);
32
+ if (fs.existsSync(p)) return p;
33
+ }
34
+ for (const sub of fs.readdirSync(dir, { withFileTypes: true }).filter(d => d.isDirectory())) {
35
+ const found = findFile(path.join(dir, sub.name), candidates);
36
+ if (found) return found;
37
+ }
38
+ return null;
39
+ }
40
+
41
+ function resolveBrandDir(root, brand) {
42
+ const direct = path.join(root, brand);
43
+ if (fs.existsSync(direct)) return direct;
44
+ for (const entry of fs.readdirSync(root, { withFileTypes: true }).filter(d => d.isDirectory())) {
45
+ const candidate = path.join(entry.path || root, entry.name, brand);
46
+ if (fs.existsSync(candidate)) return candidate;
47
+ }
48
+ return null;
49
+ }
50
+
51
+ function loadBrand(brand) {
52
+ if (!brand) return null;
53
+ for (const root of BRAND_ROOTS) {
54
+ if (!fs.existsSync(root)) continue;
55
+ const brandDir = resolveBrandDir(root, brand);
56
+ if (!brandDir) continue;
57
+
58
+ const result = { name: brand, dir: brandDir, voice: null, icp: null, pains: [], positioning: [], offer: null, evergreen: null };
59
+
60
+ // Load voice-dna.md (priority), then voice-profile.md
61
+ const voiceFile = findFile(brandDir, ['voice-dna.md', 'voice-profile.md', 'voice-guide.md']);
62
+ if (voiceFile) {
63
+ const content = fs.readFileSync(voiceFile, 'utf8');
64
+ // Extract practical rules, NOT journaling patterns
65
+ // We want: banned words, terminology, rhythm rules — NOT "staccato self-flagellation" or "cosmic whiplash" as primary modes
66
+ const voiceRules = [];
67
+
68
+ // Extract banned words
69
+ const bannedSection = content.match(/Banned Words[\s\S]*?(?=\n##|\n###|$)/i);
70
+ if (bannedSection) {
71
+ const bannedWords = [...bannedSection[0].matchAll(/[-*]\s+(.+)/g)].map(m => m[1].trim()).slice(0, 10);
72
+ if (bannedWords.length > 0) voiceRules.push(`Banned words: ${bannedWords.join(', ')}`);
73
+ }
74
+
75
+ // Extract core phrases (terminology)
76
+ const phrasesSection = content.match(/Core Phases[\s\S]*?(?=\n###|$)/i) || content.match(/Must Use[\s\S]*?(?=\n###|$)/i);
77
+ if (phrasesSection) {
78
+ const phrases = [...phrasesSection[0].matchAll(/\|\s*"([^"]+)"/g)].map(m => m[1]).slice(0, 5);
79
+ if (phrases.length > 0) voiceRules.push(`Natural vocabulary: ${phrases.join(', ')}`);
80
+ }
81
+
82
+ // Extract contrast pairs (use sparingly)
83
+ const contrastSection = content.match(/Contrast Pairs[\s\S]*?(?=\n##|\n###|$)/i);
84
+ if (contrastSection) {
85
+ const pairs = [...contrastSection[0].matchAll(/-\s+(.+)/g)].map(m => m[1].trim()).slice(0, 4);
86
+ if (pairs.length > 0) voiceRules.push(`Contrast pairs (use ONE per thread max): ${pairs.join('; ')}`);
87
+ }
88
+
89
+ // Build a practical voice summary
90
+ voiceRules.push('Tone: direct, no hedging, conversational. Sound like a person explaining something to a peer over coffee.');
91
+ voiceRules.push('Rhythm: vary sentence length. Short punchy lines for emphasis. Normal sentences for explanation. Avoid ALL-staccato fragments.');
92
+ voiceRules.push('Use ONE physical detail or metaphor per thread as seasoning. Not every sentence needs a physical anchor.');
93
+
94
+ result.voice = voiceRules.join('\n');
95
+ }
96
+
97
+ // Load evergreen.md from brand dir OR company root (walk up)
98
+ let evergreenFile = findFile(brandDir, ['evergreen.md']);
99
+ if (!evergreenFile) {
100
+ // Walk up to find company-level evergreen.md
101
+ let currentDir = brandDir;
102
+ for (let i = 0; i < 4; i++) {
103
+ const parent = path.dirname(currentDir);
104
+ if (parent === currentDir) break;
105
+ const candidate = path.join(parent, 'evergreen.md');
106
+ if (fs.existsSync(candidate)) {
107
+ evergreenFile = candidate;
108
+ break;
109
+ }
110
+ currentDir = parent;
111
+ }
112
+ }
113
+ if (evergreenFile) {
114
+ const content = fs.readFileSync(evergreenFile, 'utf8');
115
+ result.evergreen = content.slice(0, 5000);
116
+
117
+ // Extract ICP - look for specific ICP description patterns
118
+ const icpPatterns = [
119
+ /Overwhelmed Operator[\s\S]*?(?=\n##|\n###|$)/i,
120
+ /ICP[:\s]*([^\n]+)/i,
121
+ /Primary.*?:\s*([^\n]+)/i,
122
+ /Target Verticals[\s\S]*?(?=\n##|\n###|$)/i,
123
+ /law firm.*?marketing agency.*?real estate/i,
124
+ ];
125
+ for (const pattern of icpPatterns) {
126
+ const match = content.match(pattern);
127
+ if (match) {
128
+ result.icp = match[0].slice(0, 300).trim();
129
+ break;
130
+ }
131
+ }
132
+
133
+ // Extract pain points - look for Pain Pill / pain points sections
134
+ const painPatterns = [
135
+ /Pain Pill Positioning[\s\S]*?(?=\n##|\n###|$)/i,
136
+ /pain points?[\s\S]*?(?=\n##|\n###|$)/i,
137
+ /drowning in[\s\S]*?(?=\n##|\n###|$)/i,
138
+ /20\+ AI tabs[\s\S]*?(?=\n##|\n###|$)/i,
139
+ /zero systems in production[\s\S]*?(?=\n##|\n###|$)/i,
140
+ /tool guilt[\s\S]*?(?=\n##|\n###|$)/i,
141
+ /course fatigue[\s\S]*?(?=\n##|\n###|$)/i,
142
+ /wiring part isn't[\s\S]*?(?=\n##|\n###|$)/i,
143
+ ];
144
+ for (const pattern of painPatterns) {
145
+ const match = content.match(pattern);
146
+ if (match) {
147
+ const extracted = [...match[0].matchAll(/^[-*]\s+(.+)$/gm)].map(m => m[1]);
148
+ if (extracted.length > 0) {
149
+ result.pains = extracted.slice(0, 5);
150
+ break;
151
+ }
152
+ // Also extract inline pain descriptions
153
+ const inline = match[0].match(/([^.]*?(?:tab|tool|wiring|system|production|guilt|fatigue|bleed|delay|wire)[^.]*\.)/gi);
154
+ if (inline) {
155
+ result.pains = inline.slice(0, 5);
156
+ break;
157
+ }
158
+ }
159
+ }
160
+
161
+ // If no pains found, use defaults from evergreen knowledge
162
+ if (result.pains.length === 0) {
163
+ result.pains = [
164
+ '20+ AI tabs open with zero systems in production',
165
+ 'Tool guilt and course fatigue from buying 6+ tools that dont integrate',
166
+ 'The coding part is solved, the wiring part isnt - drowning in integrations',
167
+ 'Every week of delay costs real money - dollar bleed is measurable',
168
+ 'Needs order of operations, not more tools'
169
+ ];
170
+ }
171
+
172
+ // Extract positioning angles
173
+ const posPatterns = [
174
+ /Positioning Angle[\s\S]*?(?=\n##|\n###|$)/gi,
175
+ /Intelligence Multiplier[\s\S]*?(?=\n##|\n###|$)/i,
176
+ /Order of Operations[\s\S]*?(?=\n##|\n###|$)/i,
177
+ /Automate the Tedious[\s\S]*?(?=\n##|\n###|$)/i,
178
+ /Pain Pill Positioning[\s\S]*?(?=\n##|\n###|$)/i,
179
+ /Hacker-Farmer Identity[\s\S]*?(?=\n##|\n###|$)/i,
180
+ ];
181
+ for (const pattern of posPatterns) {
182
+ const matches = content.match(pattern);
183
+ if (matches && matches.length > 0) {
184
+ result.positioning = matches.slice(0, 3).map(p => p.slice(0, 400));
185
+ break;
186
+ }
187
+ }
188
+
189
+ // Extract offer info
190
+ const offerPatterns = [
191
+ /Offer Stack[\s\S]*?(?=\n##|\n###|$)/i,
192
+ /Tier 1:.*?Tier 2:.*?Tier 3:[\s\S]*?(?=\n##|\n###|$)/i,
193
+ /\$1,500\/month[\s\S]*?\$5,000\/month/i,
194
+ /Concierge.*?Build.*?Managed/i,
195
+ ];
196
+ for (const pattern of offerPatterns) {
197
+ const match = content.match(pattern);
198
+ if (match) {
199
+ result.offer = match[0].slice(0, 500);
200
+ break;
201
+ }
202
+ }
203
+ }
204
+
205
+ // Fallback: try icp-profile.md, audience.md if evergreen didn't give us ICP
206
+ if (!result.icp) {
207
+ const icpFile = findFile(brandDir, ['icp-profile.md', 'icp-profiles.md', 'audience.md']);
208
+ if (icpFile) {
209
+ const content = fs.readFileSync(icpFile, 'utf8');
210
+ const primary = content.match(/Primary.*?:\s*([^\n]+)/i)?.[1]?.trim() || null;
211
+ const pains = content.match(/Pain Points[\s\S]*?(?=###|##|$)/i);
212
+ if (pains) {
213
+ result.pains = [...pains[0].matchAll(/^[-*]\s+(.+)$/gm)].map(m => m[1]).slice(0, 3);
214
+ }
215
+ result.icp = primary;
216
+ }
217
+ }
218
+
219
+ return result;
220
+ }
221
+ return null;
222
+ }
223
+
224
+ function loadHooks(brand) {
225
+ const dbPath = path.join(__dirname, '..', 'database', 'twitter-hooks.json');
226
+ if (!fs.existsSync(dbPath)) return [];
227
+ try {
228
+ const db = JSON.parse(fs.readFileSync(dbPath, 'utf8'));
229
+ const examples = (db.examples || []).slice(0, 8);
230
+ return examples.map(e => ({
231
+ hook: e.hook,
232
+ pattern: e.pattern,
233
+ score: e.engagement?.weightedScore || 0,
234
+ why: e.why_it_works,
235
+ }));
236
+ } catch (_) {
237
+ return [];
238
+ }
239
+ }
240
+
241
+ function callGemini(prompt, timeoutMs = 30000) {
242
+ const result = spawnSync('gemini', ['-m', 'gemini-2.5-flash-lite', '-o', 'text', '-p', prompt], {
243
+ encoding: 'utf-8',
244
+ maxBuffer: 10 * 1024 * 1024,
245
+ timeout: timeoutMs
246
+ });
247
+ if (result.status !== 0) {
248
+ const stderr = result.stderr || '';
249
+ if (/quota|exhausted/i.test(stderr)) {
250
+ throw new Error('QUOTA_EXHAUSTED: Gemini API quota exhausted');
251
+ }
252
+ if (result.signal === 'SIGTERM') {
253
+ throw new Error('TIMEOUT: Gemini CLI timed out');
254
+ }
255
+ throw new Error(`Gemini CLI failed: ${stderr || 'exit ' + result.status}`);
256
+ }
257
+ return result.stdout.trim().replace(/^```(?:text|markdown)?\s*/i, '').replace(/\s*```$/, '');
258
+ }
259
+
260
+ function humanizeRegex(text) {
261
+ if (!text) return '';
262
+ return text
263
+ .replace(/Additionally,?\s*/gi, '')
264
+ .replace(/Furthermore,?\s*/gi, '')
265
+ .replace(/Moreover,?\s*/gi, '')
266
+ .replace(/In today's\s+\w+,?\s*/gi, '')
267
+ .replace(/\bcrucial\b/gi, 'key')
268
+ .replace(/\bpivotal\b/gi, 'important')
269
+ .replace(/\blandscape\b/g, 'space')
270
+ .replace(/\bdelve\b/gi, 'dig')
271
+ .replace(/\bleverage\b/gi, 'use')
272
+ .replace(/\bsynergy\b/gi, 'fit')
273
+ .replace(/\brobust\b/gi, 'solid')
274
+ .replace(/Most people think/gi, 'Some think')
275
+ .replace(/Imagine if/gi, 'Consider')
276
+ .replace(/—/g, ' - ')
277
+ .replace(/\n{3,}/g, '\n\n')
278
+ .replace(/ +/g, ' ')
279
+ .trim();
280
+ }
281
+
282
+ function selfScore(post, hook, brand) {
283
+ const prompt = `Score this X post on a 0-100 scale. Be harsh.
284
+
285
+ POST:
286
+ ${post}
287
+
288
+ HOOK USED: "${hook}"
289
+ BRAND: ${brand || 'none'}
290
+
291
+ Score each dimension 0-100:
292
+ - hook_strength: Does the opening stop the scroll?
293
+ - voice_authenticity: Does it sound human, not AI?
294
+ - specificity: Concrete details vs vague claims?
295
+ - value_density: Useful info per character?
296
+ - algorithm_fit: 2026 X algo friendly (no links, reply-bait CTA)?
297
+
298
+ Return ONLY valid JSON:
299
+ {"hook_strength":N,"voice_authenticity":N,"specificity":N,"value_density":N,"algorithm_fit":N,"total":N,"verdict":"PASS|REWRITE","reason":"one sentence"}`;
300
+
301
+ try {
302
+ const raw = callGemini(prompt, 15000);
303
+ const jsonMatch = raw.match(/\{[\s\S]*\}/);
304
+ if (jsonMatch) return JSON.parse(jsonMatch[0]);
305
+ } catch (err) {
306
+ console.log(` Self-scoring failed (${err.message}), using heuristic...`);
307
+ }
308
+
309
+ // Heuristic fallback scoring
310
+ const isThread = post.includes('---');
311
+ const posts = isThread ? post.split('---').map(p => p.trim()) : [post];
312
+ const firstPost = posts[0];
313
+ const hasLink = /https?:\/\//.test(post);
314
+ const hasEmDash = /—/.test(post);
315
+ const hasAiVocab = /additionally|furthermore|moreover|crucial|pivotal|landscape|delve|leverage|synergy|robust|seamless|game.changer|innovative|utilize/gi.test(post);
316
+ const hasRuleOfThree = /\w+,\s+\w+,\s+and\s+\w+/.test(post) || /\w+,\s+\w+,\s+\w+\./.test(post);
317
+ const hasFirstPerson = /\b(I|my|me)\b/i.test(post);
318
+ const hasNumbers = /\d+(?:,\d+)*(?:\.\d+)?(?:%|K|M|B|x)?/.test(post);
319
+ const hasSpecifics = /(law firm|real estate|marketing agency|34 units|27 drafts|3 weeks|8.75M|AI Employee|Concierge|calculator)/i.test(post);
320
+ const hasPhysicalAnchor = /(mud|rain|coffee|boots|cloud forest|keyboard|desk|farm|harvest|dirt|code)/i.test(post);
321
+ const hasWhiplash = /(mud|rain|coffee|boots|desk|farm|dirt)[^.]*?(orchestrat|wire|system|agent|AI|model|code)/i.test(post);
322
+ const endsWithQuestion = /\?$/.test(post.trim());
323
+
324
+ let hookStrength = 50;
325
+ let voiceAuth = 50;
326
+ let specificity = 50;
327
+ let valueDensity = 50;
328
+ let algoFit = 50;
329
+
330
+ // Hook strength
331
+ if (firstPost.length < 100 && firstPost.length > 20) hookStrength += 10;
332
+ if (/20 tabs|zero systems|AI purgatory|dollar bleed/i.test(firstPost)) hookStrength += 15;
333
+ if (hasAiVocab) hookStrength -= 10;
334
+ if (hasRuleOfThree) hookStrength -= 5;
335
+
336
+ // Voice authenticity
337
+ if (hasFirstPerson) voiceAuth += 10;
338
+ if (hasPhysicalAnchor) voiceAuth += 10;
339
+ if (hasWhiplash) voiceAuth += 15;
340
+ if (hasEmDash) voiceAuth -= 20;
341
+ if (hasAiVocab) voiceAuth -= 15;
342
+ if (hasRuleOfThree) voiceAuth -= 10;
343
+
344
+ // Specificity
345
+ if (hasNumbers) specificity += 15;
346
+ if (hasSpecifics) specificity += 15;
347
+ if (/your|their|our/.test(post) && !/you|your|their|our/.test(firstPost)) specificity -= 5;
348
+
349
+ // Value density
350
+ if (post.length > 200 && posts.length >= 4) valueDensity += 10;
351
+ if (hasSpecifics) valueDensity += 10;
352
+ if (hasAiVocab) valueDensity -= 10;
353
+ if (hasRuleOfThree) valueDensity -= 5;
354
+
355
+ // Algorithm fit
356
+ if (!hasLink) algoFit += 15;
357
+ if (hasEmDash) algoFit -= 10;
358
+ if (endsWithQuestion || /reply|⬇️/.test(post)) algoFit += 10;
359
+ if (hasRuleOfThree) algoFit -= 5;
360
+
361
+ const dims = {hook_strength: hookStrength, voice_authenticity: voiceAuth, specificity, value_density: valueDensity, algorithm_fit: algoFit};
362
+ for (const k of Object.keys(dims)) {
363
+ dims[k] = Math.max(0, Math.min(100, dims[k]));
364
+ }
365
+
366
+ const total = Math.round(Object.values(dims).reduce((a,b) => a+b, 0) / 5);
367
+ const verdict = total >= 70 ? 'PASS' : 'REWRITE';
368
+ const reason = verdict === 'PASS' ? 'Heuristic pass' : 'Heuristic fail - needs work';
369
+
370
+ return { ...dims, total, verdict, reason };
371
+ }
372
+
373
+ function buildPrompt(opts, brand, provenHooks) {
374
+ const isThread = opts.thread || opts.format === 'thread';
375
+ const ctaOptions = {
376
+ engagement: ["What's your experience?", "What did I miss?", "Ever tried this?"],
377
+ 'blog-traffic': ["DM for the full post", "Reply for the link"],
378
+ authority: ["Save this for later", "Bookmark this"],
379
+ };
380
+ const cta = (ctaOptions[opts.objective || 'engagement'] || ctaOptions.engagement)[0];
381
+
382
+ const targetAudience = brand?.icp || 'Overwhelmed Operator — law firm / marketing agency / real estate agency owner ($300K-$3M), 1-15 employees, low-medium technical, 20+ AI tabs open with zero systems in production, drowning in tool guilt and course fatigue, needs order of operations not more tools';
383
+ const pains = brand?.pains?.join(', ') || '20+ AI tabs open, zero systems in production, tool guilt, course fatigue, no order of operations, wiring not solved';
384
+ const voice = brand?.voice || null;
385
+ const positioning = brand?.positioning?.join('\n') || "Angle 1: Intelligence Multiplier (AI amplifies, doesn't replace). Angle 2: Order of Operations (stop buying tools, start deploying systems). Angle 3: Automate the Tedious to Inhabit the Miraculous (mission). Angle 4: Pain Pill Positioning (every headline must pass the pain pill test — what does this save them from?). Angle 5: Hacker-Farmer Identity (generalist who refuses to be a slave, buy back the forest, fuck-you money).";
386
+ const offer = brand?.evergreen ? 'AI Employee 3-tier: Concierge $1.5K/mo → Build $999+$2K/mo → Managed $5K/mo. Calculator at /calc/ measures dollar bleed.' : '';
387
+
388
+ let prompt = `You are writing an X/Twitter thread that delivers REAL VALUE to the reader. Not poetry. Not a brand voice exercise. A thread someone reads and thinks "I learned something" or "I need to save this."
389
+
390
+ VALUE FIRST. The reader must gain a concrete insight, framework, or perspective they didn't have before. If a post doesn't teach the reader something, cut it.
391
+
392
+ Write ${isThread ? 'a THREAD of 3-6 posts. ONLY as many posts as the insight requires. Never pad. A 3-post thread that nails the insight beats a 7-post thread with filler. Every post must earn its place.' : 'a single post'}.
393
+
394
+ FORMATTING: Use blank lines between thoughts for readability. People scroll fast on X. Make it scannable. No walls of text. No haiku-style one-word-per-line fragments unless it's a deliberate punch.
395
+
396
+ HOOK: "${opts.hook}"
397
+ TOPIC: ${opts.topic}
398
+ AUDIENCE (ICP): ${targetAudience}
399
+ CORE PAIN POINTS: ${pains}
400
+ POSITIONING ANGLES (must align with one):
401
+ ${positioning}
402
+ OBJECTIVE: ${opts.objective || 'engagement'}`;
403
+
404
+ if (voice) {
405
+ prompt += `\n\nVOICE RULES (apply as seasoning, NOT as the main structure. Reader value comes first):\n${voice}`;
406
+ }
407
+
408
+ if (provenHooks.length > 0) {
409
+ prompt += '\n\nPROVEN PATTERNS THAT WORK (study the style, don\'t copy):';
410
+ for (const h of provenHooks.slice(0, 4)) {
411
+ prompt += `\n- [${h.pattern}] "${h.hook.slice(0, 120)}..." (${h.score} engagement) — ${h.why}`;
412
+ }
413
+ }
414
+
415
+ if (isThread) {
416
+ prompt += `
417
+
418
+ THREAD STRUCTURE (value-driven):
419
+ - Post 1: The hook (sharp, specific, must standalone)
420
+ - Post 2-N: Deliver the insight. Each post adds NEW information the reader didn't have before.
421
+ Use examples, numbers, comparisons, contrarian takes. Explain WHY, not just WHAT.
422
+ - Final post: Land the takeaway. What should the reader do or think differently now?
423
+ - End when the value is delivered. Don't add filler posts.
424
+
425
+ Separate each post with "---"`;
426
+ } else {
427
+ prompt += `
428
+
429
+ SINGLE POST STRUCTURE:
430
+ - Open with the hook (tighten if needed)
431
+ - 1-2 sentences expanding the insight with a specific detail
432
+ - End with the CTA
433
+ - Keep under 280 characters`;
434
+ }
435
+
436
+ prompt += `
437
+
438
+ HARD RULES (voice-dna.md enforced):
439
+ - NO external URLs (30-60% reach penalty) — calculator link goes in REPLY tweet only
440
+ - NO "Additionally", "Furthermore", "Moreover", "crucial", "pivotal", "landscape", "delve", "leverage", "synergy", "robust", "seamless", "game-changer", "innovative", "utilize"
441
+ - NO em dashes (—) — use periods, semicolons, or short dashes
442
+ - NO "Most people think", "Imagine if", "Picture this", "Let's dive in"
443
+ - NO rule-of-three lists
444
+ - NO generic predictions ("When X, Y follows", "The shift is clear")
445
+ - NO marketing clichés ("ride the wave", "canary in the coal mine", "governance wall got a door")
446
+ - NO CTA posts ("Link in reply", "What's your experience", "Save this")
447
+ - NO pricing dumps or offer pitches — the thread delivers insight, not a sales pitch
448
+ - NO padding — if a post doesn't add unique value, it shouldn't exist
449
+ - First-person "I" where natural — confessional tone
450
+ - Specific numbers over vague claims (34 units, $8.75M MXN, 27 drafts, 3 weeks → hours)
451
+ - Short punchy lines with white space — staccato fragments allowed
452
+ - Use line breaks for rhythm, not walls of text
453
+ - Physical anchor before abstract claim (Rule 5: mud on boots → orchestration layer evaporated)
454
+ - Whiplash pivot: start grounded, end cosmic with NO transition words (Rule 3)
455
+ - End with unanswered question you genuinely wrestle with (Rule 4)
456
+ - Contrast pairs: Physical vs Digital, Farm vs Tech, Dirt vs Code, Freedom vs Wage slavery
457
+ - Sound like a person talking, not a blog post
458
+ - ${opts.objective === 'blog-traffic' ? 'Tease, don\'t reveal everything. DM for link.' : 'Reveal 90-95% of value. Be generous.'}
459
+
460
+ Return ONLY the post text. No explanations, no labels, no meta-commentary.`;
461
+
462
+ return prompt;
463
+ }
464
+
465
+ function main() {
466
+ const args = parseArgs();
467
+ if (!args.hook || !args.topic) {
468
+ console.log('Usage: node generate-x-post.js --hook "..." --topic "..." [--brand name] [--objective engagement|blog-traffic|authority] [--format single|thread] [--thread]');
469
+ process.exit(1);
470
+ }
471
+
472
+ const brand = loadBrand(args.brand);
473
+ const provenHooks = loadHooks(args.brand);
474
+
475
+ console.log(`Brand: ${brand?.name || 'none'}`);
476
+ console.log(`ICP: ${brand?.icp || 'generic'}`);
477
+ console.log(`Voice: ${brand?.voice ? 'loaded' : 'none'}`);
478
+ console.log(`Proven hooks: ${provenHooks.length}`);
479
+ console.log(`Format: ${args.thread || args.format === 'thread' ? 'thread' : 'single'}`);
480
+
481
+ const prompt = buildPrompt(args, brand, provenHooks);
482
+
483
+ console.log('\nGenerating...');
484
+ let raw;
485
+ try {
486
+ raw = callGemini(prompt);
487
+ } catch (err) {
488
+ console.error('Generation failed:', err.message);
489
+ process.exit(1);
490
+ }
491
+
492
+ const post = humanizeRegex(raw);
493
+ if (!post || post.length === 0) {
494
+ console.error('Empty post generated');
495
+ process.exit(1);
496
+ }
497
+
498
+ console.log('\n' + '='.repeat(50));
499
+ console.log('DRAFT POST:\n');
500
+ console.log(post);
501
+ console.log('\n' + '-'.repeat(50));
502
+
503
+ const isThread = args.thread || args.format === 'thread';
504
+ if (!isThread) {
505
+ console.log(`Characters: ${post.length}/280`);
506
+ } else {
507
+ const parts = post.split('---');
508
+ console.log(`Thread posts: ${parts.length}`);
509
+ parts.forEach((p, i) => console.log(` Post ${i + 1}: ${p.trim().length} chars`));
510
+ }
511
+
512
+ console.log('\nSelf-scoring...');
513
+ const score = selfScore(post, args.hook, args.brand);
514
+ console.log(`Score: ${score.total}/100`);
515
+ console.log(`Verdict: ${score.verdict}`);
516
+ if (score.reason) console.log(`Reason: ${score.reason}`);
517
+ if (score.hook_strength) console.log(` hook_strength: ${score.hook_strength}`);
518
+ if (score.voice_authenticity) console.log(` voice_authenticity: ${score.voice_authenticity}`);
519
+ if (score.specificity) console.log(` specificity: ${score.specificity}`);
520
+ if (score.value_density) console.log(` value_density: ${score.value_density}`);
521
+ if (score.algorithm_fit) console.log(` algorithm_fit: ${score.algorithm_fit}`);
522
+ console.log('='.repeat(50));
523
+
524
+ const out = `/tmp/xpost-${Date.now()}.txt`;
525
+ const metaOut = out.replace('.txt', '.json');
526
+ fs.writeFileSync(out, post);
527
+ fs.writeFileSync(metaOut, JSON.stringify({ post, hook: args.hook, topic: args.topic, brand: args.brand, format: isThread ? 'thread' : 'single', score }, null, 2));
528
+ console.log(`\nPost saved: ${out}`);
529
+ console.log(`Meta saved: ${metaOut}`);
530
+
531
+ if (score.verdict === 'REWRITE') {
532
+ console.log('\n⚠ Self-score below threshold. Agent should run humanizer + quality-gate before presenting.');
533
+ process.exit(2);
534
+ }
535
+ }
536
+
537
+ main();