@jairodri/huckleberry-cli 1.0.2 → 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 +347 -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,192 @@
1
+ """Comprehensive roundtrip tests — dictionary, RLE, and combined must be perfectly reversible."""
2
+ import sys
3
+ import pytest
4
+ from pathlib import Path
5
+
6
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
7
+
8
+ from lib.dictionary import build_codebook, compress_text, decompress_text
9
+ from lib.rle import compress, decompress, compress_paths, decompress_paths, compress_ip_families, decompress_ip_families
10
+
11
+
12
+ class TestDictionaryRoundtrip:
13
+ """Dictionary compression must be perfectly reversible."""
14
+
15
+ @pytest.fixture
16
+ def codebook(self):
17
+ texts = [
18
+ "The server at 192.168.1.100 runs Python 3.11. "
19
+ "The server at 192.168.1.100 handles requests. "
20
+ "Python 3.11 is the main runtime. "
21
+ "The workspace at /Users/duke/workspace contains files. "
22
+ "/Users/duke/workspace has memory files.",
23
+ ]
24
+ return build_codebook(texts)
25
+
26
+ def test_basic_roundtrip(self, codebook):
27
+ original = "The server at 192.168.1.100 runs Python 3.11."
28
+ compressed = compress_text(original, codebook)
29
+ decompressed = decompress_text(compressed, codebook)
30
+ assert decompressed == original
31
+
32
+ def test_empty_roundtrip(self, codebook):
33
+ assert decompress_text(compress_text("", codebook), codebook) == ""
34
+
35
+ def test_no_matches_roundtrip(self, codebook):
36
+ original = "zzzz xxxx yyyy qqqq"
37
+ assert decompress_text(compress_text(original, codebook), codebook) == original
38
+
39
+ def test_unicode_roundtrip(self, codebook):
40
+ original = "中文 192.168.1.100 日本語 Python 3.11"
41
+ compressed = compress_text(original, codebook)
42
+ assert decompress_text(compressed, codebook) == original
43
+
44
+ def test_multiline_roundtrip(self, codebook):
45
+ original = "Line 1: server at 192.168.1.100\nLine 2: Python 3.11\nLine 3: done"
46
+ compressed = compress_text(original, codebook)
47
+ assert decompress_text(compressed, codebook) == original
48
+
49
+ def test_special_chars_roundtrip(self, codebook):
50
+ original = "regex: [a-z]+ and $HOME and \\n and 192.168.1.100"
51
+ compressed = compress_text(original, codebook)
52
+ assert decompress_text(compressed, codebook) == original
53
+
54
+ def test_large_text_roundtrip(self, codebook):
55
+ original = ("The server at 192.168.1.100 runs Python 3.11. " * 100).strip()
56
+ compressed = compress_text(original, codebook)
57
+ assert decompress_text(compressed, codebook) == original
58
+
59
+ def test_codebook_codes_dont_collide(self, codebook):
60
+ """Codes in output shouldn't accidentally match other entries."""
61
+ original = "simple text with $AA literal dollar signs"
62
+ compressed = compress_text(original, codebook)
63
+ decompressed = decompress_text(compressed, codebook)
64
+ assert decompressed == original
65
+
66
+ def test_all_entries_roundtrip(self, codebook):
67
+ """Each codebook entry individually roundtrips."""
68
+ for phrase, code in codebook.items():
69
+ compressed = compress_text(phrase, codebook)
70
+ decompressed = decompress_text(compressed, codebook)
71
+ assert decompressed == phrase, f"Failed for: {phrase}"
72
+
73
+ def test_repeated_compression_stable(self, codebook):
74
+ """Compressing already-compressed text then decompressing should work."""
75
+ original = "The server at 192.168.1.100 runs Python 3.11."
76
+ c1 = compress_text(original, codebook)
77
+ # Decompress should always get back to original
78
+ assert decompress_text(c1, codebook) == original
79
+
80
+
81
+ class TestRLERoundtrip:
82
+ """RLE/path compression must be reversible."""
83
+
84
+ def test_path_roundtrip(self):
85
+ ws = "/Users/duke/workspace"
86
+ original = f"File at {ws}/memory/test.md and {ws}/TOOLS.md"
87
+ compressed = compress_paths(original, [ws])
88
+ decompressed = decompress_paths(compressed, ws)
89
+ assert decompressed == original
90
+
91
+ def test_path_no_match(self):
92
+ ws = "/Users/duke/workspace"
93
+ original = "No paths here at all"
94
+ compressed = compress_paths(original, [ws])
95
+ decompressed = decompress_paths(compressed, ws)
96
+ assert decompressed == original
97
+
98
+ def test_path_empty(self):
99
+ ws = "/Users/duke/workspace"
100
+ assert decompress_paths(compress_paths("", [ws]), ws) == ""
101
+
102
+ def test_ip_roundtrip(self):
103
+ original = "Server 192.168.1.100 and 192.168.1.200 and 192.168.1.50"
104
+ compressed, prefix_map = compress_ip_families(original)
105
+ decompressed = decompress_ip_families(compressed, prefix_map)
106
+ assert decompressed == original
107
+
108
+ def test_ip_no_families(self):
109
+ original = "No IPs here"
110
+ compressed, prefix_map = compress_ip_families(original)
111
+ decompressed = decompress_ip_families(compressed, prefix_map)
112
+ assert decompressed == original
113
+
114
+ def test_ip_single_occurrence(self):
115
+ original = "One IP: 10.0.0.1"
116
+ compressed, prefix_map = compress_ip_families(original)
117
+ decompressed = decompress_ip_families(compressed, prefix_map)
118
+ assert decompressed == original
119
+
120
+ def test_ip_empty(self):
121
+ compressed, prefix_map = compress_ip_families("")
122
+ assert decompress_ip_families(compressed, prefix_map) == ""
123
+
124
+ def test_mixed_content_roundtrip(self):
125
+ ws = "/Users/duke/workspace"
126
+ original = (
127
+ f"Server at 192.168.1.100 runs on {ws}/scripts/main.py.\n"
128
+ f"Backup at 192.168.1.200 uses {ws}/memory/backup.md.\n"
129
+ f"Another host 192.168.1.50 with {ws}/TOOLS.md"
130
+ )
131
+ # Path compression
132
+ p_compressed = compress_paths(original, [ws])
133
+ p_back = decompress_paths(p_compressed, ws)
134
+ assert p_back == original
135
+
136
+ # IP compression
137
+ i_compressed, ip_map = compress_ip_families(original)
138
+ i_back = decompress_ip_families(i_compressed, ip_map)
139
+ assert i_back == original
140
+
141
+
142
+ class TestCombinedRoundtrip:
143
+ """Combined dictionary + RLE roundtrip."""
144
+
145
+ def test_dict_then_rle_roundtrip(self):
146
+ texts = [
147
+ "Python 3.11 is great. Python 3.11 runs fast. Python 3.11 everywhere.",
148
+ ]
149
+ codebook = build_codebook(texts)
150
+ original = "Python 3.11 is used on all servers."
151
+
152
+ # Dict compress → RLE compress → RLE decompress → Dict decompress
153
+ dict_compressed = compress_text(original, codebook)
154
+ rle_compressed = compress_paths(dict_compressed, ["/Users/duke"])
155
+ rle_back = decompress_paths(rle_compressed, "/Users/duke")
156
+ dict_back = decompress_text(rle_back, codebook)
157
+ assert dict_back == original
158
+
159
+ def test_rle_then_dict_roundtrip(self):
160
+ ws = "/Users/duke/workspace"
161
+ texts = [f"{ws}/memory/test.md appears often. {ws}/memory/test.md again."]
162
+ codebook = build_codebook(texts)
163
+ original = f"Check {ws}/memory/test.md for details"
164
+
165
+ rle_compressed = compress_paths(original, [ws])
166
+ dict_compressed = compress_text(rle_compressed, codebook)
167
+ dict_back = decompress_text(dict_compressed, codebook)
168
+ rle_back = decompress_paths(dict_back, ws)
169
+ assert rle_back == original
170
+
171
+
172
+ class TestEdgeCaseRoundtrips:
173
+ def test_only_whitespace(self):
174
+ codebook = build_codebook(["a b c d e f"])
175
+ original = " \n\n\t "
176
+ assert decompress_text(compress_text(original, codebook), codebook) == original
177
+
178
+ def test_only_newlines(self):
179
+ codebook = build_codebook(["test test test"])
180
+ original = "\n\n\n"
181
+ assert decompress_text(compress_text(original, codebook), codebook) == original
182
+
183
+ def test_very_long_text(self):
184
+ base = "word " * 50
185
+ codebook = build_codebook([base] * 3)
186
+ original = base * 10
187
+ assert decompress_text(compress_text(original, codebook), codebook) == original
188
+
189
+ def test_binary_like_content(self):
190
+ codebook = build_codebook(["test test"])
191
+ original = "hex: 0xDEADBEEF 0xCAFEBABE"
192
+ assert decompress_text(compress_text(original, codebook), codebook) == original
@@ -0,0 +1,171 @@
1
+ """Comprehensive tests for generate_summary_tiers.py."""
2
+ import sys
3
+ import pytest
4
+ from pathlib import Path
5
+
6
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
7
+ from generate_summary_tiers import (
8
+ _classify_section, _find_memory_files, generate_tiers, format_human,
9
+ extract_key_facts, generate_auto_summary, format_tier_template, TIERS,
10
+ )
11
+
12
+
13
+ class TestClassifySection:
14
+ def test_decision(self):
15
+ assert _classify_section("Important Decisions") >= 8
16
+
17
+ def test_action(self):
18
+ assert _classify_section("Action Items") >= 7
19
+
20
+ def test_config(self):
21
+ assert _classify_section("Configuration Setup") >= 6
22
+
23
+ def test_notes(self):
24
+ assert _classify_section("Random Notes") >= 3
25
+
26
+ def test_history(self):
27
+ assert _classify_section("History Log") >= 1
28
+
29
+ def test_unknown(self):
30
+ result = _classify_section("zzzzzzzzzzz")
31
+ assert isinstance(result, int)
32
+
33
+ def test_empty(self):
34
+ result = _classify_section("")
35
+ assert isinstance(result, int)
36
+
37
+ def test_case_insensitive(self):
38
+ a = _classify_section("DECISION")
39
+ b = _classify_section("decision")
40
+ assert a == b
41
+
42
+
43
+ class TestFindMemoryFiles:
44
+ def test_finds_files(self, tmp_path):
45
+ (tmp_path / "MEMORY.md").write_text("memory")
46
+ (tmp_path / "TOOLS.md").write_text("tools")
47
+ mem = tmp_path / "memory"
48
+ mem.mkdir()
49
+ (mem / "daily.md").write_text("daily")
50
+ files = _find_memory_files(str(tmp_path))
51
+ assert len(files) >= 2
52
+
53
+ def test_empty_workspace(self, tmp_path):
54
+ files = _find_memory_files(str(tmp_path))
55
+ assert isinstance(files, list)
56
+
57
+ def test_nonexistent(self):
58
+ from lib.exceptions import FileNotFoundError_
59
+ with pytest.raises(FileNotFoundError_):
60
+ _find_memory_files("/nonexistent/xyz")
61
+
62
+
63
+ class TestGenerateTiers:
64
+ def test_basic(self, tmp_path):
65
+ (tmp_path / "MEMORY.md").write_text("# Memory\n## Decisions\n- Use Python\n## Notes\n- Hello\n")
66
+ files = [tmp_path / "MEMORY.md"]
67
+ result = generate_tiers(files)
68
+ assert isinstance(result, dict)
69
+
70
+ def test_returns_tier_info(self, tmp_path):
71
+ (tmp_path / "MEMORY.md").write_text("# M\n## A\nfoo\n## B\nbar\n")
72
+ files = [tmp_path / "MEMORY.md"]
73
+ result = generate_tiers(files)
74
+ assert "tiers" in result or "sections" in result
75
+
76
+ def test_empty_files(self, tmp_path):
77
+ (tmp_path / "empty.md").write_text("")
78
+ result = generate_tiers([tmp_path / "empty.md"])
79
+ assert isinstance(result, dict)
80
+
81
+ def test_multiple_files(self, tmp_path):
82
+ (tmp_path / "a.md").write_text("# A\nContent A\n")
83
+ (tmp_path / "b.md").write_text("# B\nContent B\n")
84
+ result = generate_tiers([tmp_path / "a.md", tmp_path / "b.md"])
85
+ assert isinstance(result, dict)
86
+
87
+
88
+ class TestFormatHuman:
89
+ def test_basic(self, tmp_path):
90
+ (tmp_path / "MEMORY.md").write_text("# Memory\n## Decisions\n- X\n")
91
+ files = [tmp_path / "MEMORY.md"]
92
+ result = generate_tiers(files)
93
+ output = format_human(result)
94
+ assert isinstance(output, str)
95
+ assert len(output) > 0
96
+
97
+ def test_mentions_levels(self, tmp_path):
98
+ (tmp_path / "MEMORY.md").write_text("# M\n## A\nfoo\n")
99
+ result = generate_tiers([tmp_path / "MEMORY.md"])
100
+ output = format_human(result)
101
+ assert "Level" in output or "level" in output
102
+
103
+
104
+ class TestExtractKeyFacts:
105
+ def test_basic(self):
106
+ text = "Server IP: 192.168.1.100\nPort: 8080\nSome filler text\nDecision: Use Python"
107
+ facts = extract_key_facts(text)
108
+ assert isinstance(facts, list)
109
+
110
+ def test_empty(self):
111
+ facts = extract_key_facts("")
112
+ assert facts == []
113
+
114
+ def test_bullets(self):
115
+ text = "- Important: use SSH keys\n- Note: backup at 3am\n- Random stuff"
116
+ facts = extract_key_facts(text)
117
+ assert isinstance(facts, list)
118
+
119
+ def test_preserves_key_info(self):
120
+ text = "Decision: migrate to Python 3.11\nAction: update CI pipeline"
121
+ facts = extract_key_facts(text)
122
+ assert len(facts) > 0
123
+
124
+
125
+ class TestGenerateAutoSummary:
126
+ def test_basic(self, tmp_path):
127
+ (tmp_path / "test.md").write_text("# Config\nServer: 192.168.1.100\nPort: 8080\nUser: admin\n")
128
+ summary = generate_auto_summary([tmp_path / "test.md"])
129
+ assert isinstance(summary, str)
130
+
131
+ def test_custom_budget(self, tmp_path):
132
+ (tmp_path / "test.md").write_text("# Test\nContent\n")
133
+ summary = generate_auto_summary([tmp_path / "test.md"], budget=50)
134
+ assert isinstance(summary, str)
135
+
136
+ def test_empty_file(self, tmp_path):
137
+ (tmp_path / "empty.md").write_text("")
138
+ summary = generate_auto_summary([tmp_path / "empty.md"])
139
+ assert isinstance(summary, str)
140
+
141
+
142
+ class TestTiersConfig:
143
+ def test_tier_0_exists(self):
144
+ assert 0 in TIERS
145
+ assert TIERS[0]["budget"] <= 300
146
+
147
+ def test_tier_1_exists(self):
148
+ assert 1 in TIERS
149
+ assert TIERS[1]["budget"] <= 1500
150
+
151
+ def test_tier_2_exists(self):
152
+ assert 2 in TIERS
153
+ assert TIERS[2]["budget"] <= 5000
154
+
155
+ def test_budgets_ascending(self):
156
+ assert TIERS[0]["budget"] < TIERS[1]["budget"] < TIERS[2]["budget"]
157
+
158
+
159
+ class TestFormatTierTemplate:
160
+ def test_basic(self, tmp_path):
161
+ (tmp_path / "test.md").write_text("# Test\n## Section\nContent\n")
162
+ result = generate_tiers([tmp_path / "test.md"])
163
+ template = format_tier_template(result, 0)
164
+ assert isinstance(template, str)
165
+
166
+ def test_all_tiers(self, tmp_path):
167
+ (tmp_path / "test.md").write_text("# Test\n## A\nfoo\n## B\nbar\n")
168
+ result = generate_tiers([tmp_path / "test.md"])
169
+ for level in [0, 1, 2]:
170
+ template = format_tier_template(result, level)
171
+ assert isinstance(template, str)
@@ -0,0 +1,237 @@
1
+ """Token Economics tests — precise verification of compression savings.
2
+
3
+ Inspired by claude-mem's rigorous token accounting approach.
4
+ Every compression technique must prove its token savings are real and measurable.
5
+ """
6
+
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ import pytest
11
+
12
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
13
+ from lib.tokens import estimate_tokens, using_tiktoken
14
+ from lib.dictionary import (
15
+ build_codebook, compress_text, decompress_text, compression_stats,
16
+ )
17
+ from lib.tokenizer_optimizer import (
18
+ optimize_tokens, estimate_savings, normalize_punctuation,
19
+ compress_table_to_kv, strip_bold_italic, compact_bullets,
20
+ )
21
+ from lib.rle import compress as rle_compress, compress_paths, compress_ip_families
22
+ from compressed_context import compress_with_stats
23
+
24
+
25
+ # --- Token Counting Precision ---
26
+
27
+ class TestTokenCountingPrecision:
28
+ """Verify estimate_tokens returns correct values for edge cases."""
29
+
30
+ def test_empty_returns_zero(self):
31
+ assert estimate_tokens("") == 0
32
+
33
+ def test_none_like_empty(self):
34
+ """Empty string should be 0, not 1 or error."""
35
+ assert estimate_tokens("") == 0
36
+
37
+ def test_single_char(self):
38
+ assert estimate_tokens("a") >= 1
39
+
40
+ def test_single_chinese_char(self):
41
+ assert estimate_tokens("你") >= 1
42
+
43
+ def test_whitespace_only(self):
44
+ result = estimate_tokens(" \n\n\t ")
45
+ assert result >= 1 # whitespace still has tokens
46
+
47
+ def test_large_content_positive(self):
48
+ """Large content should give proportionally large token count."""
49
+ small = estimate_tokens("hello world")
50
+ large = estimate_tokens("hello world " * 1000)
51
+ assert large > small * 500 # at least 500x more
52
+
53
+ def test_known_sentence(self):
54
+ """A known English sentence should give a reasonable count."""
55
+ text = "The quick brown fox jumps over the lazy dog."
56
+ tokens = estimate_tokens(text)
57
+ # tiktoken: ~10 tokens; heuristic: ~11
58
+ assert 8 <= tokens <= 15
59
+
60
+ def test_chinese_text_density(self):
61
+ """Chinese text should have ~1 token per 1-2 chars with tiktoken."""
62
+ text = "这是一个测试句子用来验证中文分词"
63
+ tokens = estimate_tokens(text)
64
+ if using_tiktoken():
65
+ # tiktoken: roughly 1 token per Chinese char
66
+ assert tokens >= len(text) * 0.3
67
+ assert tokens >= 1
68
+
69
+ def test_consistency(self):
70
+ """Same text should always give same count."""
71
+ text = "consistency test 一致性测试"
72
+ a = estimate_tokens(text)
73
+ b = estimate_tokens(text)
74
+ assert a == b
75
+
76
+
77
+ # --- Savings Calculation ---
78
+
79
+ class TestSavingsCalculation:
80
+ """Verify savings arithmetic is correct."""
81
+
82
+ def test_savings_is_before_minus_after(self):
83
+ original = "**Bold** text with ,Chinese,punctuation。here。"
84
+ optimized = optimize_tokens(original, aggressive=True)
85
+ stats = estimate_savings(original, optimized)
86
+ expected_saved = stats["original_tokens"] - stats["optimized_tokens"]
87
+ char_diff = stats["original_chars"] - stats["optimized_chars"]
88
+ assert char_diff >= 0 or stats["original_chars"] >= stats["optimized_chars"]
89
+ assert stats["token_reduction_pct"] == pytest.approx(
90
+ (stats["original_tokens"] - stats["optimized_tokens"]) / stats["original_tokens"] * 100,
91
+ abs=0.15,
92
+ )
93
+
94
+ def test_savings_zero_for_unchanged(self):
95
+ text = "plain text no changes"
96
+ optimized = optimize_tokens(text)
97
+ stats = estimate_savings(text, optimized)
98
+ assert stats["token_reduction_pct"] == 0.0 or stats["optimized_tokens"] <= stats["original_tokens"]
99
+
100
+ def test_negative_savings_possible(self):
101
+ """If compression adds overhead (e.g., codebook), net can be negative."""
102
+ # Tiny text with a big codebook
103
+ codebook = {f"${chr(65+i)}{chr(65+j)}": f"word{i}{j}" for i in range(5) for j in range(5)}
104
+ text = "unique text"
105
+ stats = compression_stats(text, text, codebook)
106
+ # Net reduction can be negative when codebook overhead > savings
107
+ assert "net_reduction_pct" in stats
108
+
109
+ def test_empty_original_savings(self):
110
+ stats = estimate_savings("", "")
111
+ assert stats["original_tokens"] == 0
112
+ assert stats["optimized_tokens"] == 0
113
+ assert stats["token_reduction_pct"] == 0.0
114
+
115
+ def test_rounding(self):
116
+ """Percentage should be rounded to 1 decimal place."""
117
+ stats = estimate_savings("a" * 100, "a" * 97)
118
+ pct = stats["token_reduction_pct"]
119
+ assert pct == round(pct, 1)
120
+
121
+
122
+ # --- Per-Technique Token Economics ---
123
+
124
+ class TestTableCompressionEconomics:
125
+ """Tables should save 40-70% tokens when converted to key:value."""
126
+
127
+ def test_2col_table_savings(self):
128
+ table = (
129
+ "| Key | Value |\n|-----|-------|\n"
130
+ "| Server | gateway-prod |\n"
131
+ "| IP | 192.168.1.1 |\n"
132
+ "| Port | 8080 |\n"
133
+ "| Status | running |\n"
134
+ "| Uptime | 42 days |"
135
+ )
136
+ before = estimate_tokens(table)
137
+ after = estimate_tokens(compress_table_to_kv(table))
138
+ savings_pct = (before - after) / before * 100
139
+ assert savings_pct > 30, f"Only {savings_pct:.1f}% savings on 2-col table"
140
+
141
+ def test_3col_table_savings(self):
142
+ table = (
143
+ "| Host | IP | Role |\n|------|-----|------|\n"
144
+ "| gw | 192.168.1.1 | gateway |\n"
145
+ "| n1 | 192.168.1.2 | worker |\n"
146
+ "| n2 | 192.168.1.3 | worker |"
147
+ )
148
+ before = estimate_tokens(table)
149
+ after = estimate_tokens(compress_table_to_kv(table))
150
+ assert after < before
151
+
152
+ def test_empty_table_no_crash(self):
153
+ table = "| A | B |\n|---|---|\n"
154
+ compress_table_to_kv(table) # Should not crash
155
+
156
+
157
+ class TestPunctuationEconomics:
158
+ """Each fullwidth → halfwidth saves ~1 token."""
159
+
160
+ def test_measurable_savings(self):
161
+ # Fullwidth punctuation in English-heavy context saves more
162
+ text = "IP:192.168.1.1,Port:8080,Status:online,Mode:active,Region:US"
163
+ before = estimate_tokens(text)
164
+ after = estimate_tokens(normalize_punctuation(text))
165
+ # Savings depend on tokenizer; at minimum should not increase
166
+ assert after <= before, f"Punctuation normalization increased tokens: {before} → {after}"
167
+
168
+
169
+ class TestDictionaryEconomics:
170
+ """Dictionary compression should show net savings on realistic data."""
171
+
172
+ def test_net_savings_positive(self):
173
+ """On text with enough repetition, net savings should be positive."""
174
+ texts = [
175
+ "The gateway at 10.0.1.1 serves example_user workspace.\n" * 3,
176
+ "Connect to 10.0.1.1 as example_user for deployment.\n" * 3,
177
+ "Node remote-node at 10.0.1.2 reports to 10.0.1.1 gateway.\n" * 3,
178
+ ]
179
+ cb = build_codebook(texts, min_freq=2)
180
+ if cb: # Only test if codebook was built
181
+ combined = '\n'.join(texts)
182
+ compressed = compress_text(combined, cb)
183
+ stats = compression_stats(combined, compressed, cb)
184
+ assert stats["gross_reduction_pct"] > 0
185
+
186
+ def test_tiny_text_overhead(self):
187
+ """On tiny text, codebook overhead may exceed savings."""
188
+ texts = ["short text here", "other short text"]
189
+ cb = build_codebook(texts, min_freq=1)
190
+ # Either empty codebook or overhead is acknowledged
191
+ if cb:
192
+ stats = compression_stats("short text", compress_text("short text", cb), cb)
193
+ # Net could be negative — that's expected and correct
194
+ assert "net_reduction_pct" in stats
195
+
196
+
197
+ class TestCompressedContextEconomics:
198
+ """CCP should reduce tokens on prose-heavy content."""
199
+
200
+ def test_ultra_reduces_prose(self):
201
+ prose = (
202
+ "Alex is the CTO of ExampleCorp and the founder of DataPlatform. "
203
+ "He has over 13 years of experience in cryptocurrency quantitative trading. "
204
+ "He is currently based in Los Gatos, California, with additional offices "
205
+ "in Shanghai and Taipei. The organization focuses on building infrastructure "
206
+ "for automated trading applications and monitoring systems."
207
+ )
208
+ stats = compress_with_stats(prose, "ultra")
209
+ assert stats["compressed_tokens"] < stats["original_tokens"]
210
+ text_savings_pct = (stats["original_tokens"] - stats["compressed_tokens"]) / stats["original_tokens"] * 100
211
+ assert text_savings_pct > 5, f"Only {text_savings_pct:.1f}% text reduction on prose"
212
+
213
+ def test_light_minimal_overhead(self):
214
+ text = "Simple clean text with no issues at all."
215
+ stats = compress_with_stats(text, "light")
216
+ # Light mode should barely change clean text
217
+ assert stats["compressed_tokens"] <= stats["original_tokens"] + 1
218
+
219
+
220
+ class TestRLEEconomics:
221
+ """RLE should save tokens on path-heavy and IP-heavy text."""
222
+
223
+ def test_path_compression_saves_tokens(self):
224
+ ws = "/home/user/workspace"
225
+ text = f"File at {ws}/memory/a.md\nAlso {ws}/TOOLS.md\nAnd {ws}/MEMORY.md\n"
226
+ before = estimate_tokens(text)
227
+ after = estimate_tokens(compress_paths(text, [ws]))
228
+ assert after < before
229
+ savings = before - after
230
+ assert savings >= 3, f"Only saved {savings} tokens on 3 path occurrences"
231
+
232
+ def test_ip_compression_saves_tokens(self):
233
+ text = "Servers: 10.0.1.1, 10.0.1.2, 10.0.1.3, 10.0.1.4"
234
+ before = estimate_tokens(text)
235
+ compressed, _ = compress_ip_families(text)
236
+ after = estimate_tokens(compressed)
237
+ assert after <= before