@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,520 @@
1
+ """compressors.py — Four compression strategies for the Engram Benchmark.
2
+
3
+ Strategies:
4
+ 1. EngramCompressor — LLM Observer + Reflector (Layer 6 Engram)
5
+ 2. RuleCompressor — claw-compactor Layers 1-5 (deterministic, no LLM)
6
+ 3. RandomDropCompressor — Random token drop (LLMLingua-2 baseline proxy)
7
+ 4. NoCompressor — Raw text, no compression (baseline)
8
+
9
+ Python 3.9+ / no external deps beyond stdlib.
10
+ EngramCompressor uses the proxy at http://localhost:8403.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import json
16
+ import logging
17
+ import os
18
+ import random
19
+ import re
20
+ import sys
21
+ import time
22
+ import urllib.error
23
+ import urllib.request
24
+ from pathlib import Path
25
+ from typing import Optional
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # Load .env from project root
29
+ # ---------------------------------------------------------------------------
30
+
31
+ def _load_env() -> None:
32
+ env_path = Path(__file__).parent.parent / ".env"
33
+ if env_path.exists():
34
+ for line in env_path.read_text().splitlines():
35
+ line = line.strip()
36
+ if line and not line.startswith("#") and "=" in line:
37
+ k, _, v = line.partition("=")
38
+ os.environ.setdefault(k.strip(), v.strip())
39
+
40
+ _load_env()
41
+
42
+ # ---------------------------------------------------------------------------
43
+ # Logging
44
+ # ---------------------------------------------------------------------------
45
+
46
+ logger = logging.getLogger(__name__)
47
+
48
+
49
+ # ---------------------------------------------------------------------------
50
+ # Base class
51
+ # ---------------------------------------------------------------------------
52
+
53
+ class BaseCompressor:
54
+ """Abstract base compressor."""
55
+
56
+ name: str = "base"
57
+
58
+ def compress(self, messages: list[dict]) -> tuple[str, int]:
59
+ """
60
+ Compress a list of messages.
61
+
62
+ Returns:
63
+ (compressed_text, llm_call_count)
64
+ """
65
+ raise NotImplementedError
66
+
67
+ @staticmethod
68
+ def _messages_to_text(messages: list[dict]) -> str:
69
+ """Flatten messages to readable text."""
70
+ parts = []
71
+ for m in messages:
72
+ role = m.get("role", "?").upper()
73
+ content = m.get("content", "")
74
+ ts = m.get("ts", "")
75
+ if ts:
76
+ parts.append(f"[{ts}] {role}: {content}")
77
+ else:
78
+ parts.append(f"{role}: {content}")
79
+ return "\n\n".join(parts)
80
+
81
+
82
+ # ---------------------------------------------------------------------------
83
+ # 1. NoCompressor — raw text baseline
84
+ # ---------------------------------------------------------------------------
85
+
86
+ class NoCompressor(BaseCompressor):
87
+ """No compression — returns raw conversation text."""
88
+
89
+ name = "NoCompression"
90
+
91
+ def compress(self, messages: list[dict]) -> tuple[str, int]:
92
+ return self._messages_to_text(messages), 0
93
+
94
+
95
+ # ---------------------------------------------------------------------------
96
+ # 2. RandomDropCompressor — simulates LLMLingua token-drop baseline
97
+ # ---------------------------------------------------------------------------
98
+
99
+ class RandomDropCompressor(BaseCompressor):
100
+ """
101
+ Random token drop compression — proxy for LLMLingua-2.
102
+
103
+ Randomly removes tokens to achieve a target compression ratio.
104
+ Preserves sentence boundaries (never drops period-ending words).
105
+ Uses a fixed seed for reproducibility.
106
+ """
107
+
108
+ name = "RandomDrop"
109
+
110
+ def __init__(self, target_ratio: float = 0.4, seed: int = 42):
111
+ """
112
+ Args:
113
+ target_ratio: fraction of tokens to KEEP (0.4 = keep 40%, drop 60%)
114
+ seed: random seed for reproducibility
115
+ """
116
+ self.target_ratio = target_ratio
117
+ self.seed = seed
118
+
119
+ def compress(self, messages: list[dict]) -> tuple[str, int]:
120
+ text = self._messages_to_text(messages)
121
+ rng = random.Random(self.seed)
122
+
123
+ # Preserve role headers like "[ts] USER:" by splitting into chunks
124
+ chunks = re.split(r"(\n\n)", text)
125
+ result_parts = []
126
+
127
+ for chunk in chunks:
128
+ if chunk == "\n\n":
129
+ result_parts.append(chunk)
130
+ continue
131
+
132
+ # Detect if this is a role header line — preserve it fully
133
+ lines = chunk.split("\n")
134
+ out_lines = []
135
+ for line in lines:
136
+ # Role header: preserve
137
+ if re.match(r"^(\[.+?\])?\s*(USER|ASSISTANT|SYSTEM)\s*:", line):
138
+ out_lines.append(line)
139
+ else:
140
+ # Token-level random drop
141
+ tokens = line.split()
142
+ if not tokens:
143
+ out_lines.append(line)
144
+ continue
145
+ kept = []
146
+ for i, tok in enumerate(tokens):
147
+ is_last = (i == len(tokens) - 1)
148
+ keep_prob = self.target_ratio
149
+ # Never drop sentence-ending tokens
150
+ if is_last or tok.endswith((".", "!", "?")):
151
+ keep_prob = 1.0
152
+ if rng.random() < keep_prob:
153
+ kept.append(tok)
154
+ out_lines.append(" ".join(kept))
155
+ result_parts.append("\n".join(out_lines))
156
+
157
+ return "".join(result_parts), 0
158
+
159
+
160
+ # ---------------------------------------------------------------------------
161
+ # 3. RuleCompressor — claw-compactor Layers 1-5
162
+ # ---------------------------------------------------------------------------
163
+
164
+ class RuleCompressor(BaseCompressor):
165
+ """
166
+ Rule-based compression using claw-compactor's deterministic pipeline.
167
+
168
+ Applies (in order):
169
+ Layer 1 — Chinese punctuation normalization, whitespace strip
170
+ Layer 2 — Duplicate line removal
171
+ Layer 3 — Repeated phrase/RLE compression
172
+ Layer 4 — Markdown redundancy strip (excess blank lines, trailing spaces)
173
+ Layer 5 — Abbreviation dictionary substitution (common tech terms)
174
+
175
+ Zero LLM calls. Pure deterministic text transformations.
176
+ """
177
+
178
+ name = "RuleCompressor"
179
+
180
+ # Abbreviation dictionary for common patterns in tech conversations
181
+ ABBREV = {
182
+ "Kubernetes": "K8s",
183
+ "kubernetes": "k8s",
184
+ "PostgreSQL": "PG",
185
+ "postgresql": "pg",
186
+ "JavaScript": "JS",
187
+ "javascript": "js",
188
+ "TypeScript": "TS",
189
+ "typescript": "ts",
190
+ "Docker Compose": "Compose",
191
+ "docker compose": "compose",
192
+ "machine learning": "ML",
193
+ "Machine Learning": "ML",
194
+ "deep learning": "DL",
195
+ "Deep Learning": "DL",
196
+ "infrastructure": "infra",
197
+ "Infrastructure": "Infra",
198
+ "configuration": "config",
199
+ "Configuration": "Config",
200
+ "environment": "env",
201
+ "Environment": "Env",
202
+ "authentication": "auth",
203
+ "Authentication": "Auth",
204
+ "authorization": "authz",
205
+ "Authorization": "Authz",
206
+ "database": "DB",
207
+ "Database": "DB",
208
+ "application": "app",
209
+ "Application": "App",
210
+ "microservices": "µsvc",
211
+ "Microservices": "µsvc",
212
+ "deployment": "deploy",
213
+ "Deployment": "Deploy",
214
+ "development": "dev",
215
+ "Development": "Dev",
216
+ "production": "prod",
217
+ "Production": "Prod",
218
+ "repository": "repo",
219
+ "Repository": "Repo",
220
+ "continuous integration": "CI",
221
+ "Continuous Integration": "CI",
222
+ "continuous deployment": "CD",
223
+ "Continuous Deployment": "CD",
224
+ }
225
+
226
+ def compress(self, messages: list[dict]) -> tuple[str, int]:
227
+ text = self._messages_to_text(messages)
228
+
229
+ # Layer 1: Normalize whitespace and Chinese punctuation
230
+ text = self._layer1_normalize(text)
231
+
232
+ # Layer 2: Remove duplicate lines
233
+ text = self._layer2_dedup_lines(text)
234
+
235
+ # Layer 3: RLE — compress repeated patterns
236
+ text = self._layer3_rle(text)
237
+
238
+ # Layer 4: Strip markdown redundancy
239
+ text = self._layer4_markdown_strip(text)
240
+
241
+ # Layer 5: Dictionary abbreviation substitution
242
+ text = self._layer5_abbreviate(text)
243
+
244
+ return text, 0
245
+
246
+ def _layer1_normalize(self, text: str) -> str:
247
+ """Normalize whitespace, strip trailing spaces per line."""
248
+ # Chinese full-width punctuation → ASCII
249
+ replacements = {
250
+ ",": ",", "。": ".", "!": "!", "?": "?",
251
+ ":": ":", ";": ";", "(": "(", ")": ")",
252
+ "【": "[", "】": "]", "—": "-", "…": "...",
253
+ "\u3000": " ", # ideographic space → regular space
254
+ }
255
+ for zh, en in replacements.items():
256
+ text = text.replace(zh, en)
257
+
258
+ # Strip trailing whitespace from each line
259
+ lines = [line.rstrip() for line in text.splitlines()]
260
+ # Collapse multiple consecutive blank lines to single blank line
261
+ result = []
262
+ blank_count = 0
263
+ for line in lines:
264
+ if line.strip() == "":
265
+ blank_count += 1
266
+ if blank_count <= 1:
267
+ result.append("")
268
+ else:
269
+ blank_count = 0
270
+ result.append(line)
271
+ return "\n".join(result)
272
+
273
+ def _layer2_dedup_lines(self, text: str) -> str:
274
+ """Remove exact duplicate lines, preserving order."""
275
+ seen: set[str] = set()
276
+ result = []
277
+ for line in text.splitlines():
278
+ key = line.strip()
279
+ if key in seen and len(key) > 20: # Only dedup non-trivial lines
280
+ continue
281
+ if key:
282
+ seen.add(key)
283
+ result.append(line)
284
+ return "\n".join(result)
285
+
286
+ def _layer3_rle(self, text: str) -> str:
287
+ """Compress repeated words/phrases using run-length encoding."""
288
+ # Compress repeated adjacent words: "very very very" → "very×3"
289
+ def replace_repeats(m: re.Match) -> str:
290
+ word = m.group(1)
291
+ count = len(m.group(0).split())
292
+ if count > 2:
293
+ return f"{word}×{count}"
294
+ return m.group(0)
295
+
296
+ # Match 3+ consecutive repetitions of the same word
297
+ text = re.sub(
298
+ r"\b(\w+)(?:\s+\1){2,}\b",
299
+ replace_repeats,
300
+ text,
301
+ flags=re.IGNORECASE,
302
+ )
303
+
304
+ # Collapse very long lines of dashes/equals (separators)
305
+ text = re.sub(r"[-=]{20,}", "---", text)
306
+
307
+ return text
308
+
309
+ def _layer4_markdown_strip(self, text: str) -> str:
310
+ """Remove markdown redundancy: excess blank lines, redundant headers."""
311
+ lines = text.splitlines()
312
+ result = []
313
+ prev_header = None
314
+
315
+ for line in lines:
316
+ stripped = line.strip()
317
+
318
+ # Skip duplicate adjacent headers
319
+ if stripped.startswith("#"):
320
+ if stripped == prev_header:
321
+ continue
322
+ prev_header = stripped
323
+ else:
324
+ if stripped:
325
+ prev_header = None
326
+
327
+ # Trim overly long code block output lines (keep first 120 chars)
328
+ if len(line) > 200 and not stripped.startswith("#"):
329
+ line = line[:200] + "…"
330
+
331
+ result.append(line)
332
+
333
+ return "\n".join(result)
334
+
335
+ def _layer5_abbreviate(self, text: str) -> str:
336
+ """Apply abbreviation dictionary substitution."""
337
+ for full, abbrev in self.ABBREV.items():
338
+ # Word-boundary aware replacement
339
+ text = re.sub(
340
+ r"\b" + re.escape(full) + r"\b",
341
+ abbrev,
342
+ text,
343
+ )
344
+ return text
345
+
346
+
347
+ # ---------------------------------------------------------------------------
348
+ # 4. EngramCompressor — LLM Observer + Reflector (Layer 6)
349
+ # ---------------------------------------------------------------------------
350
+
351
+ class EngramCompressor(BaseCompressor):
352
+ """
353
+ Engram Layer 6: LLM-driven Observer + Reflector compression.
354
+
355
+ - Observer: Converts raw messages into structured observation log
356
+ - Reflector: Distills observations into a concise long-term reflection
357
+
358
+ Uses the claw-compactor proxy at http://localhost:8403.
359
+ Model: claude-code/sonnet (configurable).
360
+ """
361
+
362
+ name = "Engram"
363
+
364
+ OBSERVER_SYSTEM = """\
365
+ You are the Observer Agent. Transform raw conversation messages into a structured, \
366
+ high-signal observation log.
367
+
368
+ Output format:
369
+ Date: YYYY-MM-DD
370
+ - 🔴 HH:MM <critical observation — key decisions, goals, blockers>
371
+ - 🟡 HH:MM <important detail — technical context, plans>
372
+ - 🟢 HH:MM <useful note — background info>
373
+
374
+ Rules:
375
+ - Achieve 4-8× token compression
376
+ - Preserve ALL critical (🔴) items
377
+ - Summarize code blocks (outcome, not full code)
378
+ - Output ONLY the observation log — no preamble
379
+ """
380
+
381
+ OBSERVER_USER_TEMPLATE = """\
382
+ Compress the following conversation into an observation log:
383
+
384
+ ---
385
+ {messages}
386
+ ---
387
+
388
+ Observation log:"""
389
+
390
+ REFLECTOR_SYSTEM = """\
391
+ You are the Reflector Agent. Distill a structured observation log into an even more \
392
+ concise long-term memory reflection.
393
+
394
+ Output: A single, dense markdown document with:
395
+ - ## Key Context (2-3 bullet points — the most critical facts)
396
+ - ## Active Tasks (what's in progress or planned)
397
+ - ## Technical Decisions (key architectural/config choices made)
398
+
399
+ Rules:
400
+ - Aim for 3-5× additional compression on top of the observation log
401
+ - Use key:value notation for technical settings
402
+ - Omit pleasantries, greetings, and filler entirely
403
+ - Output ONLY the reflection document
404
+ """
405
+
406
+ REFLECTOR_USER_TEMPLATE = """\
407
+ Distill this observation log into a long-term memory reflection:
408
+
409
+ ---
410
+ {observations}
411
+ ---
412
+
413
+ Reflection:"""
414
+
415
+ def __init__(
416
+ self,
417
+ base_url: str = "http://localhost:8403",
418
+ model: str = "claude-code/sonnet",
419
+ max_tokens: int = 2048,
420
+ timeout: int = 90,
421
+ use_reflector: bool = True,
422
+ ):
423
+ self.base_url = base_url.rstrip("/")
424
+ self.model = model
425
+ self.max_tokens = max_tokens
426
+ self.timeout = timeout
427
+ self.use_reflector = use_reflector
428
+ self._api_key = os.environ.get("OPENAI_API_KEY", "dummy-key")
429
+
430
+ def _call_llm(self, system: str, user: str) -> str:
431
+ """Make a single LLM call via the OpenAI-compatible proxy."""
432
+ payload = json.dumps({
433
+ "model": self.model,
434
+ "max_tokens": self.max_tokens,
435
+ "messages": [
436
+ {"role": "user", "content": f"{system}\n\n{user}"}
437
+ ],
438
+ }).encode("utf-8")
439
+
440
+ req = urllib.request.Request(
441
+ f"{self.base_url}/v1/chat/completions",
442
+ data=payload,
443
+ headers={
444
+ "Content-Type": "application/json",
445
+ "Authorization": f"Bearer {self._api_key}",
446
+ },
447
+ method="POST",
448
+ )
449
+
450
+ try:
451
+ with urllib.request.urlopen(req, timeout=self.timeout) as resp:
452
+ data = json.loads(resp.read().decode("utf-8"))
453
+ return data["choices"][0]["message"]["content"].strip()
454
+ except urllib.error.URLError as e:
455
+ logger.error(f"LLM call failed: {e}")
456
+ raise RuntimeError(f"LLM proxy unavailable: {e}") from e
457
+ except (KeyError, json.JSONDecodeError) as e:
458
+ logger.error(f"LLM response parse error: {e}")
459
+ raise RuntimeError(f"LLM response malformed: {e}") from e
460
+
461
+ def compress(self, messages: list[dict]) -> tuple[str, int]:
462
+ """
463
+ Two-stage compression:
464
+ 1. Observer: raw messages → observation log
465
+ 2. Reflector: observation log → final reflection (if use_reflector=True)
466
+
467
+ Returns (compressed_text, llm_call_count).
468
+ """
469
+ raw_text = self._messages_to_text(messages)
470
+ llm_calls = 0
471
+
472
+ # Stage 1: Observer
473
+ observer_prompt = self.OBSERVER_USER_TEMPLATE.format(messages=raw_text)
474
+ observations = self._call_llm(self.OBSERVER_SYSTEM, observer_prompt)
475
+ llm_calls += 1
476
+ logger.debug(f"Observer output ({len(observations)} chars)")
477
+
478
+ if not self.use_reflector:
479
+ return observations, llm_calls
480
+
481
+ # Stage 2: Reflector
482
+ reflector_prompt = self.REFLECTOR_USER_TEMPLATE.format(observations=observations)
483
+ reflection = self._call_llm(self.REFLECTOR_SYSTEM, reflector_prompt)
484
+ llm_calls += 1
485
+ logger.debug(f"Reflector output ({len(reflection)} chars)")
486
+
487
+ return reflection, llm_calls
488
+
489
+
490
+ # ---------------------------------------------------------------------------
491
+ # Factory
492
+ # ---------------------------------------------------------------------------
493
+
494
+ def get_all_compressors() -> list[BaseCompressor]:
495
+ """Return all four compressor instances for benchmarking."""
496
+ return [
497
+ NoCompressor(),
498
+ RandomDropCompressor(target_ratio=0.4, seed=42),
499
+ RuleCompressor(),
500
+ EngramCompressor(use_reflector=True),
501
+ ]
502
+
503
+
504
+ if __name__ == "__main__":
505
+ # Quick smoke test with tiny messages
506
+ test_messages = [
507
+ {"role": "user", "content": "How do I set up Docker Compose for PostgreSQL?", "ts": "2026-01-01T10:00:00Z"},
508
+ {"role": "assistant", "content": "Create a docker-compose.yml with the PostgreSQL service. Use volumes for data persistence and environment variables for the database configuration.", "ts": "2026-01-01T10:00:10Z"},
509
+ {"role": "user", "content": "What PostgreSQL version should I use?", "ts": "2026-01-01T10:01:00Z"},
510
+ {"role": "assistant", "content": "Use PostgreSQL 16 — it's the latest stable version with excellent performance improvements.", "ts": "2026-01-01T10:01:10Z"},
511
+ ]
512
+
513
+ print("Testing compressors (skipping Engram — requires LLM proxy):")
514
+ for cls in [NoCompressor, RandomDropCompressor, RuleCompressor]:
515
+ c = cls()
516
+ result, calls = c.compress(test_messages)
517
+ print(f"\n[{c.name}] ({len(result)} chars, {calls} LLM calls):")
518
+ print(result[:200])
519
+
520
+ print("\ncompressors.py smoke test passed ✓")
@@ -0,0 +1,82 @@
1
+ {
2
+ "session_id": "sample-01-devops",
3
+ "description": "DevOps troubleshooting session — Docker / CI pipeline",
4
+ "channel": "discord-tech",
5
+ "message_count": 60,
6
+ "messages": [
7
+ {"role": "user", "content": "Hey, our CI pipeline is failing on the docker build step. Getting 'no space left on device'.", "ts": "2026-03-01T09:01:00Z"},
8
+ {"role": "assistant", "content": "That's a classic Docker disk space issue. First, let's check available space: run `df -h` on your CI runner. Also, try `docker system df` to see how much space Docker is consuming.", "ts": "2026-03-01T09:01:15Z"},
9
+ {"role": "user", "content": "df -h shows /dev/sda1 at 98% used. docker system df shows 40GB in build cache.", "ts": "2026-03-01T09:02:00Z"},
10
+ {"role": "assistant", "content": "There's your problem. Run `docker builder prune -af` to clear the build cache, then `docker system prune -af --volumes` to remove unused containers, images, and volumes. This should free up 30-40GB.", "ts": "2026-03-01T09:02:20Z"},
11
+ {"role": "user", "content": "Ran both commands. Now at 45% disk usage. CI is green again. Thanks!", "ts": "2026-03-01T09:05:00Z"},
12
+ {"role": "assistant", "content": "Great! To prevent this recurring, consider adding a scheduled prune in your CI config. For GitHub Actions, you can add a weekly cron job. Also, look into layer caching strategies—BuildKit's inline cache can reduce image sizes significantly.", "ts": "2026-03-01T09:05:30Z"},
13
+ {"role": "user", "content": "We're using GitHub Actions. Can you show me a sample cron for weekly pruning?", "ts": "2026-03-01T09:06:00Z"},
14
+ {"role": "assistant", "content": "Sure, add this to your `.github/workflows/maintenance.yml`:\n\n```yaml\nname: Weekly Docker Cleanup\non:\n schedule:\n - cron: '0 2 * * 0'\njobs:\n cleanup:\n runs-on: self-hosted\n steps:\n - run: docker system prune -af --volumes\n```\n\nThis runs every Sunday at 2 AM.", "ts": "2026-03-01T09:06:45Z"},
15
+ {"role": "user", "content": "Added. Now let's talk about the next problem — our Postgres container keeps restarting.", "ts": "2026-03-01T09:10:00Z"},
16
+ {"role": "assistant", "content": "Check the container logs: `docker logs <container_name> --tail 100`. Also inspect with `docker inspect <container_name> | grep -A5 RestartPolicy`.", "ts": "2026-03-01T09:10:20Z"},
17
+ {"role": "user", "content": "Logs show: FATAL: could not write to file 'pg_wal/000000010000000000000001': No space left on device.", "ts": "2026-03-01T09:11:00Z"},
18
+ {"role": "assistant", "content": "Same root cause — disk space. But for Postgres specifically, WAL files can grow very large. You need to: 1) Free disk space (which you already did), 2) Consider enabling WAL archiving with a retention policy, 3) Check `max_wal_size` and `checkpoint_completion_target` settings.", "ts": "2026-03-01T09:11:30Z"},
19
+ {"role": "user", "content": "How do I set max_wal_size in the Docker compose config?", "ts": "2026-03-01T09:12:00Z"},
20
+ {"role": "assistant", "content": "In your `docker-compose.yml`, pass it as a command argument:\n\n```yaml\nservices:\n postgres:\n image: postgres:16\n command: postgres -c max_wal_size=512MB -c checkpoint_completion_target=0.9\n volumes:\n - pgdata:/var/lib/postgresql/data\nvolumes:\n pgdata:\n```", "ts": "2026-03-01T09:12:30Z"},
21
+ {"role": "user", "content": "Perfect. Applied and postgres is stable now. One more thing — our Redis is consuming too much memory.", "ts": "2026-03-01T09:20:00Z"},
22
+ {"role": "assistant", "content": "For Redis memory management, set `maxmemory` and an eviction policy. Add to your compose:\n\n```yaml\n redis:\n image: redis:7\n command: redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru\n```\n\n`allkeys-lru` evicts the least recently used keys when memory is full.", "ts": "2026-03-01T09:20:30Z"},
23
+ {"role": "user", "content": "Good idea. We're using Redis for session caching so LRU makes sense. What's the difference between allkeys-lru and volatile-lru?", "ts": "2026-03-01T09:21:00Z"},
24
+ {"role": "assistant", "content": "- `allkeys-lru`: Evicts any key (with or without TTL) using LRU. Best when all keys are cache entries.\n- `volatile-lru`: Only evicts keys that have a TTL set. Keys without TTL are never evicted. Use this when you have a mix of permanent data and ephemeral cache.", "ts": "2026-03-01T09:21:30Z"},
25
+ {"role": "user", "content": "We have some permanent config keys without TTL, so volatile-lru is better for us.", "ts": "2026-03-01T09:22:00Z"},
26
+ {"role": "assistant", "content": "Exactly right. Switch to `volatile-lru` and make sure your session cache keys always have an expiry set. This way your config keys are protected from eviction.", "ts": "2026-03-01T09:22:15Z"},
27
+ {"role": "user", "content": "Our deployment is on a 3-node Kubernetes cluster. Should we switch from Docker Compose to K8s manifests?", "ts": "2026-03-01T09:30:00Z"},
28
+ {"role": "assistant", "content": "For 3 nodes with stateful services (Postgres, Redis), it depends on your team's K8s expertise. Pros of migrating: rolling updates, self-healing, horizontal scaling. Cons: significantly more operational complexity for stateful workloads (need PersistentVolumes, StatefulSets). If your team is comfortable with K8s, go for it. Otherwise, consider using Docker Swarm as an intermediate step.", "ts": "2026-03-01T09:30:30Z"},
29
+ {"role": "user", "content": "Team is comfortable with K8s. We have a Helm chart setup. Can you outline a StatefulSet for Postgres?", "ts": "2026-03-01T09:31:00Z"},
30
+ {"role": "assistant", "content": "Here's a minimal StatefulSet for Postgres:\n\n```yaml\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: postgres\nspec:\n serviceName: postgres\n replicas: 1\n selector:\n matchLabels:\n app: postgres\n template:\n metadata:\n labels:\n app: postgres\n spec:\n containers:\n - name: postgres\n image: postgres:16\n env:\n - name: POSTGRES_PASSWORD\n valueFrom:\n secretKeyRef:\n name: postgres-secret\n key: password\n ports:\n - containerPort: 5432\n volumeMounts:\n - name: pgdata\n mountPath: /var/lib/postgresql/data\n volumeClaimTemplates:\n - metadata:\n name: pgdata\n spec:\n accessModes: [ReadWriteOnce]\n resources:\n requests:\n storage: 50Gi\n```", "ts": "2026-03-01T09:31:45Z"},
31
+ {"role": "user", "content": "Should we use Patroni for HA Postgres or rely on a managed RDS?", "ts": "2026-03-01T09:35:00Z"},
32
+ {"role": "assistant", "content": "For production HA: managed RDS (or Aurora) is strongly recommended unless you have dedicated DBA resources. Patroni is powerful but requires careful tuning, monitoring, and expertise. Managed services handle failover, backups, and patching automatically. Cost tradeoff: Patroni is cheaper at scale; RDS is operationally cheaper at small/medium scale.", "ts": "2026-03-01T09:35:30Z"},
33
+ {"role": "user", "content": "We're on AWS so RDS makes sense. Let's use Aurora PostgreSQL for HA.", "ts": "2026-03-01T09:36:00Z"},
34
+ {"role": "assistant", "content": "Good call. Aurora PostgreSQL with Multi-AZ gives you automatic failover in ~30 seconds. Make sure to: 1) Use a connection pooler like PgBouncer or RDS Proxy, 2) Configure your app to retry on transient connection errors, 3) Use the cluster endpoint (not instance endpoint) for writes.", "ts": "2026-03-01T09:36:30Z"},
35
+ {"role": "user", "content": "RDS Proxy vs PgBouncer — which is better for our use case?", "ts": "2026-03-01T09:37:00Z"},
36
+ {"role": "assistant", "content": "RDS Proxy: Fully managed, integrates with IAM/Secrets Manager, handles connection pooling automatically, costs ~$0.015/hr per vCPU. Best if you're already AWS-native and want zero-ops.\n\nPgBouncer: Open source, highly configurable, lower latency (runs in same VPC), more control over pool modes (session/transaction/statement). Best if you need fine-grained control or want to minimize AWS costs.", "ts": "2026-03-01T09:37:30Z"},
37
+ {"role": "user", "content": "We'll go with RDS Proxy for simplicity. Our app is Node.js with Sequelize ORM. Any specific config needed?", "ts": "2026-03-01T09:38:00Z"},
38
+ {"role": "assistant", "content": "For Sequelize + RDS Proxy, set `pool.max` to match your RDS Proxy max connections divided by number of app instances. Also disable `ssl: false` — RDS Proxy requires SSL. Example:\n\n```js\nconst sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASS, {\n host: process.env.RDS_PROXY_ENDPOINT,\n dialect: 'postgres',\n dialectOptions: { ssl: { rejectUnauthorized: false } },\n pool: { max: 10, min: 0, acquire: 30000, idle: 10000 }\n});\n```", "ts": "2026-03-01T09:38:45Z"},
39
+ {"role": "user", "content": "Great. Shifting topics — our CI takes 25 minutes to run. How can we speed it up?", "ts": "2026-03-01T09:45:00Z"},
40
+ {"role": "assistant", "content": "Common CI speedup strategies:\n1. **Layer caching**: Cache Docker layers and npm/pip dependencies between runs\n2. **Parallel jobs**: Split test suite into shards and run in parallel\n3. **Incremental builds**: Only build/test changed modules (monorepo tool like nx or turborepo)\n4. **Self-hosted runners**: 2-3x faster than GitHub-hosted runners for compute-heavy steps\n5. **Test optimization**: Mark slow tests, run fast unit tests first, integration tests conditionally", "ts": "2026-03-01T09:45:30Z"},
41
+ {"role": "user", "content": "We're using GitHub Actions with hosted runners. Our tests are Jest for frontend, pytest for backend.", "ts": "2026-03-01T09:46:00Z"},
42
+ {"role": "assistant", "content": "For your stack:\n\n**Frontend (Jest):** Use `--shard` flag: `jest --shard=1/3`, `jest --shard=2/3`, `jest --shard=3/3` in parallel matrix jobs.\n\n**Backend (pytest):** Use `pytest-xdist`: `pytest -n auto` runs tests in parallel across CPU cores. Also use `pytest-randomly` to catch order-dependent tests.\n\n**Caching:** Cache `node_modules` and Python virtualenv using `actions/cache` keyed on lockfile hash.", "ts": "2026-03-01T09:46:30Z"},
43
+ {"role": "user", "content": "How do we set up the matrix strategy for Jest sharding?", "ts": "2026-03-01T09:47:00Z"},
44
+ {"role": "assistant", "content": "```yaml\njobs:\n jest:\n strategy:\n matrix:\n shard: [1, 2, 3]\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-node@v4\n with:\n node-version: '20'\n cache: npm\n - run: npm ci\n - run: npx jest --shard=${{ matrix.shard }}/3 --ci\n```\n\nThis runs 3 shards in parallel, cutting test time by ~3x.", "ts": "2026-03-01T09:47:30Z"},
45
+ {"role": "user", "content": "Our pipeline went from 25 min to 9 min after these changes. Huge improvement!", "ts": "2026-03-01T09:55:00Z"},
46
+ {"role": "assistant", "content": "Excellent result! For further optimization, consider: GitHub Actions artifacts to share test results across shards, Codecov for coverage reporting, and eventually switching to self-hosted ARM runners which are faster and cheaper for Linux workloads.", "ts": "2026-03-01T09:55:30Z"},
47
+ {"role": "user", "content": "We're hitting rate limits on our external API calls during tests. How should we mock these?", "ts": "2026-03-01T10:00:00Z"},
48
+ {"role": "assistant", "content": "For API mocking in tests:\n\n**Jest**: Use `jest.mock()` or `msw` (Mock Service Worker) for realistic HTTP mocking. MSW intercepts requests at the network level.\n\n**pytest**: Use `responses` library or `respx` for httpx. Example:\n```python\n@responses.activate\ndef test_api_call():\n responses.add(responses.GET, 'https://api.example.com/data', json={'key': 'value'})\n result = my_api_client.get_data()\n assert result == {'key': 'value'}\n```\n\nFor integration tests that need real APIs, use test API keys with strict rate limits and run these in a separate, less-frequent job.", "ts": "2026-03-01T10:00:45Z"},
49
+ {"role": "user", "content": "Makes sense. We have a third-party payment API that's hard to mock — they have a sandbox environment.", "ts": "2026-03-01T10:01:00Z"},
50
+ {"role": "assistant", "content": "For payment APIs with sandbox: use environment-specific credentials. Set `PAYMENT_API_KEY=[REDACTED]` and `PAYMENT_API_URL=https://sandbox.payments.example.com` in your CI secrets. Add a separate `integration-payments` job that runs on schedule (daily or on merge to main) rather than every PR. This avoids rate limits while still testing the real integration.", "ts": "2026-03-01T10:01:30Z"},
51
+ {"role": "user", "content": "Good approach. Let me summarize what we've accomplished today: fixed disk space issue, tuned Postgres and Redis, planned K8s migration with Aurora, reduced CI time from 25 to 9 min.", "ts": "2026-03-01T10:10:00Z"},
52
+ {"role": "assistant", "content": "Great summary! Here's the action items list:\n1. ✅ Docker cleanup cron added\n2. ✅ Postgres max_wal_size tuned to 512MB\n3. ✅ Redis volatile-lru eviction configured\n4. 📋 Migrate to K8s + Aurora PostgreSQL (planned)\n5. ✅ CI sharding: 25min → 9min\n6. 📋 Set up MSW mocks for unit tests\n7. 📋 Create separate payment integration test job\n\nSolid devops session!", "ts": "2026-03-01T10:10:30Z"},
53
+ {"role": "user", "content": "One last thing — should we use Terraform or Pulumi for our infrastructure-as-code?", "ts": "2026-03-01T10:15:00Z"},
54
+ {"role": "assistant", "content": "Both are excellent. Key differences:\n\n**Terraform (HCL)**: Mature ecosystem, huge community, declarative syntax, provider support is unmatched. State management requires care (use Terraform Cloud or S3 backend). Best for teams that prefer a DSL.\n\n**Pulumi (TypeScript/Python/Go)**: Infrastructure as real code, better abstraction with loops/conditionals, same language as your app. Easier for developers, harder for non-programmers. Better for complex dynamic infrastructure.\n\nGiven your stack (Node.js + Python), Pulumi with TypeScript is a natural fit. But if you have existing Terraform experience or modules, stay with Terraform.", "ts": "2026-03-01T10:15:30Z"},
55
+ {"role": "user", "content": "Team uses TypeScript, so Pulumi sounds great. We'll evaluate it.", "ts": "2026-03-01T10:16:00Z"},
56
+ {"role": "assistant", "content": "Start with `pulumi new aws-typescript` and migrate one non-critical resource (like an S3 bucket or security group) to get familiar. Pulumi has a good import feature (`pulumi import`) to bring existing AWS resources under management without recreating them.", "ts": "2026-03-01T10:16:15Z"},
57
+ {"role": "user", "content": "Thanks for all the help today. Very productive session.", "ts": "2026-03-01T10:17:00Z"},
58
+ {"role": "assistant", "content": "Happy to help! You made great progress today. Good luck with the K8s migration and Pulumi evaluation.", "ts": "2026-03-01T10:17:10Z"},
59
+ {"role": "user", "content": "Quick follow-up: our Nginx config is causing 502s intermittently. proxy_pass to Node.js backend.", "ts": "2026-03-01T10:20:00Z"},
60
+ {"role": "assistant", "content": "502 Bad Gateway from Nginx → Node typically means: 1) Node.js crashed and isn't listening, 2) upstream keep-alive timeout mismatch, 3) Node.js response is too slow (proxy timeout). Check: `sudo nginx -t`, review `/var/log/nginx/error.log`, and verify Node process is running. Add `proxy_read_timeout 120s;` if it's a timeout issue.", "ts": "2026-03-01T10:20:30Z"},
61
+ {"role": "user", "content": "Error log shows: upstream prematurely closed connection while reading response header from upstream.", "ts": "2026-03-01T10:21:00Z"},
62
+ {"role": "assistant", "content": "That specific error means Node.js is closing the connection before Nginx reads the response — usually Node crashed (unhandled exception) or the event loop is blocked. Enable PM2 for process management: `pm2 start app.js --instances max` (uses all CPU cores). PM2 auto-restarts on crash and provides memory leak protection.", "ts": "2026-03-01T10:21:30Z"},
63
+ {"role": "user", "content": "We're already using PM2. Logs show 'JavaScript heap out of memory'.", "ts": "2026-03-01T10:22:00Z"},
64
+ {"role": "assistant", "content": "Memory leak in Node.js. Short-term: increase heap: `node --max-old-space-size=4096 app.js`. Long-term: profile with `node --inspect` + Chrome DevTools, or use `clinic.js`: `npx clinic heap -- node app.js`. Common causes: event listener leaks, unclosed database connections, large in-memory caches.", "ts": "2026-03-01T10:22:30Z"},
65
+ {"role": "user", "content": "We're using clinic.js. Found a memory leak in our WebSocket event listeners — not cleaning up on disconnect.", "ts": "2026-03-01T10:25:00Z"},
66
+ {"role": "assistant", "content": "Classic WebSocket memory leak! Always remove listeners on disconnect:\n\n```js\nio.on('connection', (socket) => {\n const handler = (data) => processData(data);\n socket.on('message', handler);\n \n socket.on('disconnect', () => {\n socket.off('message', handler); // explicit cleanup\n // also close any db connections, clear timers\n });\n});\n```\n\nAlso check for setInterval/setTimeout that reference socket — they prevent GC.", "ts": "2026-03-01T10:25:30Z"},
67
+ {"role": "user", "content": "Fixed! Memory stable at 180MB now (was growing to 2GB over 12 hours). Great detective work.", "ts": "2026-03-01T10:26:00Z"},
68
+ {"role": "assistant", "content": "Excellent! WebSocket listener leaks are subtle but devastating. Add a memory usage monitor to your PM2 config: set `max_memory_restart` to 1GB as a safety net even after the fix.", "ts": "2026-03-01T10:26:15Z"},
69
+ {"role": "user", "content": "Will do. Can you also help with setting up centralized logging?", "ts": "2026-03-01T10:30:00Z"},
70
+ {"role": "assistant", "content": "For centralized logging on AWS, the standard stack is:\n1. **Application → CloudWatch Logs** via AWS SDK or Fluentd/Fluentbit\n2. **CloudWatch Log Insights** for ad-hoc queries\n3. **OpenSearch** (Elasticsearch) for full-text search and Kibana dashboards\n4. **Grafana** + Loki as a lighter-weight alternative\n\nFor your Node.js app, use `winston` with `winston-cloudwatch` transport. For K8s, deploy Fluentbit as a DaemonSet to ship all pod logs automatically.", "ts": "2026-03-01T10:30:30Z"},
71
+ {"role": "user", "content": "We'll go with CloudWatch + Grafana. Our team already uses Grafana for metrics.", "ts": "2026-03-01T10:31:00Z"},
72
+ {"role": "assistant", "content": "Smart choice for consistency. Use Grafana's CloudWatch datasource plugin — it can query both CloudWatch Metrics and Logs. Create a unified dashboard with metrics (CPU, memory, request latency) and logs side by side. Set up alerting rules in Grafana to fire to your on-call channel.", "ts": "2026-03-01T10:31:30Z"},
73
+ {"role": "user", "content": "We use PagerDuty for on-call. Does Grafana integrate?", "ts": "2026-03-01T10:32:00Z"},
74
+ {"role": "assistant", "content": "Yes, Grafana has a native PagerDuty contact point. In Alerting → Contact Points → Add PagerDuty, enter your integration key. You can route different severity alerts to different PD services (P1 for infra, P2 for app errors). Combine with Grafana's notification policies for fine-grained routing.", "ts": "2026-03-01T10:32:30Z"},
75
+ {"role": "user", "content": "Perfect. I think we have a solid infrastructure roadmap now. Thanks again!", "ts": "2026-03-01T10:33:00Z"},
76
+ {"role": "assistant", "content": "You've got a great setup taking shape. To recap the infrastructure roadmap: K8s + Aurora for DB HA, Pulumi for IaC, CloudWatch + Grafana + PagerDuty for observability. Good luck with the rollout!", "ts": "2026-03-01T10:33:15Z"},
77
+ {"role": "user", "content": "Monitoring question: what's a good SLO to aim for for a B2B SaaS product?", "ts": "2026-03-01T10:35:00Z"},
78
+ {"role": "assistant", "content": "Standard B2B SaaS SLOs:\n- **Availability**: 99.9% (three nines) = 8.7 hours downtime/year. Start here.\n- **Latency p95**: < 500ms for API, < 3s for page load\n- **Error rate**: < 0.1% of requests result in 5xx\n- **Throughput**: Define based on your peak load + 50% headroom\n\nTrack SLOs with error budgets: if you breach 99.9%, freeze new feature deploys until reliability improves.", "ts": "2026-03-01T10:35:30Z"},
79
+ {"role": "user", "content": "We'll target 99.9% uptime. Thanks for the comprehensive session!", "ts": "2026-03-01T10:36:00Z"},
80
+ {"role": "assistant", "content": "99.9% is a solid, achievable target. Build your error budget policy before you need it. Great session today — a lot accomplished!", "ts": "2026-03-01T10:36:10Z"}
81
+ ]
82
+ }