@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.
- package/README.md +85 -0
- package/agents/cos.json +2 -5
- package/agents/hermes/AGENTS.md +25 -49
- package/agents/hermes/fix-kimaki/SKILL.md +19 -92
- package/agents/hermes/hermes-fixer.md +44 -74
- package/agents/hermes.json +6 -18
- package/kanban/SKILL.md +18 -18
- package/kanban/package.json +1 -1
- package/kanban/src/dispatcher.mjs +1 -1
- package/kanban/templates/blog-social-campaign.yaml +6 -2
- package/kanban/templates/social-campaign.yaml +9 -4
- package/mcp/jev-calibration.mjs +335 -0
- package/mcp/jev-client.mjs +119 -0
- package/mcp/jev-thresholds.json +27 -0
- package/package.json +13 -9
- package/scripts/doctor-watchdog.sh +73 -0
- package/scripts/install-services.sh +34 -27
- package/scripts/self-improve-weekly.sh +34 -0
- package/scripts/sync-skills.mjs +121 -0
- package/skills/ab-test-setup/SKILL.md +266 -0
- package/skills/ab-test-setup/evals/evals.json +105 -0
- package/skills/ab-test-setup/references/sample-size-guide.md +263 -0
- package/skills/ab-test-setup/references/test-templates.md +277 -0
- package/skills/agent-reach/SKILL.md +132 -0
- package/skills/agent-reach/references/career.md +29 -0
- package/skills/agent-reach/references/dev.md +62 -0
- package/skills/agent-reach/references/search.md +33 -0
- package/skills/agent-reach/references/social.md +232 -0
- package/skills/agent-reach/references/video.md +130 -0
- package/skills/agent-reach/references/web.md +50 -0
- package/skills/ai-agent-seo/SKILL.md +450 -0
- package/skills/ai-cold-email-intelligence/SKILL.md +54 -0
- package/skills/ai-cold-email-intelligence/references/prompts.md +21 -0
- package/skills/ai-consensus-builder/SKILL.md +324 -0
- package/skills/ai-seo/SKILL.md +399 -0
- package/skills/ai-seo/evals/evals.json +90 -0
- package/skills/ai-seo/references/content-patterns.md +284 -0
- package/skills/ai-seo/references/platform-ranking-factors.md +152 -0
- package/skills/ai-visibility-audit/SKILL.md +322 -0
- package/skills/analytics-tracking/SKILL.md +309 -0
- package/skills/analytics-tracking/evals/evals.json +90 -0
- package/skills/analytics-tracking/references/event-library.md +260 -0
- package/skills/analytics-tracking/references/ga4-implementation.md +300 -0
- package/skills/analytics-tracking/references/gtm-implementation.md +390 -0
- package/skills/article-generator/SKILL.md +216 -0
- package/skills/auto-indexing/SKILL.md +179 -0
- package/skills/auto-indexing/scripts/auto-indexing.js +257 -0
- package/skills/auto-skill/SKILL.md +151 -0
- package/skills/auto-skill/correction-queue.js +102 -0
- package/skills/auto-skill/dedup.js +97 -0
- package/skills/auto-skill/skill-router.js +224 -0
- package/skills/autoresearch/SKILL.md +334 -0
- package/skills/autoresearch/autoresearch-autoresearch/SKILL.md.baseline +329 -0
- package/skills/autoresearch/autoresearch-autoresearch/changelog.md +34 -0
- package/skills/autoresearch/autoresearch-autoresearch/dashboard.html +116 -0
- package/skills/autoresearch/autoresearch-autoresearch/evals.md +39 -0
- package/skills/autoresearch/autoresearch-autoresearch/results.json +44 -0
- package/skills/autoresearch/autoresearch-autoresearch/results.tsv +3 -0
- package/skills/autoresearch/eval-guide.md +121 -0
- package/skills/b2b-cold-outreach/SKILL.md +322 -0
- package/skills/birdclaw/SKILL.md +82 -0
- package/skills/brainstorm/SKILL.md +168 -0
- package/skills/brand-kit-playground/SKILL.md +312 -0
- package/skills/brand-kit-playground/references/html-architecture.md +316 -0
- package/skills/brand-kit-playground/references/steal-patterns.md +88 -0
- package/skills/brand-voice/SKILL.md +223 -0
- package/skills/brand-voice/references/honesty-as-positioning.md +60 -0
- package/skills/brand-voice/references/voice-modes.md +1158 -0
- package/skills/business-advisory-council/README.md +136 -0
- package/skills/business-advisory-council/SKILL.md +94 -0
- package/skills/business-advisory-council/business-advisory-council.py +492 -0
- package/skills/business-advisory-council/discord-components-decision.json +8 -0
- package/skills/business-advisory-council/examples/steve-conley-partnership.json +6 -0
- package/skills/business-advisory-council/steve-conley-call-brief.json +6 -0
- package/skills/churn-prevention/SKILL.md +305 -0
- package/skills/churn-prevention/evals/evals.json +93 -0
- package/skills/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/skills/churn-prevention/references/dunning-playbook.md +408 -0
- package/skills/claw-compactor/LICENSE +21 -0
- package/skills/claw-compactor/README.md +459 -0
- package/skills/claw-compactor/SKILL.md +329 -0
- package/skills/claw-compactor/benchmark/RESULTS.md +104 -0
- package/skills/claw-compactor/benchmark/__init__.py +1 -0
- package/skills/claw-compactor/benchmark/compressors.py +520 -0
- package/skills/claw-compactor/benchmark/data/sample_01_devops.json +82 -0
- package/skills/claw-compactor/benchmark/data/sample_02_trading.json +54 -0
- package/skills/claw-compactor/benchmark/data/sample_03_ml_short.json +38 -0
- package/skills/claw-compactor/benchmark/data/sample_04_mixed_long.json +318 -0
- package/skills/claw-compactor/benchmark/data/sample_05_sysadmin.json +56 -0
- package/skills/claw-compactor/benchmark/evaluate.py +278 -0
- package/skills/claw-compactor/benchmark/report.py +241 -0
- package/skills/claw-compactor/benchmark/results/benchmark_results.json +405 -0
- package/skills/claw-compactor/benchmark/run_benchmark.py +238 -0
- package/skills/claw-compactor/engram.yaml +49 -0
- package/skills/claw-compactor/proxy/README.md +87 -0
- package/skills/claw-compactor/proxy/dashboard.html +804 -0
- package/skills/claw-compactor/proxy/event-log.mjs +213 -0
- package/skills/claw-compactor/proxy/fair-queue.mjs +288 -0
- package/skills/claw-compactor/proxy/metrics-store.mjs +425 -0
- package/skills/claw-compactor/proxy/package-lock.json +125 -0
- package/skills/claw-compactor/proxy/package.json +15 -0
- package/skills/claw-compactor/proxy/portal.html +360 -0
- package/skills/claw-compactor/proxy/process-registry.mjs +447 -0
- package/skills/claw-compactor/proxy/rate-limiter.mjs +117 -0
- package/skills/claw-compactor/proxy/redis-client.mjs +75 -0
- package/skills/claw-compactor/proxy/retry.mjs +182 -0
- package/skills/claw-compactor/proxy/server.mjs +2100 -0
- package/skills/claw-compactor/proxy/session-affinity.mjs +177 -0
- package/skills/claw-compactor/proxy/start.sh +23 -0
- package/skills/claw-compactor/proxy/test/event-log.test.mjs +237 -0
- package/skills/claw-compactor/proxy/test/helpers.mjs +103 -0
- package/skills/claw-compactor/proxy/test/integration.test.mjs +297 -0
- package/skills/claw-compactor/proxy/test/metrics-store.test.mjs +243 -0
- package/skills/claw-compactor/proxy/test/process-registry.test.mjs +390 -0
- package/skills/claw-compactor/proxy/test/rate-limiter.test.mjs +121 -0
- package/skills/claw-compactor/proxy/test/redis-client.test.mjs +62 -0
- package/skills/claw-compactor/proxy/test/token-tracker.test.mjs +200 -0
- package/skills/claw-compactor/proxy/token-tracker.mjs +482 -0
- package/skills/claw-compactor/pyproject.toml +26 -0
- package/skills/claw-compactor/references/README.md +44 -0
- package/skills/claw-compactor/references/architecture.md +197 -0
- package/skills/claw-compactor/references/benchmarks.md +94 -0
- package/skills/claw-compactor/references/compression-prompts.md +39 -0
- package/skills/claw-compactor/references/compression-techniques.md +219 -0
- package/skills/claw-compactor/references/testing.md +160 -0
- package/skills/claw-compactor/scripts/audit_memory.py +216 -0
- package/skills/claw-compactor/scripts/compress_memory.py +236 -0
- package/skills/claw-compactor/scripts/compressed_context.py +280 -0
- package/skills/claw-compactor/scripts/dedup_memory.py +147 -0
- package/skills/claw-compactor/scripts/dictionary_compress.py +170 -0
- package/skills/claw-compactor/scripts/engram-auto.sh +152 -0
- package/skills/claw-compactor/scripts/engram_auto.py +695 -0
- package/skills/claw-compactor/scripts/engram_cli.py +474 -0
- package/skills/claw-compactor/scripts/estimate_tokens.py +131 -0
- package/skills/claw-compactor/scripts/generate_summary_tiers.py +292 -0
- package/skills/claw-compactor/scripts/lib/__init__.py +34 -0
- package/skills/claw-compactor/scripts/lib/config.py +289 -0
- package/skills/claw-compactor/scripts/lib/dedup.py +119 -0
- package/skills/claw-compactor/scripts/lib/dictionary.py +281 -0
- package/skills/claw-compactor/scripts/lib/engram.py +793 -0
- package/skills/claw-compactor/scripts/lib/engram_prompts.py +175 -0
- package/skills/claw-compactor/scripts/lib/engram_storage.py +254 -0
- package/skills/claw-compactor/scripts/lib/exceptions.py +24 -0
- package/skills/claw-compactor/scripts/lib/markdown.py +312 -0
- package/skills/claw-compactor/scripts/lib/rle.py +165 -0
- package/skills/claw-compactor/scripts/lib/tokenizer_optimizer.py +188 -0
- package/skills/claw-compactor/scripts/lib/tokens.py +68 -0
- package/skills/claw-compactor/scripts/mem_compress.py +788 -0
- package/skills/claw-compactor/scripts/observation_compressor.py +346 -0
- package/skills/claw-compactor/tests/__init__.py +0 -0
- package/skills/claw-compactor/tests/conftest.py +94 -0
- package/skills/claw-compactor/tests/test_audit_comprehensive.py +123 -0
- package/skills/claw-compactor/tests/test_audit_memory.py +67 -0
- package/skills/claw-compactor/tests/test_benchmark.py +122 -0
- package/skills/claw-compactor/tests/test_cli_commands.py +228 -0
- package/skills/claw-compactor/tests/test_compress_memory.py +109 -0
- package/skills/claw-compactor/tests/test_compress_memory_comprehensive.py +191 -0
- package/skills/claw-compactor/tests/test_compressed_context.py +145 -0
- package/skills/claw-compactor/tests/test_config.py +54 -0
- package/skills/claw-compactor/tests/test_dedup_memory.py +124 -0
- package/skills/claw-compactor/tests/test_dictionary.py +327 -0
- package/skills/claw-compactor/tests/test_dictionary_comprehensive.py +241 -0
- package/skills/claw-compactor/tests/test_engram.py +1091 -0
- package/skills/claw-compactor/tests/test_engram_auto.py +529 -0
- package/skills/claw-compactor/tests/test_error_handling.py +194 -0
- package/skills/claw-compactor/tests/test_estimate_tokens.py +99 -0
- package/skills/claw-compactor/tests/test_generate_summary_tiers.py +105 -0
- package/skills/claw-compactor/tests/test_integration.py +249 -0
- package/skills/claw-compactor/tests/test_lib_dedup.py +135 -0
- package/skills/claw-compactor/tests/test_lib_markdown.py +388 -0
- package/skills/claw-compactor/tests/test_lib_tokens.py +82 -0
- package/skills/claw-compactor/tests/test_main_entry.py +176 -0
- package/skills/claw-compactor/tests/test_markdown_advanced.py +284 -0
- package/skills/claw-compactor/tests/test_new_features.py +77 -0
- package/skills/claw-compactor/tests/test_observation_comprehensive.py +261 -0
- package/skills/claw-compactor/tests/test_observation_compressor.py +128 -0
- package/skills/claw-compactor/tests/test_performance.py +172 -0
- package/skills/claw-compactor/tests/test_pipeline.py +109 -0
- package/skills/claw-compactor/tests/test_real_workspace.py +161 -0
- package/skills/claw-compactor/tests/test_rle.py +114 -0
- package/skills/claw-compactor/tests/test_rle_comprehensive.py +151 -0
- package/skills/claw-compactor/tests/test_roundtrip.py +253 -0
- package/skills/claw-compactor/tests/test_roundtrip_comprehensive.py +192 -0
- package/skills/claw-compactor/tests/test_tiers_comprehensive.py +171 -0
- package/skills/claw-compactor/tests/test_token_economics.py +237 -0
- package/skills/claw-compactor/tests/test_tokenizer_optimizer.py +175 -0
- package/skills/claw-compactor/tests/test_tokenizer_optimizer_comprehensive.py +241 -0
- package/skills/claw-compactor/tests/test_tokens.py +27 -0
- package/skills/cmo/CHANGELOG.md +61 -0
- package/skills/cmo/SKILL.md +500 -0
- package/skills/cmo/references/ai-slop-patterns.md +56 -0
- package/skills/cmo/references/analytics-guide.md +152 -0
- package/skills/cmo/references/ideas-library.md +197 -0
- package/skills/cmo/rules/brand-file-map.md +198 -0
- package/skills/cmo/rules/brand-memory.md +158 -0
- package/skills/cmo/rules/cli-runtime-index.md +95 -0
- package/skills/cmo/rules/command-reference.md +167 -0
- package/skills/cmo/rules/communication.md +15 -0
- package/skills/cmo/rules/context-switch.md +101 -0
- package/skills/cmo/rules/ecosystem.md +125 -0
- package/skills/cmo/rules/error-recovery.md +98 -0
- package/skills/cmo/rules/learning-loop.md +170 -0
- package/skills/cmo/rules/monorepo.md +78 -0
- package/skills/cmo/rules/output-format.md +124 -0
- package/skills/cmo/rules/persona.md +15 -0
- package/skills/cmo/rules/playbooks.md +327 -0
- package/skills/cmo/rules/progressive-enhancement.md +231 -0
- package/skills/cmo/rules/publish-index.md +106 -0
- package/skills/cmo/rules/quality-gate.md +90 -0
- package/skills/cmo/rules/recency-grounding.md +124 -0
- package/skills/cmo/rules/safety.md +80 -0
- package/skills/cmo/rules/studio-api-index.md +138 -0
- package/skills/cmo/rules/studio-integration.md +147 -0
- package/skills/cmo/rules/sub-agents.md +167 -0
- package/skills/cold-email/SKILL.md +240 -0
- package/skills/cold-email/evals/evals.json +94 -0
- package/skills/cold-email/references/benchmarks.md +83 -0
- package/skills/cold-email/references/follow-up-sequences.md +81 -0
- package/skills/cold-email/references/frameworks.md +90 -0
- package/skills/cold-email/references/personalization.md +79 -0
- package/skills/cold-email/references/subject-lines.md +53 -0
- package/skills/competitive-intel/SKILL.md +433 -0
- package/skills/competitive-intel/references/competitive-frameworks.md +145 -0
- package/skills/competitor-alternatives/SKILL.md +362 -0
- package/skills/competitor-alternatives/evals/evals.json +93 -0
- package/skills/competitor-alternatives/references/content-architecture.md +271 -0
- package/skills/competitor-alternatives/references/templates.md +223 -0
- package/skills/concreteness-fixer/SKILL.md +483 -0
- package/skills/concreteness-fixer/scripts/validation/concreteness-validator.js +221 -0
- package/skills/concreteness-fixer/utils/execFileNoThrow.js +16 -0
- package/skills/content-atomizer/SKILL.md +424 -0
- package/skills/content-atomizer/references/hook-strategies.md +56 -0
- package/skills/content-atomizer/references/platform-specs.md +118 -0
- package/skills/content-atomizer/references/platforms/bluesky.md +64 -0
- package/skills/content-atomizer/references/platforms/instagram.md +77 -0
- package/skills/content-atomizer/references/platforms/linkedin.md +120 -0
- package/skills/content-atomizer/references/platforms/reddit.md +73 -0
- package/skills/content-atomizer/references/platforms/threads.md +64 -0
- package/skills/content-atomizer/references/platforms/tiktok.md +55 -0
- package/skills/content-atomizer/references/platforms/twitter.md +123 -0
- package/skills/content-atomizer/references/platforms/youtube.md +56 -0
- package/skills/content-atomizer/references/tweet-patterns.md +40 -0
- package/skills/content-repost-manager/SKILL.md +245 -0
- package/skills/content-repost-manager/scripts/content-repost-scan.py +133 -0
- package/skills/context-recovery/.clawdhub/origin.json +7 -0
- package/skills/context-recovery/SKILL.md +198 -0
- package/skills/context-recovery/_meta.json +6 -0
- package/skills/conversion-flow-cro/SKILL.md +248 -0
- package/skills/conversion-flow-cro/references/flow-benchmarks.md +158 -0
- package/skills/copy-editing/SKILL.md +474 -0
- package/skills/copy-editing/evals/evals.json +89 -0
- package/skills/copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/copywriting/SKILL.md +349 -0
- package/skills/copywriting/evals/evals.json +111 -0
- package/skills/copywriting/references/awareness-level-guide.md +227 -0
- package/skills/copywriting/references/copy-frameworks.md +389 -0
- package/skills/copywriting/references/natural-transitions.md +272 -0
- package/skills/creative/SKILL.md +365 -0
- package/skills/creative/modes/ad-creative.md +1748 -0
- package/skills/creative/modes/product-photo.md +1520 -0
- package/skills/creative/modes/product-video.md +1657 -0
- package/skills/creative/modes/social-graphics.md +1511 -0
- package/skills/creative/modes/talking-head.md +2208 -0
- package/skills/creative/references/VISUAL_INTELLIGENCE.md +1233 -0
- package/skills/deep-serp-article/SKILL.md +677 -0
- package/skills/deep-serp-article/SKILL.md.bak +530 -0
- package/skills/earned-media/SKILL.md +260 -0
- package/skills/email-sequences/SKILL.md +446 -0
- package/skills/email-sequences/references/sequence-templates.md +1217 -0
- package/skills/firecrawl/.skill-meta.json +13 -0
- package/skills/firecrawl/SKILL.md +154 -0
- package/skills/firecrawl/rules/install.md +63 -0
- package/skills/firecrawl/rules/security.md +26 -0
- package/skills/form-cro/SKILL.md +429 -0
- package/skills/form-cro/evals/evals.json +90 -0
- package/skills/free-tool-strategy/SKILL.md +325 -0
- package/skills/free-tool-strategy/evals/evals.json +90 -0
- package/skills/free-tool-strategy/references/tool-types.md +253 -0
- package/skills/frontend-slides/SKILL.md +248 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +347 -0
- package/skills/frontend-slides/animation-patterns.md +110 -0
- package/skills/frontend-slides/html-template.md +347 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/guardrail-framework/SKILL.md +319 -0
- package/skills/hook-generator/SKILL.md +438 -0
- package/skills/hook-generator/database/2026-PLATFORM-RESEARCH.md +211 -0
- package/skills/hook-generator/database/instagram-hooks.json +591 -0
- package/skills/hook-generator/database/linkedin-hooks.json +502 -0
- package/skills/hook-generator/database/medium-hooks.json +181 -0
- package/skills/hook-generator/database/tiktok-hooks.json +337 -0
- package/skills/hook-generator/database/twitter-hooks.json +567 -0
- package/skills/hook-generator/database/youtube-hooks.json +275 -0
- package/skills/hook-generator/package-lock.json +24 -0
- package/skills/hook-generator/package.json +5 -0
- package/skills/hook-generator/references/hook-generation-system.md +257 -0
- package/skills/hook-generator/references/hook-performance-analysis.json +153 -0
- package/skills/hook-generator/references/hooks-library.md +128 -0
- package/skills/hook-generator/references/platform-hook-frameworks.md +275 -0
- package/skills/hook-generator/scripts/generate-hooks-unified.js +722 -0
- package/skills/hook-generator/scripts/generate-hooks.js +225 -0
- package/skills/hook-generator/scripts/generate.sh +36 -0
- package/skills/hook-generator/scripts/ralph-hook-enhancer.js +864 -0
- package/skills/hook-generator/scripts/test-gemini-output.js +51 -0
- package/skills/humanizer/README.md +120 -0
- package/skills/humanizer/SKILL.md +699 -0
- package/skills/image-gen/SKILL.md +277 -0
- package/skills/image-gen/references/prompt-patterns.md +114 -0
- package/skills/image-gen/references/visual-metaphors.md +51 -0
- package/skills/impeccable/SKILL.md +86 -0
- package/skills/impeccable/reference/adapt.md +312 -0
- package/skills/impeccable/reference/adapt.native.md +58 -0
- package/skills/impeccable/reference/android.md +40 -0
- package/skills/impeccable/reference/animate.md +86 -0
- package/skills/impeccable/reference/audit.md +136 -0
- package/skills/impeccable/reference/audit.native.md +139 -0
- package/skills/impeccable/reference/bolder.md +31 -0
- package/skills/impeccable/reference/clarify.md +94 -0
- package/skills/impeccable/reference/colorize.md +86 -0
- package/skills/impeccable/reference/craft-floor.md +42 -0
- package/skills/impeccable/reference/craft.md +5 -0
- package/skills/impeccable/reference/critique.md +788 -0
- package/skills/impeccable/reference/degraded/asset-producer.md +90 -0
- package/skills/impeccable/reference/degraded/documenter.md +24 -0
- package/skills/impeccable/reference/degraded/finish-reviewer.md +37 -0
- package/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/skills/impeccable/reference/delight.md +70 -0
- package/skills/impeccable/reference/distill.md +111 -0
- package/skills/impeccable/reference/doctor.md +53 -0
- package/skills/impeccable/reference/document.md +416 -0
- package/skills/impeccable/reference/extract.md +69 -0
- package/skills/impeccable/reference/harden.md +336 -0
- package/skills/impeccable/reference/hooks.md +105 -0
- package/skills/impeccable/reference/init.md +125 -0
- package/skills/impeccable/reference/ios.md +45 -0
- package/skills/impeccable/reference/layout.md +84 -0
- package/skills/impeccable/reference/live-setup.md +102 -0
- package/skills/impeccable/reference/live.md +323 -0
- package/skills/impeccable/reference/new-work.md +110 -0
- package/skills/impeccable/reference/onboard.md +234 -0
- package/skills/impeccable/reference/operate.md +61 -0
- package/skills/impeccable/reference/optimize.md +258 -0
- package/skills/impeccable/reference/overdrive.md +127 -0
- package/skills/impeccable/reference/polish.md +97 -0
- package/skills/impeccable/reference/quieter.md +99 -0
- package/skills/impeccable/reference/routing.md +18 -0
- package/skills/impeccable/reference/shape.md +59 -0
- package/skills/impeccable/reference/typeset.md +80 -0
- package/skills/impeccable/reference/visualize.md +49 -0
- package/skills/impeccable/scripts/command-metadata.json +94 -0
- package/skills/impeccable/scripts/concept-seed.mjs +558 -0
- package/skills/impeccable/scripts/context-signals.mjs +334 -0
- package/skills/impeccable/scripts/context.mjs +1467 -0
- package/skills/impeccable/scripts/critique-storage.mjs +213 -0
- package/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/skills/impeccable/scripts/detect.mjs +21 -0
- package/skills/impeccable/scripts/detector/browser/injected/index.mjs +2023 -0
- package/skills/impeccable/scripts/detector/cli/main.mjs +438 -0
- package/skills/impeccable/scripts/detector/design-system.mjs +1046 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +8283 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
- package/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +372 -0
- package/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +1168 -0
- package/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1186 -0
- package/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +264 -0
- package/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/skills/impeccable/scripts/detector/findings.mjs +18 -0
- package/skills/impeccable/scripts/detector/node/file-system.mjs +203 -0
- package/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/skills/impeccable/scripts/detector/registry/antipatterns.mjs +617 -0
- package/skills/impeccable/scripts/detector/rules/checks.mjs +5580 -0
- package/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/skills/impeccable/scripts/detector/shared/constants.mjs +112 -0
- package/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
- package/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/skills/impeccable/scripts/doctor.mjs +336 -0
- package/skills/impeccable/scripts/embed-prompt.mjs +133 -0
- package/skills/impeccable/scripts/generate-image.mjs +240 -0
- package/skills/impeccable/scripts/hook-admin.mjs +801 -0
- package/skills/impeccable/scripts/hook-before-edit.mjs +508 -0
- package/skills/impeccable/scripts/hook-lib.mjs +2153 -0
- package/skills/impeccable/scripts/hook.mjs +78 -0
- package/skills/impeccable/scripts/lib/artifact-schema.mjs +93 -0
- package/skills/impeccable/scripts/lib/composition-catalog.mjs +200 -0
- package/skills/impeccable/scripts/lib/concept-catalog.mjs +384 -0
- package/skills/impeccable/scripts/lib/design-parser.mjs +925 -0
- package/skills/impeccable/scripts/lib/impeccable-config.mjs +658 -0
- package/skills/impeccable/scripts/lib/impeccable-paths.mjs +137 -0
- package/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
- package/skills/impeccable/scripts/lib/provider.mjs +5 -0
- package/skills/impeccable/scripts/lib/roll-selection.mjs +362 -0
- package/skills/impeccable/scripts/lib/staleness-deep.mjs +478 -0
- package/skills/impeccable/scripts/lib/staleness-notice.mjs +169 -0
- package/skills/impeccable/scripts/lib/staleness.mjs +457 -0
- package/skills/impeccable/scripts/lib/surface-briefs.mjs +151 -0
- package/skills/impeccable/scripts/lib/target-args.mjs +42 -0
- package/skills/impeccable/scripts/lib/target-slug.mjs +33 -0
- package/skills/impeccable/scripts/lib/template-extensions.mjs +146 -0
- package/skills/impeccable/scripts/live/accept-css.mjs +617 -0
- package/skills/impeccable/scripts/live/accept-verify.mjs +60 -0
- package/skills/impeccable/scripts/live/browser-script-parts.mjs +55 -0
- package/skills/impeccable/scripts/live/completion.mjs +28 -0
- package/skills/impeccable/scripts/live/event-validation.mjs +199 -0
- package/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
- package/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +73 -0
- package/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
- package/skills/impeccable/scripts/live/frameworks/journal.mjs +197 -0
- package/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
- package/skills/impeccable/scripts/live/frameworks/nuxt.mjs +161 -0
- package/skills/impeccable/scripts/live/frameworks/script-src.mjs +17 -0
- package/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
- package/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
- package/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
- package/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
- package/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
- package/skills/impeccable/scripts/live/generation-preflight.mjs +149 -0
- package/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
- package/skills/impeccable/scripts/live/instructions.mjs +142 -0
- package/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
- package/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
- package/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
- package/skills/impeccable/scripts/live/poll-lanes.mjs +14 -0
- package/skills/impeccable/scripts/live/roots.mjs +508 -0
- package/skills/impeccable/scripts/live/session-store.mjs +563 -0
- package/skills/impeccable/scripts/live/source-lock.mjs +105 -0
- package/skills/impeccable/scripts/live/source-search.mjs +105 -0
- package/skills/impeccable/scripts/live/svelte-ast.mjs +961 -0
- package/skills/impeccable/scripts/live/svelte-component.mjs +1342 -0
- package/skills/impeccable/scripts/live/sveltekit-adapter.mjs +316 -0
- package/skills/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
- package/skills/impeccable/scripts/live/ui-core.mjs +180 -0
- package/skills/impeccable/scripts/live/vocabulary.mjs +171 -0
- package/skills/impeccable/scripts/live-accept.mjs +954 -0
- package/skills/impeccable/scripts/live-browser-dom.js +146 -0
- package/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/skills/impeccable/scripts/live-browser.js +12520 -0
- package/skills/impeccable/scripts/live-commit-manual-edits.mjs +1244 -0
- package/skills/impeccable/scripts/live-complete.mjs +107 -0
- package/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/skills/impeccable/scripts/live-inject.mjs +503 -0
- package/skills/impeccable/scripts/live-insert.mjs +292 -0
- package/skills/impeccable/scripts/live-manual-edit-evidence.mjs +368 -0
- package/skills/impeccable/scripts/live-poll.mjs +429 -0
- package/skills/impeccable/scripts/live-resume.mjs +123 -0
- package/skills/impeccable/scripts/live-server.mjs +1669 -0
- package/skills/impeccable/scripts/live-status.mjs +71 -0
- package/skills/impeccable/scripts/live-target.mjs +30 -0
- package/skills/impeccable/scripts/live-wrap.mjs +927 -0
- package/skills/impeccable/scripts/live.mjs +359 -0
- package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/impeccable/scripts/palette.mjs +628 -0
- package/skills/impeccable/scripts/pin.mjs +221 -0
- package/skills/impeccable/scripts/serve-question.mjs +932 -0
- package/skills/impeccable/scripts/surface-brief.mjs +74 -0
- package/skills/inkstone-admin/SKILL.md +66 -0
- package/skills/jev-hook-gate/SKILL.md +111 -0
- package/skills/keyword-research/SKILL.md +503 -0
- package/skills/keyword-research/references/dr-cap-and-confidence.md +62 -0
- package/skills/keyword-research/references/keyword-examples.md +769 -0
- package/skills/landing-page-architect/SKILL.md +585 -0
- package/skills/landing-page-architect/references/architecture-reference.md +32 -0
- package/skills/launch-strategy/SKILL.md +384 -0
- package/skills/launch-strategy/evals/evals.json +91 -0
- package/skills/launch-strategy/references/launch-checklist.md +209 -0
- package/skills/launch-strategy/references/launch-timeline.md +159 -0
- package/skills/lead-email-craft/SKILL.md +522 -0
- package/skills/lead-magnets/SKILL.md +310 -0
- package/skills/lead-magnets/references/benchmarks.md +129 -0
- package/skills/lead-magnets/references/format-guide.md +196 -0
- package/skills/link-building-seo/SKILL.md +210 -0
- package/skills/lint-report.txt +1 -0
- package/skills/manifest.json +129 -0
- package/skills/marketing-demo/SKILL.md +249 -0
- package/skills/marketing-demo/references/remotion-examples.md +281 -0
- package/skills/marketing-ideas/SKILL.md +167 -0
- package/skills/marketing-ideas/evals/evals.json +90 -0
- package/skills/marketing-ideas/references/ideas-by-category.md +366 -0
- package/skills/marketing-psychology/SKILL.md +374 -0
- package/skills/marketing-psychology/evals/evals.json +88 -0
- package/skills/marketing-psychology/references/case-studies.md +148 -0
- package/skills/narrative-research-article/SKILL.md +469 -0
- package/skills/narrative-research-article/references/lanusse-patterns.md +166 -0
- package/skills/notebooklm/SKILL.md +674 -0
- package/skills/off-page-seo/SKILL.md +219 -0
- package/skills/onboarding-cro/SKILL.md +220 -0
- package/skills/onboarding-cro/evals/evals.json +92 -0
- package/skills/onboarding-cro/references/experiments.md +258 -0
- package/skills/original-research/SKILL.md +388 -0
- package/skills/page-cro/SKILL.md +269 -0
- package/skills/page-cro/references/cro-benchmarks.md +140 -0
- package/skills/paper-marketing/SKILL.md +448 -0
- package/skills/paper-marketing/references/agent-quality-rubric.md +68 -0
- package/skills/paper-marketing/references/brand-system-template.md +120 -0
- package/skills/paper-marketing/references/paper-mcp-rules.md +71 -0
- package/skills/paper-marketing/references/platform-conventions.md +43 -0
- package/skills/paywall-upgrade-cro/SKILL.md +227 -0
- package/skills/paywall-upgrade-cro/evals/evals.json +93 -0
- package/skills/paywall-upgrade-cro/references/experiments.md +164 -0
- package/skills/platform-formatting/SKILL.md +51 -0
- package/skills/popup-cro/SKILL.md +454 -0
- package/skills/popup-cro/evals/evals.json +94 -0
- package/skills/positioning-angles/SKILL.md +524 -0
- package/skills/positioning-angles/references/ad-matrix-and-examples.md +176 -0
- package/skills/positioning-angles/references/angle-frameworks.md +187 -0
- package/skills/positioning-angles/references/dunford-positioning.md +135 -0
- package/skills/positioning-angles/references/hormozi-offer.md +247 -0
- package/skills/positioning-angles/references/schwartz-sophistication.md +166 -0
- package/skills/positioning-angles/references/unique-mechanism.md +162 -0
- package/skills/pricing-strategy/SKILL.md +346 -0
- package/skills/pricing-strategy/evals/evals.json +90 -0
- package/skills/pricing-strategy/references/research-methods.md +152 -0
- package/skills/pricing-strategy/references/tier-structure.md +307 -0
- package/skills/programmatic-seo/SKILL.md +238 -0
- package/skills/programmatic-seo/evals/evals.json +94 -0
- package/skills/programmatic-seo/references/playbooks.md +308 -0
- package/skills/project-rag/SKILL.md +127 -0
- package/skills/quality-gate/SKILL.md +519 -0
- package/skills/quality-gate/judge-personas/buyer.md +47 -0
- package/skills/quality-gate/judge-personas/expert.md +47 -0
- package/skills/quality-gate/judge-personas/outsider.md +47 -0
- package/skills/quality-gate/judge-personas/scanner.md +41 -0
- package/skills/quality-gate/judge-personas/skeptic.md +40 -0
- package/skills/referral-program/SKILL.md +290 -0
- package/skills/referral-program/evals/evals.json +89 -0
- package/skills/referral-program/references/affiliate-programs.md +163 -0
- package/skills/referral-program/references/program-examples.md +143 -0
- package/skills/review-sites/SKILL.md +279 -0
- package/skills/revops/SKILL.md +343 -0
- package/skills/revops/evals/evals.json +91 -0
- package/skills/revops/references/automation-playbooks.md +290 -0
- package/skills/revops/references/lifecycle-definitions.md +278 -0
- package/skills/revops/references/routing-rules.md +203 -0
- package/skills/revops/references/scoring-models.md +247 -0
- package/skills/saas-product-seo/SKILL.md +324 -0
- package/skills/sales-enablement/SKILL.md +349 -0
- package/skills/sales-enablement/evals/evals.json +91 -0
- package/skills/sales-enablement/references/deck-frameworks.md +263 -0
- package/skills/sales-enablement/references/demo-scripts.md +355 -0
- package/skills/sales-enablement/references/objection-library.md +270 -0
- package/skills/sales-enablement/references/one-pager-templates.md +208 -0
- package/skills/schema-markup/SKILL.md +179 -0
- package/skills/schema-markup/evals/evals.json +87 -0
- package/skills/schema-markup/references/schema-examples.md +398 -0
- package/skills/self-improve/SKILL.md +166 -0
- package/skills/self-improving-agent/README.md +243 -0
- package/skills/self-improving-agent/SKILL.md +437 -0
- package/skills/self-improving-agent/scripts/__init__.py +16 -0
- package/skills/self-improving-agent/scripts/__pycache__/auto_detect.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/__pycache__/nlm_curation.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/__pycache__/self_improving_agent.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/auto_detect.py +270 -0
- package/skills/self-improving-agent/scripts/init_expertise_registry.py +89 -0
- package/skills/self-improving-agent/scripts/nlm_curation.py +259 -0
- package/skills/self-improving-agent/scripts/self-improving-agent +113 -0
- package/skills/self-improving-agent/scripts/self_improving_agent.py +603 -0
- package/skills/self-improving-agent/scripts/test_curation_scorer.py +20 -0
- package/skills/self-improving-agent/scripts/test_self_improving.py +184 -0
- package/skills/send-email/SKILL.md +426 -0
- package/skills/send-email/references/batch-email-examples.md +807 -0
- package/skills/send-email/references/best-practices.md +453 -0
- package/skills/send-email/references/installation.md +123 -0
- package/skills/send-email/references/single-email-examples.md +470 -0
- package/skills/send-email/references/webhooks.md +221 -0
- package/skills/seo-audit/SKILL.md +362 -0
- package/skills/seo-audit/references/ai-writing-detection.md +200 -0
- package/skills/seo-audit/references/architecture-patterns.md +271 -0
- package/skills/seo-audit/references/schema-templates.md +427 -0
- package/skills/seo-content/SKILL.md +510 -0
- package/skills/seo-content/references/anti-ai-detection.md +184 -0
- package/skills/seo-content/references/content-structures.md +148 -0
- package/skills/seo-content/references/eeat-examples.md +235 -0
- package/skills/seo-content/references/on-page-seo.md +261 -0
- package/skills/seo-content/references/pseo-playbooks.md +226 -0
- package/skills/seo-content/references/schema-templates.md +104 -0
- package/skills/seo-content/references/serp-analysis-format.md +151 -0
- package/skills/seo-machine/SKILL.md +331 -0
- package/skills/seo-machine/assets/brand-template.md +73 -0
- package/skills/seo-machine/assets/link-inventory-template.md +74 -0
- package/skills/seo-machine/assets/roadmap-template.md +184 -0
- package/skills/seo-machine/references/api-stack-recipes.md +230 -0
- package/skills/seo-machine/references/exa-recipes.md +260 -0
- package/skills/seo-machine/references/manual-research.md +73 -0
- package/skills/seo-machine/references/methodology.md +87 -0
- package/skills/seo-machine/references/off-page.md +123 -0
- package/skills/seo-machine/references/patterns/alternatives.md +176 -0
- package/skills/seo-machine/references/patterns/compare.md +105 -0
- package/skills/seo-machine/references/patterns/playbooks.md +106 -0
- package/skills/seo-machine/references/patterns/use-case.md +109 -0
- package/skills/seo-machine/references/quality-bars.md +99 -0
- package/skills/seo-machine/references/stacks/astro.md +156 -0
- package/skills/seo-machine/references/stacks/detection.md +61 -0
- package/skills/seo-machine/references/stacks/markdown-fallback.md +181 -0
- package/skills/seo-machine/references/stacks/nextjs.md +108 -0
- package/skills/seo-machine/references/stacks/rails-inertia.md +99 -0
- package/skills/seo-machine/references/striking-distance.md +116 -0
- package/skills/seo-machine/references/technical-audit.md +153 -0
- package/skills/seo-machine/scripts/link_audit.py +265 -0
- package/skills/seo-machine/scripts/tech_audit.py +221 -0
- package/skills/seo-machine/scripts/word_count.py +154 -0
- package/skills/sharp-thesis-validator/SKILL.md +393 -0
- package/skills/sharp-thesis-validator/examples.md +186 -0
- package/skills/signup-flow-cro/SKILL.md +359 -0
- package/skills/signup-flow-cro/evals/evals.json +88 -0
- package/skills/site-architecture/SKILL.md +357 -0
- package/skills/site-architecture/evals/evals.json +88 -0
- package/skills/site-architecture/references/mermaid-templates.md +216 -0
- package/skills/site-architecture/references/navigation-patterns.md +305 -0
- package/skills/site-architecture/references/site-type-templates.md +293 -0
- package/skills/skill-self-improvement/SKILL.md +151 -0
- package/skills/slideshow-script/SKILL.md +274 -0
- package/skills/slideshow-script/references/content-spec-schema.md +77 -0
- package/skills/slideshow-script/references/frameworks.md +84 -0
- package/skills/slideshow-script/references/paips-framework.md +37 -0
- package/skills/social-campaign/SKILL.md +419 -0
- package/skills/social-campaign/references/paper-mcp-workflow.md +48 -0
- package/skills/social-content/SKILL.md +359 -0
- package/skills/social-content/evals/evals.json +92 -0
- package/skills/social-content/references/platforms.md +170 -0
- package/skills/social-content/references/post-templates.md +177 -0
- package/skills/social-content/references/reverse-engineering.md +195 -0
- package/skills/social-worker/SKILL.md +204 -0
- package/skills/startup-launcher/SKILL.md +252 -0
- package/skills/startup-launcher/references/file-router.md +64 -0
- package/skills/startup-launcher/references/platform-matrix.md +65 -0
- package/skills/startup-launcher/references/platforms/alternativeto.md +283 -0
- package/skills/startup-launcher/references/platforms/appsumo.md +495 -0
- package/skills/startup-launcher/references/platforms/auraplusplus.md +736 -0
- package/skills/startup-launcher/references/platforms/betalist.md +98 -0
- package/skills/startup-launcher/references/platforms/capterra.md +276 -0
- package/skills/startup-launcher/references/platforms/crunchbase.md +514 -0
- package/skills/startup-launcher/references/platforms/dealify.md +291 -0
- package/skills/startup-launcher/references/platforms/dealmirror.md +313 -0
- package/skills/startup-launcher/references/platforms/desifounder.md +490 -0
- package/skills/startup-launcher/references/platforms/devhunt.md +210 -0
- package/skills/startup-launcher/references/platforms/devpost.md +448 -0
- package/skills/startup-launcher/references/platforms/fazier.md +56 -0
- package/skills/startup-launcher/references/platforms/firsto.md +489 -0
- package/skills/startup-launcher/references/platforms/g2.md +226 -0
- package/skills/startup-launcher/references/platforms/hackernews.md +99 -0
- package/skills/startup-launcher/references/platforms/hackernoon.md +385 -0
- package/skills/startup-launcher/references/platforms/indiedeals.md +367 -0
- package/skills/startup-launcher/references/platforms/indiehackers.md +80 -0
- package/skills/startup-launcher/references/platforms/kenmoo.md +231 -0
- package/skills/startup-launcher/references/platforms/labstartups.md +618 -0
- package/skills/startup-launcher/references/platforms/launchboard.md +307 -0
- package/skills/startup-launcher/references/platforms/launchfast.md +560 -0
- package/skills/startup-launcher/references/platforms/launchigniter.md +56 -0
- package/skills/startup-launcher/references/platforms/launchingnext.md +674 -0
- package/skills/startup-launcher/references/platforms/launchit.md +574 -0
- package/skills/startup-launcher/references/platforms/launchyourapp.md +677 -0
- package/skills/startup-launcher/references/platforms/libhunt.md +220 -0
- package/skills/startup-launcher/references/platforms/ltdhunt.md +221 -0
- package/skills/startup-launcher/references/platforms/microlaunch.md +45 -0
- package/skills/startup-launcher/references/platforms/openalternative.md +195 -0
- package/skills/startup-launcher/references/platforms/peerlist.md +56 -0
- package/skills/startup-launcher/references/platforms/peerpush.md +64 -0
- package/skills/startup-launcher/references/platforms/primeclub.md +282 -0
- package/skills/startup-launcher/references/platforms/productcanyon.md +190 -0
- package/skills/startup-launcher/references/platforms/producthunt.md +98 -0
- package/skills/startup-launcher/references/platforms/rankinpublic.md +315 -0
- package/skills/startup-launcher/references/platforms/rockethub.md +374 -0
- package/skills/startup-launcher/references/platforms/saasgenius.md +175 -0
- package/skills/startup-launcher/references/platforms/saashub.md +205 -0
- package/skills/startup-launcher/references/platforms/saasmantra.md +221 -0
- package/skills/startup-launcher/references/platforms/saaspirate.md +287 -0
- package/skills/startup-launcher/references/platforms/saaswarrior.md +190 -0
- package/skills/startup-launcher/references/platforms/saaszilla.md +194 -0
- package/skills/startup-launcher/references/platforms/selected.md +925 -0
- package/skills/startup-launcher/references/platforms/sideprojectors.md +86 -0
- package/skills/startup-launcher/references/platforms/softonic.md +240 -0
- package/skills/startup-launcher/references/platforms/sourceforge.md +251 -0
- package/skills/startup-launcher/references/platforms/stacksocial.md +244 -0
- package/skills/startup-launcher/references/platforms/startupstash.md +326 -0
- package/skills/startup-launcher/references/platforms/theresanaiforthat.md +253 -0
- package/skills/startup-launcher/references/platforms/tinylaunch.md +70 -0
- package/skills/startup-launcher/references/platforms/tinystartups.md +72 -0
- package/skills/startup-launcher/references/platforms/toolfolio.md +291 -0
- package/skills/startup-launcher/references/platforms/trustmrr.md +194 -0
- package/skills/startup-launcher/references/platforms/trylaunch.md +531 -0
- package/skills/startup-launcher/references/platforms/uneed.md +57 -0
- package/skills/startup-launcher/references/templates/asset-checklist.md +218 -0
- package/skills/startup-launcher/references/templates/launch-tracker.md +195 -0
- package/skills/startup-launcher/references/templates/product-brief.md +98 -0
- package/skills/summarize/.skill-meta.json +13 -0
- package/skills/summarize/SKILL.md +170 -0
- package/skills/summarize/rules/install.md +157 -0
- package/skills/summarize/rules/usage.md +207 -0
- package/skills/topical-authority/SKILL.md +307 -0
- package/skills/topical-authority/references/jake-ward-framework.md +201 -0
- package/skills/topical-authority/references/serp-clustering-algorithm.md +325 -0
- package/skills/topical-authority/scripts/orchestrator.js +367 -0
- package/skills/topical-authority/scripts/seo/analyze-competitor-coverage.js +3 -0
- package/skills/topical-authority/scripts/seo/audit-internal-links.js +3 -0
- package/skills/topical-authority/scripts/seo/build-clusters-from-serp.js +3 -0
- package/skills/topical-authority/scripts/seo/extract-keywords-from-forums.js +3 -0
- package/skills/topical-authority/scripts/seo/extract-paa-questions.js +3 -0
- package/skills/topical-authority/scripts/seo/fetch-serp-urls.js +3 -0
- package/skills/topical-authority/scripts/seo/gemini-serp-clustering.js +3 -0
- package/skills/topical-authority/scripts/seo/identify-content-gaps.js +3 -0
- package/skills/topical-authority/scripts/seo/identify-research-gaps.js +3 -0
- package/skills/topical-authority/scripts/seo/scrape-quora-questions.js +3 -0
- package/skills/topical-authority/scripts/seo/scrape-reddit-pain-points.js +3 -0
- package/skills/topical-authority/scripts/seo/weave-internal-links.js +3 -0
- package/skills/visual-style/SKILL.md +199 -0
- package/skills/voice-brand-alignment/SKILL.md +70 -0
- package/skills/voice-brand-alignment/references/ai-slop-patterns.md +405 -0
- package/skills/voice-brand-alignment/scripts/validation/gemini-voice-validator.js +96 -0
- package/skills/voice-extraction/SKILL.md +234 -0
- package/skills/voice-extraction/references/extraction-prompt.md +155 -0
- package/skills/voice-extraction/references/voice-dna-template.md +168 -0
- package/skills/voice-extraction/references/voice-elements.md +259 -0
- package/skills/voice-extraction/scripts/build-corpus.js +120 -0
- package/skills/voice-extraction/scripts/collect-sources.sh +168 -0
- package/skills/warm-outbound/SKILL.md +299 -0
- package/skills/warm-outbound/templates/warm-message.md +39 -0
- package/skills/weekly-newsletter-digest/SKILL.md +78 -0
- package/skills/x-playwriter/SKILL.md +428 -0
- package/skills/x-playwriter/scripts/x-browser.js +185 -0
- package/skills/x-post-generator-openclaw/SKILL.md +138 -0
- package/skills/x-post-generator-openclaw/scripts/generate-x-post.js +537 -0
- package/skills/x-posting-playwriter/SKILL.md +203 -0
- package/skills/x-research/SKILL.md +129 -0
- package/skills/x-research/x-research.sh +85 -0
- package/skills/youtube-summarize/SKILL.md +90 -0
- package/skills/youtube-summarize/scripts/youtube-summarize.sh +143 -0
- package/src/cli.js +349 -172
- package/src/harness/deepseek-adapter.js +102 -0
- package/src/harness/deepseek.js +225 -0
- package/src/harness/opencode-adapter.js +174 -0
- package/src/harness/pi-adapter.js +172 -0
- package/src/harness/registry.js +121 -0
- package/src/harness/telemetry.js +102 -0
- package/src/harness/types.js +165 -0
- package/src/interview.js +36 -4
- package/src/postinstall.js +10 -12
- package/templates/AGENTS.md +17 -17
- package/templates/ORG.md +1 -1
- package/templates/TOOLS.md +7 -2
- package/templates/opencode.json +26 -29
- package/wiki/doctor.md +54 -0
- package/wiki/inkstone.md +4 -4
- package/wiki/opencode.md +3 -3
- package/skills/curated.txt +0 -68
|
@@ -0,0 +1,864 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Ralph Hook Enhancer - Hook-specific Quality Enhancement
|
|
4
|
+
*
|
|
5
|
+
* Enhances social media hooks from 85-88/100 to 90-95/100 using Ralph methodology.
|
|
6
|
+
* Adapted from ralph-quality-scorer.js for hook-specific optimization.
|
|
7
|
+
*
|
|
8
|
+
* Key Features:
|
|
9
|
+
* - 10-dimensional scoring (adapted for hooks)
|
|
10
|
+
* - Targeted improvement prompts (weak dimensions only)
|
|
11
|
+
* - Iterative enhancement (max 3 iterations, early stopping)
|
|
12
|
+
* - Pattern teaching (explain WHY hooks work)
|
|
13
|
+
* - Voice preservation (strong dimensions protected)
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* const { enhanceHook, enhanceHookBatch } = require('./ralph-hook-enhancer.js');
|
|
17
|
+
* const enhanced = await enhanceHook(hook, platform, brand, 90);
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const fs = require('fs');
|
|
21
|
+
const path = require('path');
|
|
22
|
+
const { spawn } = require('child_process');
|
|
23
|
+
|
|
24
|
+
// Load environment variables from .env
|
|
25
|
+
require('dotenv').config({ path: path.join(__dirname, '../../../../.env') });
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Hook-specific dimension weights (adapted from Ralph's reader engagement weights)
|
|
29
|
+
*
|
|
30
|
+
* Hook Effectiveness is CRITICAL (lose reader in 0.3 seconds) = 40% weight
|
|
31
|
+
* Voice Authenticity prevents AI slop = 20% weight
|
|
32
|
+
* Specificity creates credibility = 15% weight
|
|
33
|
+
* Emotion drives sharing = 10% weight
|
|
34
|
+
* Pattern Recognition ensures proven formulas = 10% weight
|
|
35
|
+
* Platform Optimization matches culture = 5% weight
|
|
36
|
+
*/
|
|
37
|
+
const HOOK_DIMENSION_WEIGHTS = {
|
|
38
|
+
'Hook Effectiveness': 0.40, // CRITICAL: Stops scrolling in 0.3 seconds
|
|
39
|
+
'Voice Authenticity': 0.20, // HIGH: Sounds like real person, not AI
|
|
40
|
+
'Specificity': 0.15, // MEDIUM: Concrete details vs vague claims
|
|
41
|
+
'Emotion Strength': 0.10, // MEDIUM: Single clear emotion at 7+/10
|
|
42
|
+
'Pattern Recognition': 0.10, // MEDIUM: Uses proven formulas
|
|
43
|
+
'Platform Optimization': 0.05 // LOW: Platform-specific format
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Score hook using Sonnet API (same system as Step 2 selection)
|
|
48
|
+
* This ensures consistency between selection and enhancement scoring
|
|
49
|
+
*
|
|
50
|
+
* @param {string} hookText - The hook to score
|
|
51
|
+
* @param {string} platform - Platform (twitter, linkedin, etc.)
|
|
52
|
+
* @param {string} brand - Brand identifier
|
|
53
|
+
* @returns {Promise<object>} - { compositeScore, dimensionScores, tier }
|
|
54
|
+
*/
|
|
55
|
+
async function scoreHook(hookText, platform, brand) {
|
|
56
|
+
const Anthropic = require('@anthropic-ai/sdk');
|
|
57
|
+
|
|
58
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
59
|
+
console.warn(`⚠️ ANTHROPIC_API_KEY not set, using heuristic scoring`);
|
|
60
|
+
return {
|
|
61
|
+
compositeScore: 75,
|
|
62
|
+
dimensionScores: {
|
|
63
|
+
'Hook Effectiveness': 7.5,
|
|
64
|
+
'Voice Authenticity': 7.5,
|
|
65
|
+
'Specificity': 7.5,
|
|
66
|
+
'Emotion Strength': 7.5,
|
|
67
|
+
'Pattern Recognition': 7.5,
|
|
68
|
+
'Platform Optimization': 7.5
|
|
69
|
+
},
|
|
70
|
+
tier: 'ACCEPTABLE'
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
76
|
+
|
|
77
|
+
const scoringPrompt = `Score this ${platform} hook across 6 dimensions using the EXACT same criteria as the hook selector.
|
|
78
|
+
|
|
79
|
+
HOOK TO SCORE:
|
|
80
|
+
"${hookText}"
|
|
81
|
+
|
|
82
|
+
SCORING CRITERIA (Total: 100 points):
|
|
83
|
+
|
|
84
|
+
1. Hook Effectiveness (40 points max)
|
|
85
|
+
- 0.3 second stop test - Interrupts scroll immediately?
|
|
86
|
+
- Strong curiosity gap - Demands clicking/reading more?
|
|
87
|
+
- Clear value in first 5 words - Benefit obvious fast?
|
|
88
|
+
|
|
89
|
+
2. Specificity (20 points max)
|
|
90
|
+
- Exact numbers (47 tasks, $12/month) NOT ranges
|
|
91
|
+
- Specific timeframes (3 hours, 2 weeks) NOT "quickly"
|
|
92
|
+
- Named tools/techniques NOT "methods"
|
|
93
|
+
|
|
94
|
+
3. Emotion Strength (15 points max)
|
|
95
|
+
- Single clear emotion: surprise, awe, relief, opportunity
|
|
96
|
+
- Emotion strength 7+/10
|
|
97
|
+
- Appropriate for content
|
|
98
|
+
|
|
99
|
+
4. Voice Authenticity (15 points max)
|
|
100
|
+
- Zero AI clichés: "imagine", "unlock", "discover", "transform", "game-changing"
|
|
101
|
+
- Natural conversational tone
|
|
102
|
+
- Sounds like real person
|
|
103
|
+
|
|
104
|
+
5. Trending Alignment (5 points max)
|
|
105
|
+
- Uses current proven patterns
|
|
106
|
+
- Not stale 2020 formulas
|
|
107
|
+
|
|
108
|
+
6. Platform Optimization (5 points max)
|
|
109
|
+
- Within character limit (${platform === 'twitter' ? '280' : '500'} chars)
|
|
110
|
+
- Mobile-first readable
|
|
111
|
+
- Platform-appropriate tone
|
|
112
|
+
|
|
113
|
+
Return ONLY valid JSON (no explanation):
|
|
114
|
+
{
|
|
115
|
+
"total_score": 82,
|
|
116
|
+
"dimension_scores": {
|
|
117
|
+
"hookEffectiveness": 35,
|
|
118
|
+
"specificity": 18,
|
|
119
|
+
"emotionStrength": 12,
|
|
120
|
+
"voiceAuthenticity": 13,
|
|
121
|
+
"trendingAlignment": 4,
|
|
122
|
+
"platformOptimization": 5
|
|
123
|
+
}
|
|
124
|
+
}`;
|
|
125
|
+
|
|
126
|
+
const message = await anthropic.messages.create({
|
|
127
|
+
model: 'claude-sonnet-4-20250514',
|
|
128
|
+
max_tokens: 400,
|
|
129
|
+
temperature: 0,
|
|
130
|
+
messages: [{ role: 'user', content: scoringPrompt }]
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
// Extract JSON
|
|
134
|
+
let jsonText = message.content[0].text.trim();
|
|
135
|
+
jsonText = jsonText.replace(/^```json\s*/i, '').replace(/^```\s*/, '').replace(/\s*```$/, '');
|
|
136
|
+
const jsonMatch = jsonText.match(/\{[\s\S]*\}/);
|
|
137
|
+
if (jsonMatch) jsonText = jsonMatch[0];
|
|
138
|
+
|
|
139
|
+
const result = JSON.parse(jsonText);
|
|
140
|
+
|
|
141
|
+
// Normalize to 10-point scale for display
|
|
142
|
+
const dimensionScores = {
|
|
143
|
+
'Hook Effectiveness': (result.dimension_scores.hookEffectiveness || 0) / 4,
|
|
144
|
+
'Voice Authenticity': (result.dimension_scores.voiceAuthenticity || 0) / 1.5,
|
|
145
|
+
'Specificity': (result.dimension_scores.specificity || 0) / 2,
|
|
146
|
+
'Emotion Strength': (result.dimension_scores.emotionStrength || 0) / 1.5,
|
|
147
|
+
'Pattern Recognition': (result.dimension_scores.trendingAlignment || 0) / 0.5,
|
|
148
|
+
'Platform Optimization': (result.dimension_scores.platformOptimization || 0) / 0.5
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const compositeScore = result.total_score;
|
|
152
|
+
|
|
153
|
+
const tier =
|
|
154
|
+
compositeScore >= 90 ? 'EXCELLENT' :
|
|
155
|
+
compositeScore >= 80 ? 'STRONG' :
|
|
156
|
+
compositeScore >= 70 ? 'ACCEPTABLE' : 'NEEDS IMPROVEMENT';
|
|
157
|
+
|
|
158
|
+
return { compositeScore, dimensionScores, tier };
|
|
159
|
+
|
|
160
|
+
} catch (err) {
|
|
161
|
+
console.warn(`⚠️ Sonnet scoring failed: ${err.message}`);
|
|
162
|
+
return {
|
|
163
|
+
compositeScore: 75,
|
|
164
|
+
dimensionScores: {
|
|
165
|
+
'Hook Effectiveness': 7.5,
|
|
166
|
+
'Voice Authenticity': 7.5,
|
|
167
|
+
'Specificity': 7.5,
|
|
168
|
+
'Emotion Strength': 7.5,
|
|
169
|
+
'Pattern Recognition': 7.5,
|
|
170
|
+
'Platform Optimization': 7.5
|
|
171
|
+
},
|
|
172
|
+
tier: 'ACCEPTABLE'
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Score Hook Effectiveness: Stops scrolling in 0.3 seconds?
|
|
179
|
+
*/
|
|
180
|
+
function scoreHookEffectiveness(hookText, platform) {
|
|
181
|
+
let score = 5.0; // Baseline
|
|
182
|
+
|
|
183
|
+
// Word count: <10 words = +2 points (Twitter), <15 words = +1 (LinkedIn)
|
|
184
|
+
const wordCount = hookText.split(/\s+/).length;
|
|
185
|
+
if (platform === 'twitter' && wordCount <= 10) score += 2;
|
|
186
|
+
else if (wordCount <= 15) score += 1;
|
|
187
|
+
|
|
188
|
+
// Contains specific numbers/metrics = +1.5 points
|
|
189
|
+
if (/\d+(?:,\d+)*(?:\.\d+)?(?:%|K|M|B)?/.test(hookText)) score += 1.5;
|
|
190
|
+
|
|
191
|
+
// Creates curiosity gap (question, incomplete statement, "Here's what", etc.) = +1.5 points
|
|
192
|
+
if (/\?|Here's what|What happened|Why|How/.test(hookText)) score += 1.5;
|
|
193
|
+
|
|
194
|
+
return Math.min(10, score);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Score Voice Authenticity: Sounds like real person? Zero AI clichés?
|
|
199
|
+
*/
|
|
200
|
+
function scoreVoiceAuthenticity(hookText, brand) {
|
|
201
|
+
let score = 10.0; // Start perfect, subtract for AI slop
|
|
202
|
+
|
|
203
|
+
// AI clichés detection (each -2 points)
|
|
204
|
+
const aiCliches = [
|
|
205
|
+
/ever-evolving/i,
|
|
206
|
+
/game-changer/i,
|
|
207
|
+
/revolutionary/i,
|
|
208
|
+
/delve into/i,
|
|
209
|
+
/leverage/i,
|
|
210
|
+
/robust/i,
|
|
211
|
+
/seamless/i,
|
|
212
|
+
/imagine\s+this/i,
|
|
213
|
+
/picture\s+this/i,
|
|
214
|
+
/in\s+conclusion/i
|
|
215
|
+
];
|
|
216
|
+
|
|
217
|
+
aiCliches.forEach(pattern => {
|
|
218
|
+
if (pattern.test(hookText)) score -= 2;
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// Generic openings (each -1 point)
|
|
222
|
+
if (/^Most people think/i.test(hookText)) score -= 1;
|
|
223
|
+
if (/^Have you ever/i.test(hookText)) score -= 1;
|
|
224
|
+
if (/^In today's world/i.test(hookText)) score -= 1;
|
|
225
|
+
|
|
226
|
+
return Math.max(0, score);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Score Specificity: Concrete details vs vague claims
|
|
231
|
+
*/
|
|
232
|
+
function scoreSpecificity(hookText) {
|
|
233
|
+
let score = 5.0; // Baseline
|
|
234
|
+
|
|
235
|
+
// Contains specific numbers = +2 points
|
|
236
|
+
if (/\d+/.test(hookText)) score += 2;
|
|
237
|
+
|
|
238
|
+
// Contains timeframes (48 hours, 2 weeks, etc.) = +1.5 points
|
|
239
|
+
if (/\d+\s+(?:second|minute|hour|day|week|month|year)s?/i.test(hookText)) score += 1.5;
|
|
240
|
+
|
|
241
|
+
// Contains proper nouns (capitalized words, tool names) = +1.5 points
|
|
242
|
+
if (/[A-Z][a-z]+/.test(hookText)) score += 1.5;
|
|
243
|
+
|
|
244
|
+
return Math.min(10, score);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Score Emotion Strength: Single clear emotion at 7+/10
|
|
249
|
+
*/
|
|
250
|
+
function scoreEmotionStrength(hookText) {
|
|
251
|
+
let score = 5.0; // Baseline
|
|
252
|
+
|
|
253
|
+
// High-arousal positive emotions (awe, excitement, surprise)
|
|
254
|
+
const positiveEmotions = [
|
|
255
|
+
/shocking/i,
|
|
256
|
+
/surprising/i,
|
|
257
|
+
/amazing/i,
|
|
258
|
+
/incredible/i,
|
|
259
|
+
/powerful/i,
|
|
260
|
+
/explosive/i
|
|
261
|
+
];
|
|
262
|
+
|
|
263
|
+
positiveEmotions.forEach(pattern => {
|
|
264
|
+
if (pattern.test(hookText)) score += 2;
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// Urgency/FOMO emotions
|
|
268
|
+
if (/before|after|miss|lose|gain|win/.test(hookText)) score += 1.5;
|
|
269
|
+
|
|
270
|
+
return Math.min(10, score);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Score Pattern Recognition: Uses proven formulas
|
|
275
|
+
*/
|
|
276
|
+
function scorePatternRecognition(hookText) {
|
|
277
|
+
let score = 5.0; // Baseline
|
|
278
|
+
|
|
279
|
+
// Contrarian pattern (Most X, but actually Y) = +3 points
|
|
280
|
+
if (/Most.*but|think.*wrong|believe.*actually/i.test(hookText)) score += 3;
|
|
281
|
+
|
|
282
|
+
// First-person witness (I watched, I saw) = +2.5 points
|
|
283
|
+
if (/I watched|I saw|I built|I discovered/i.test(hookText)) score += 2.5;
|
|
284
|
+
|
|
285
|
+
// Transformation pattern (From X to Y, Before/After) = +2 points
|
|
286
|
+
if (/from.*to|before.*after|went from/i.test(hookText)) score += 2;
|
|
287
|
+
|
|
288
|
+
return Math.min(10, score);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Score Platform Optimization: Follows platform culture
|
|
293
|
+
*/
|
|
294
|
+
function scorePlatformOptimization(hookText, platform) {
|
|
295
|
+
let score = 7.0; // Baseline (most hooks are platform-agnostic)
|
|
296
|
+
|
|
297
|
+
if (platform === 'twitter') {
|
|
298
|
+
// Twitter: Conversational, short, punchy
|
|
299
|
+
if (hookText.split(/\s+/).length <= 10) score += 1.5;
|
|
300
|
+
if (/\.\.\./.test(hookText)) score += 1.5; // Ellipsis creates pause
|
|
301
|
+
} else if (platform === 'linkedin') {
|
|
302
|
+
// LinkedIn: Professional, first-person, authority
|
|
303
|
+
if (/I\s+/.test(hookText)) score += 1.5; // First-person
|
|
304
|
+
if (/\d+%|\d+x|\$\d+/.test(hookText)) score += 1.5; // Business metrics
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return Math.min(10, score);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Generate improvement prompt for weak dimensions
|
|
312
|
+
*
|
|
313
|
+
* Based on ralph-quality-scorer.js:generateImprovementPrompt (lines 508-651)
|
|
314
|
+
* Adapted for hook-specific optimization
|
|
315
|
+
*
|
|
316
|
+
* @param {object} hookData - { hook, scores, platform, brand }
|
|
317
|
+
* @param {number} targetScore - Target composite score (default: 90)
|
|
318
|
+
* @returns {string} - Improvement prompt
|
|
319
|
+
*/
|
|
320
|
+
async function generateImprovementPrompt(hookData, targetScore = 90) {
|
|
321
|
+
const { hook, scores, platform, brand } = hookData;
|
|
322
|
+
|
|
323
|
+
// Identify weak dimensions (score < 7/10)
|
|
324
|
+
const weakDimensions = Object.entries(scores.dimensionScores)
|
|
325
|
+
.filter(([_, score]) => score < 7)
|
|
326
|
+
.sort(([dimA, scoreA], [dimB, scoreB]) => {
|
|
327
|
+
// Sort by weight first (high-impact dimensions prioritized)
|
|
328
|
+
const weightA = HOOK_DIMENSION_WEIGHTS[dimA] || 0;
|
|
329
|
+
const weightB = HOOK_DIMENSION_WEIGHTS[dimB] || 0;
|
|
330
|
+
if (weightA !== weightB) return weightB - weightA;
|
|
331
|
+
// Then by score (lowest first)
|
|
332
|
+
return scoreA - scoreB;
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
if (weakDimensions.length === 0) {
|
|
336
|
+
return null; // Hook already meets quality standards
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
let prompt = '';
|
|
340
|
+
|
|
341
|
+
// Section 1: Hook Quality Improvement - Teaching-Based Approach
|
|
342
|
+
prompt += '# Hook Quality Improvement - Teaching-Based Approach\n\n';
|
|
343
|
+
prompt += `**Target**: Composite quality score ≥${targetScore}/100\n`;
|
|
344
|
+
prompt += `**Current**: ${scores.compositeScore.toFixed(1)}/100 (${scores.tier})\n`;
|
|
345
|
+
prompt += `**Platform**: ${platform}\n`;
|
|
346
|
+
prompt += `**Brand**: ${brand}\n\n`;
|
|
347
|
+
|
|
348
|
+
// Section 2: Current Hook
|
|
349
|
+
prompt += '## Current Hook\n\n';
|
|
350
|
+
prompt += `"${hook}"\n\n`;
|
|
351
|
+
|
|
352
|
+
// Section 3: Load Banger Hook Options (if Hook Effectiveness weak)
|
|
353
|
+
const isHookWeak = weakDimensions.some(([dim]) => dim === 'Hook Effectiveness');
|
|
354
|
+
if (isHookWeak) {
|
|
355
|
+
const bangerHooks = await loadBangerHookOptions(platform);
|
|
356
|
+
if (bangerHooks && bangerHooks.length > 0) {
|
|
357
|
+
prompt += '## ✨ BANGER HOOK OPTIONS (9/10 Examples)\n\n';
|
|
358
|
+
prompt += 'Study these proven high-performing hooks and use their PATTERNS:\n\n';
|
|
359
|
+
|
|
360
|
+
bangerHooks.slice(0, 5).forEach((example, i) => {
|
|
361
|
+
prompt += `**Example ${i + 1}**: "${example.hook}"\n`;
|
|
362
|
+
prompt += `- Engagement: ${JSON.stringify(example.engagement)}\n`;
|
|
363
|
+
prompt += `- Pattern: ${example.pattern}\n`;
|
|
364
|
+
prompt += `- Why it works: ${example.why_it_works}\n\n`;
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Section 4: Weak Dimensions - What to Improve
|
|
370
|
+
prompt += '## Dimensions Needing Improvement\n\n';
|
|
371
|
+
prompt += `${weakDimensions.length} dimensions scored <7/10 and need improvement.\n\n`;
|
|
372
|
+
|
|
373
|
+
weakDimensions.forEach(([dimension, score], index) => {
|
|
374
|
+
prompt += `### ${index + 1}. ${dimension} (${score.toFixed(1)}/10 → Target: 7+/10)\n\n`;
|
|
375
|
+
prompt += getDimensionImprovementGuidance(dimension, platform);
|
|
376
|
+
prompt += '\n---\n\n';
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
// Section 5: Strong Dimensions - What to PRESERVE
|
|
380
|
+
const strongDimensions = Object.entries(scores.dimensionScores)
|
|
381
|
+
.filter(([_, score]) => score >= 7)
|
|
382
|
+
.sort(([_, scoreA], [__, scoreB]) => scoreB - scoreA);
|
|
383
|
+
|
|
384
|
+
if (strongDimensions.length > 0) {
|
|
385
|
+
prompt += '## 🚨 CRITICAL: Dimensions to PRESERVE (Do NOT Sacrifice These)\n\n';
|
|
386
|
+
prompt += `While fixing weak dimensions, you MUST maintain these ${strongDimensions.length} strong dimensions.\n\n`;
|
|
387
|
+
|
|
388
|
+
strongDimensions.forEach(([dimension, score], index) => {
|
|
389
|
+
prompt += `### ${index + 1}. ${dimension}: ${score.toFixed(1)}/10 ✅\n\n`;
|
|
390
|
+
prompt += getPreservationGuidance(dimension);
|
|
391
|
+
prompt += '\n---\n\n';
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Section 6: Pattern Teaching - WHY These Patterns Work
|
|
396
|
+
prompt += '## Understanding WHY These Patterns Work\n\n';
|
|
397
|
+
prompt += generatePatternTeaching(weakDimensions.map(([dim]) => dim));
|
|
398
|
+
prompt += '\n\n';
|
|
399
|
+
|
|
400
|
+
// Section 7: Critical Rules - No AI Slop
|
|
401
|
+
prompt += '## Critical Rules - Do NOT Introduce New AI Slop\n\n';
|
|
402
|
+
prompt += '**NEVER use these AI slop phrases in hooks**:\n';
|
|
403
|
+
prompt += '- "ever-evolving", "game-changer", "revolutionary", "delve into"\n';
|
|
404
|
+
prompt += '- "leverage", "robust", "seamless", "imagine this", "picture this"\n';
|
|
405
|
+
prompt += '- "Most people think...", "Have you ever...", "In today\'s world..."\n\n';
|
|
406
|
+
|
|
407
|
+
prompt += '**Quality Check**:\n';
|
|
408
|
+
prompt += '- Is it specific? (numbers, names, timeframes)\n';
|
|
409
|
+
prompt += '- Is it conversational? (sounds human, not corporate)\n';
|
|
410
|
+
prompt += '- Does it create curiosity gap? (makes reader want more)\n';
|
|
411
|
+
prompt += '- Is it <15 words? (Twitter: <10 words ideal)\n\n';
|
|
412
|
+
|
|
413
|
+
// Section 8: Implementation Instructions
|
|
414
|
+
prompt += '## Implementation Instructions\n\n';
|
|
415
|
+
prompt += '1. Study the banger hook examples above\n';
|
|
416
|
+
prompt += '2. Identify which pattern fits the content best\n';
|
|
417
|
+
prompt += '3. Apply transformation to fix weak dimensions\n';
|
|
418
|
+
prompt += '4. Preserve strong dimensions (don\'t break what works)\n';
|
|
419
|
+
prompt += '5. Output ONLY the improved hook (no explanation)\n\n';
|
|
420
|
+
|
|
421
|
+
return prompt;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Get dimension-specific improvement guidance
|
|
426
|
+
*/
|
|
427
|
+
function getDimensionImprovementGuidance(dimension, platform) {
|
|
428
|
+
const guidance = {
|
|
429
|
+
'Hook Effectiveness': `**What 9/10 looks like**:
|
|
430
|
+
- "I watched Kip build an AI app live. Under 10 minutes. 16 viral talking points from ONE video."
|
|
431
|
+
- "Most marketers think SEO is dead. $2.4M in organic traffic later, here's what actually works:"
|
|
432
|
+
- "You don't need 10 tools. You need these 3 APIs."
|
|
433
|
+
|
|
434
|
+
**How to improve**:
|
|
435
|
+
- Use specific numbers (not "a lot", use "47 hours")
|
|
436
|
+
- Create curiosity gap ("Here's what happened", incomplete statement)
|
|
437
|
+
- Keep it SHORT: ${platform === 'twitter' ? '<10 words' : '<15 words'}
|
|
438
|
+
- Start with contrarian belief or first-person witness`,
|
|
439
|
+
|
|
440
|
+
'Voice Authenticity': `**What 9/10 sounds like**:
|
|
441
|
+
- "I broke the LinkedIn algorithm. 450K views in 72 hours. Zero paid ads."
|
|
442
|
+
- "Most creators burn out. I automated 80% of my workflow. Here's the system:"
|
|
443
|
+
|
|
444
|
+
**How to improve**:
|
|
445
|
+
- Remove AI clichés ("game-changer", "revolutionary", "leverage")
|
|
446
|
+
- Don't use "Most people think..." (overused pattern)
|
|
447
|
+
- Sound conversational, like explaining to a friend
|
|
448
|
+
- Use contractions ("you're" not "you are")`,
|
|
449
|
+
|
|
450
|
+
'Specificity': `**What 9/10 looks like**:
|
|
451
|
+
- "I analyzed 1,247 viral tweets. 3 patterns appeared in 94% of them."
|
|
452
|
+
- "Claude Code + Playwright + 15 minutes = Full e2e test suite."
|
|
453
|
+
|
|
454
|
+
**How to improve**:
|
|
455
|
+
- Replace vague words with exact numbers ("many" → "147")
|
|
456
|
+
- Add timeframes ("quickly" → "in 48 hours")
|
|
457
|
+
- Use proper nouns ("automation tool" → "Zapier")
|
|
458
|
+
- Include metrics (%, $, x, hours, etc.)`,
|
|
459
|
+
|
|
460
|
+
'Emotion Strength': `**What 9/10 looks like**:
|
|
461
|
+
- "This is POWERFUL. I built a $10K/mo SaaS in 3 weekends."
|
|
462
|
+
- "I was shocked. One API call replaced 6 hours of manual work."
|
|
463
|
+
|
|
464
|
+
**How to improve**:
|
|
465
|
+
- Choose ONE clear emotion (excitement, surprise, awe)
|
|
466
|
+
- Use high-arousal words (shocking, powerful, explosive)
|
|
467
|
+
- Add urgency/FOMO (before, after, miss, gain)
|
|
468
|
+
- Avoid neutral/flat language`,
|
|
469
|
+
|
|
470
|
+
'Pattern Recognition': `**What 9/10 looks like**:
|
|
471
|
+
- Contrarian: "Most X think Y. That's wrong. Here's Z:"
|
|
472
|
+
- Witness: "I watched [person] do [thing]. [Surprising result]."
|
|
473
|
+
- Transformation: "I went from X to Y in [timeframe]."
|
|
474
|
+
|
|
475
|
+
**How to improve**:
|
|
476
|
+
- Use proven formulas (contrarian, witness, transformation)
|
|
477
|
+
- Don't invent new patterns (stick to what works)
|
|
478
|
+
- Match pattern to content (contrarian for belief shift, witness for case study)`,
|
|
479
|
+
|
|
480
|
+
'Platform Optimization': `**What 9/10 looks like (${platform})**:
|
|
481
|
+
${platform === 'twitter' ? `- "10 years of SEO experience. 3 lessons that matter:"
|
|
482
|
+
- "You're doing content marketing wrong. Here's why:"
|
|
483
|
+
- Short, punchy, conversational` : ''}
|
|
484
|
+
${platform === 'linkedin' ? `- "I watched 50 founders build in public. The ones who succeeded had 3 things in common:"
|
|
485
|
+
- "After analyzing $2.4M in ad spend, here's what I learned:"
|
|
486
|
+
- Professional, first-person, authority-driven` : ''}
|
|
487
|
+
|
|
488
|
+
**How to improve**:
|
|
489
|
+
${platform === 'twitter' ? '- Keep it ultra-short (<10 words)\n- Use ellipsis (...) for pause\n- Conversational tone' : ''}
|
|
490
|
+
${platform === 'linkedin' ? '- Use first-person ("I")\n- Include business metrics ($, %, x)\n- Professional but approachable' : ''}`
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
return guidance[dimension] || '';
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Get preservation guidance for strong dimensions
|
|
498
|
+
*/
|
|
499
|
+
function getPreservationGuidance(dimension) {
|
|
500
|
+
const guides = {
|
|
501
|
+
'Hook Effectiveness': `**How to preserve**:
|
|
502
|
+
- Keep the curiosity gap mechanism
|
|
503
|
+
- Don't add filler words
|
|
504
|
+
- Maintain word count`,
|
|
505
|
+
|
|
506
|
+
'Voice Authenticity': `**How to preserve**:
|
|
507
|
+
- Keep conversational tone
|
|
508
|
+
- Don't add corporate language
|
|
509
|
+
- Preserve contractions and natural flow`,
|
|
510
|
+
|
|
511
|
+
'Specificity': `**How to preserve**:
|
|
512
|
+
- Keep all current numbers and metrics
|
|
513
|
+
- Don't replace specifics with vague terms
|
|
514
|
+
- Maintain timeframes and proper nouns`,
|
|
515
|
+
|
|
516
|
+
'Emotion Strength': `**How to preserve**:
|
|
517
|
+
- Keep high-arousal language
|
|
518
|
+
- Don't tone down excitement
|
|
519
|
+
- Maintain emotional intensity`,
|
|
520
|
+
|
|
521
|
+
'Pattern Recognition': `**How to preserve**:
|
|
522
|
+
- Keep the proven formula structure
|
|
523
|
+
- Don't break the pattern
|
|
524
|
+
- Maintain contrarian/witness/transformation setup`,
|
|
525
|
+
|
|
526
|
+
'Platform Optimization': `**How to preserve**:
|
|
527
|
+
- Keep platform-specific formatting
|
|
528
|
+
- Don't change tone for wrong platform
|
|
529
|
+
- Maintain cultural fit`
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
return guides[dimension] || '';
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Generate pattern teaching section
|
|
537
|
+
*/
|
|
538
|
+
function generatePatternTeaching(weakDimensionNames) {
|
|
539
|
+
let teaching = '';
|
|
540
|
+
|
|
541
|
+
const patterns = {
|
|
542
|
+
'Hook Effectiveness': {
|
|
543
|
+
why: 'Brain has 0.3-second attention window on social media. Curiosity gap creates cognitive tension that MUST be resolved.',
|
|
544
|
+
pattern: 'Specific number + curiosity gap + short form = reader keeps reading',
|
|
545
|
+
research: 'Neuroscience: Information gaps trigger dopamine release when resolved'
|
|
546
|
+
},
|
|
547
|
+
'Voice Authenticity': {
|
|
548
|
+
why: 'AI slop signals "not worth reading" to brain. Authentic voice builds trust and connection.',
|
|
549
|
+
pattern: 'Conversational tone + zero clichés + natural language = sounds like friend, not corporation',
|
|
550
|
+
research: 'Psychology: People trust conversational content 2.3x more than formal writing'
|
|
551
|
+
},
|
|
552
|
+
'Specificity': {
|
|
553
|
+
why: 'Concrete language processed 2x faster, 30% more memorable than abstract.',
|
|
554
|
+
pattern: 'Exact number + specific timeframe + proper noun = credibility and recall',
|
|
555
|
+
research: 'Cognitive load theory: Tangible details reduce working memory demands'
|
|
556
|
+
},
|
|
557
|
+
'Emotion Strength': {
|
|
558
|
+
why: 'High-arousal emotions activate sympathetic nervous system → action → sharing.',
|
|
559
|
+
pattern: 'Single clear emotion + high intensity (7+/10) + practical value = viral potential',
|
|
560
|
+
research: 'Jonah Berger (Wharton): High-arousal content shared 34% more'
|
|
561
|
+
},
|
|
562
|
+
'Pattern Recognition': {
|
|
563
|
+
why: 'Proven formulas work because they exploit cognitive biases (contrarian = cognitive dissonance).',
|
|
564
|
+
pattern: 'Use tested formulas (contrarian, witness, transformation) = predictable engagement',
|
|
565
|
+
research: 'Copywriting: 80% of hook success comes from formula, 20% from execution'
|
|
566
|
+
},
|
|
567
|
+
'Platform Optimization': {
|
|
568
|
+
why: 'Each platform has culture and norms. Mismatch signals "doesn\'t belong here".',
|
|
569
|
+
pattern: 'Match platform culture (Twitter conversational, LinkedIn professional) = higher engagement',
|
|
570
|
+
research: 'Social proof: Content that fits platform norms gets 40% more engagement'
|
|
571
|
+
}
|
|
572
|
+
};
|
|
573
|
+
|
|
574
|
+
weakDimensionNames.forEach(dimension => {
|
|
575
|
+
if (patterns[dimension]) {
|
|
576
|
+
const pattern = patterns[dimension];
|
|
577
|
+
teaching += `**${dimension}**:\n`;
|
|
578
|
+
teaching += `- WHY: ${pattern.why}\n`;
|
|
579
|
+
teaching += `- PATTERN: ${pattern.pattern}\n`;
|
|
580
|
+
teaching += `- RESEARCH: ${pattern.research}\n\n`;
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
return teaching;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Load banger hook options from platform database
|
|
589
|
+
*/
|
|
590
|
+
async function loadBangerHookOptions(platform) {
|
|
591
|
+
const dbPath = path.join(__dirname, '../database', `${platform}-hooks.json`);
|
|
592
|
+
|
|
593
|
+
if (!fs.existsSync(dbPath)) {
|
|
594
|
+
return null;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
try {
|
|
598
|
+
const db = JSON.parse(fs.readFileSync(dbPath, 'utf-8'));
|
|
599
|
+
return db.examples || null;
|
|
600
|
+
} catch (err) {
|
|
601
|
+
console.warn(`⚠️ Could not load banger hooks: ${err.message}`);
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Improve hook using Claude Sonnet API
|
|
608
|
+
* (Much better than Gemini for maintaining quality and avoiding AI slop)
|
|
609
|
+
*
|
|
610
|
+
* @param {string} hook - Current hook text
|
|
611
|
+
* @param {string} improvementPrompt - Generated improvement prompt
|
|
612
|
+
* @returns {Promise<string|null>} - Improved hook or null on failure
|
|
613
|
+
*/
|
|
614
|
+
async function improveHookWithSonnet(hook, improvementPrompt) {
|
|
615
|
+
const Anthropic = require('@anthropic-ai/sdk');
|
|
616
|
+
|
|
617
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
618
|
+
console.warn(`⚠️ ANTHROPIC_API_KEY not set, cannot improve hook`);
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
try {
|
|
623
|
+
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
624
|
+
|
|
625
|
+
const combinedInput = `${improvementPrompt}\n\n# CURRENT HOOK TO IMPROVE\n\n"${hook}"\n\nCRITICAL: Return ONLY the improved hook as a single line. No explanation, no quotes, no prefix text. Just the hook itself.`;
|
|
626
|
+
|
|
627
|
+
const message = await anthropic.messages.create({
|
|
628
|
+
model: 'claude-sonnet-4-20250514', // Sonnet 4 for best quality rewriting
|
|
629
|
+
max_tokens: 200,
|
|
630
|
+
temperature: 0.7, // Some creativity for rewriting
|
|
631
|
+
messages: [{
|
|
632
|
+
role: 'user',
|
|
633
|
+
content: combinedInput
|
|
634
|
+
}]
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
// Extract just the hook
|
|
638
|
+
let improved = message.content[0].text.trim();
|
|
639
|
+
improved = improved.split('\n')[0]; // Take first line only
|
|
640
|
+
improved = improved.replace(/^["']|["']$/g, ''); // Remove quotes
|
|
641
|
+
improved = improved.replace(/^Improved hook:\s*/i, ''); // Remove prefix
|
|
642
|
+
improved = improved.trim();
|
|
643
|
+
|
|
644
|
+
// Validate improvement (must be different and reasonable length)
|
|
645
|
+
if (improved && improved !== hook && improved.length > 10 && improved.length < 280) {
|
|
646
|
+
return improved;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
return null;
|
|
650
|
+
|
|
651
|
+
} catch (err) {
|
|
652
|
+
console.warn(`⚠️ Sonnet improvement failed: ${err.message}`);
|
|
653
|
+
return null;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/**
|
|
658
|
+
* Enhance single hook to target score
|
|
659
|
+
*
|
|
660
|
+
* @param {string} hook - Hook text to enhance
|
|
661
|
+
* @param {string} platform - Platform (twitter, linkedin, etc.)
|
|
662
|
+
* @param {string} brand - Brand identifier
|
|
663
|
+
* @param {number} targetScore - Target composite score (default: 90)
|
|
664
|
+
* @returns {Promise<object>} - { hook, score, iterations, dimensions }
|
|
665
|
+
*/
|
|
666
|
+
async function enhanceHook(hook, platform, brand, targetScore = 90) {
|
|
667
|
+
const maxIterations = 3;
|
|
668
|
+
let currentHook = hook;
|
|
669
|
+
let iteration = 0;
|
|
670
|
+
let previousScore = 0;
|
|
671
|
+
|
|
672
|
+
console.log(` 🎨 Enhancing hook for ${platform}...`);
|
|
673
|
+
console.log(` Current: "${currentHook.substring(0, 60)}..."`);
|
|
674
|
+
|
|
675
|
+
for (iteration = 1; iteration <= maxIterations; iteration++) {
|
|
676
|
+
// Score current version
|
|
677
|
+
const scores = await scoreHook(currentHook, platform, brand);
|
|
678
|
+
|
|
679
|
+
console.log(` Iteration ${iteration}: ${scores.compositeScore.toFixed(1)}/100 (${scores.tier})`);
|
|
680
|
+
|
|
681
|
+
// Check if already good (75+) - don't touch it!
|
|
682
|
+
// Rationale: Hooks 75-85/100 are excellent. Rewriting often makes them worse.
|
|
683
|
+
if (iteration === 1 && scores.compositeScore >= 75) {
|
|
684
|
+
console.log(` ✅ Already excellent (${scores.compositeScore.toFixed(1)}/100) - skipping enhancement`);
|
|
685
|
+
return {
|
|
686
|
+
hook: currentHook,
|
|
687
|
+
score: scores.compositeScore,
|
|
688
|
+
iterations: 0,
|
|
689
|
+
dimensions: scores.dimensionScores,
|
|
690
|
+
enhanced: false,
|
|
691
|
+
improvement_delta: 0,
|
|
692
|
+
skip_reason: 'Already excellent quality'
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
// Check if target reached
|
|
697
|
+
if (scores.compositeScore >= targetScore) {
|
|
698
|
+
console.log(` ✅ Target reached! ${scores.compositeScore.toFixed(1)} ≥ ${targetScore}`);
|
|
699
|
+
return {
|
|
700
|
+
hook: currentHook,
|
|
701
|
+
score: scores.compositeScore,
|
|
702
|
+
iterations: iteration,
|
|
703
|
+
dimensions: scores.dimensionScores,
|
|
704
|
+
enhanced: true,
|
|
705
|
+
improvement_delta: scores.compositeScore - previousScore
|
|
706
|
+
};
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// Early stopping: No improvement after 2 iterations
|
|
710
|
+
if (iteration > 1 && scores.compositeScore <= previousScore + 0.5) {
|
|
711
|
+
console.log(` 🛑 Early stop: No meaningful improvement`);
|
|
712
|
+
return {
|
|
713
|
+
hook: currentHook,
|
|
714
|
+
score: scores.compositeScore,
|
|
715
|
+
iterations: iteration,
|
|
716
|
+
dimensions: scores.dimensionScores,
|
|
717
|
+
enhanced: true,
|
|
718
|
+
improvement_delta: scores.compositeScore - previousScore
|
|
719
|
+
};
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// Generate improvement prompt
|
|
723
|
+
const improvementPrompt = await generateImprovementPrompt({
|
|
724
|
+
hook: currentHook,
|
|
725
|
+
scores,
|
|
726
|
+
platform,
|
|
727
|
+
brand
|
|
728
|
+
}, targetScore);
|
|
729
|
+
|
|
730
|
+
if (!improvementPrompt) {
|
|
731
|
+
// No weak dimensions, hook is already good
|
|
732
|
+
return {
|
|
733
|
+
hook: currentHook,
|
|
734
|
+
score: scores.compositeScore,
|
|
735
|
+
iterations: iteration,
|
|
736
|
+
dimensions: scores.dimensionScores,
|
|
737
|
+
enhanced: false,
|
|
738
|
+
improvement_delta: 0
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Improve with Sonnet
|
|
743
|
+
const improvedHook = await improveHookWithSonnet(currentHook, improvementPrompt);
|
|
744
|
+
|
|
745
|
+
if (!improvedHook) {
|
|
746
|
+
console.log(` ⚠️ Improvement failed, returning current version`);
|
|
747
|
+
return {
|
|
748
|
+
hook: currentHook,
|
|
749
|
+
score: scores.compositeScore,
|
|
750
|
+
iterations: iteration,
|
|
751
|
+
dimensions: scores.dimensionScores,
|
|
752
|
+
enhanced: false,
|
|
753
|
+
improvement_delta: 0
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
previousScore = scores.compositeScore;
|
|
758
|
+
currentHook = improvedHook;
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
// Max iterations reached
|
|
762
|
+
const finalScores = await scoreHook(currentHook, platform, brand);
|
|
763
|
+
console.log(` ⏱️ Max iterations reached: ${finalScores.compositeScore.toFixed(1)}/100`);
|
|
764
|
+
|
|
765
|
+
return {
|
|
766
|
+
hook: currentHook,
|
|
767
|
+
score: finalScores.compositeScore,
|
|
768
|
+
iterations: maxIterations,
|
|
769
|
+
dimensions: finalScores.dimensionScores,
|
|
770
|
+
enhanced: true,
|
|
771
|
+
improvement_delta: finalScores.compositeScore - previousScore
|
|
772
|
+
};
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
/**
|
|
776
|
+
* Enhance batch of hooks (typically top 3 from Sonnet selection)
|
|
777
|
+
*
|
|
778
|
+
* @param {array} hooks - Array of hook objects from Sonnet selector
|
|
779
|
+
* @param {string} platform - Platform
|
|
780
|
+
* @param {string} brand - Brand
|
|
781
|
+
* @param {number} targetScore - Target score (default: 90)
|
|
782
|
+
* @returns {Promise<array>} - Enhanced hooks
|
|
783
|
+
*/
|
|
784
|
+
async function enhanceHookBatch(hooks, platform, brand, targetScore = 90) {
|
|
785
|
+
const enhanced = [];
|
|
786
|
+
|
|
787
|
+
for (let i = 0; i < hooks.length; i++) {
|
|
788
|
+
const hook = hooks[i];
|
|
789
|
+
const hookText = hook.hook_text || hook.hook || hook;
|
|
790
|
+
|
|
791
|
+
console.log(`\n Hook ${i + 1}/${hooks.length}:`);
|
|
792
|
+
|
|
793
|
+
const result = await enhanceHook(hookText, platform, brand, targetScore);
|
|
794
|
+
|
|
795
|
+
// Merge with original hook data
|
|
796
|
+
enhanced.push({
|
|
797
|
+
...hook,
|
|
798
|
+
hook_text: result.hook,
|
|
799
|
+
estimated_score: result.score,
|
|
800
|
+
enhanced: result.enhanced,
|
|
801
|
+
iterations: result.iterations,
|
|
802
|
+
improvement_delta: result.improvement_delta,
|
|
803
|
+
dimension_scores: result.dimensions
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
return enhanced;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* CLI test function
|
|
812
|
+
*/
|
|
813
|
+
async function testEnhancement() {
|
|
814
|
+
const args = process.argv.slice(2);
|
|
815
|
+
const options = {};
|
|
816
|
+
|
|
817
|
+
for (let i = 0; i < args.length; i++) {
|
|
818
|
+
if (args[i].startsWith('--')) {
|
|
819
|
+
const key = args[i].slice(2);
|
|
820
|
+
const value = args[i + 1];
|
|
821
|
+
options[key] = value;
|
|
822
|
+
i++;
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
const {
|
|
827
|
+
hook = "I watched Kip build an AI app in 10 minutes",
|
|
828
|
+
platform = "twitter",
|
|
829
|
+
brand = "ai.withjai",
|
|
830
|
+
target = 90
|
|
831
|
+
} = options;
|
|
832
|
+
|
|
833
|
+
console.log('\n=== Ralph Hook Enhancement Test ===\n');
|
|
834
|
+
console.log(`Hook: "${hook}"`);
|
|
835
|
+
console.log(`Platform: ${platform}`);
|
|
836
|
+
console.log(`Brand: ${brand}`);
|
|
837
|
+
console.log(`Target: ${target}/100\n`);
|
|
838
|
+
|
|
839
|
+
const result = await enhanceHook(hook, platform, brand, parseInt(target));
|
|
840
|
+
|
|
841
|
+
console.log('\n=== Results ===\n');
|
|
842
|
+
console.log(`Final hook: "${result.hook}"`);
|
|
843
|
+
console.log(`Score: ${result.score.toFixed(1)}/100`);
|
|
844
|
+
console.log(`Iterations: ${result.iterations}`);
|
|
845
|
+
console.log(`Improvement: +${result.improvement_delta.toFixed(1)} points`);
|
|
846
|
+
console.log(`Enhanced: ${result.enhanced}`);
|
|
847
|
+
console.log('\nDimension Scores:');
|
|
848
|
+
Object.entries(result.dimensions).forEach(([dim, score]) => {
|
|
849
|
+
console.log(` ${dim}: ${score.toFixed(1)}/10`);
|
|
850
|
+
});
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// Export functions
|
|
854
|
+
module.exports = {
|
|
855
|
+
scoreHook,
|
|
856
|
+
generateImprovementPrompt,
|
|
857
|
+
enhanceHook,
|
|
858
|
+
enhanceHookBatch
|
|
859
|
+
};
|
|
860
|
+
|
|
861
|
+
// CLI execution
|
|
862
|
+
if (require.main === module) {
|
|
863
|
+
testEnhancement().catch(console.error);
|
|
864
|
+
}
|