@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.
- 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 +347 -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,722 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Unified Hook Generator v3.0 (Haiku + Sonnet + Ralph)
|
|
4
|
+
*
|
|
5
|
+
* NEW 3-Step System:
|
|
6
|
+
* - Step 1: Claude Haiku 4.5 generates 50 hooks (85-90/100 baseline, zero AI slop)
|
|
7
|
+
* - Step 2: Sonnet scores and selects top 3 (10-dimensional scoring)
|
|
8
|
+
* - Step 3: Ralph enhancement improves to 90-95/100 (iterative teaching-based improvement)
|
|
9
|
+
*
|
|
10
|
+
* Quality Improvement: +7-10 points per hook (85/100 ā 92/100 average)
|
|
11
|
+
*
|
|
12
|
+
* Generates platform-optimized hooks using:
|
|
13
|
+
* - Platform-specific example databases (20+ proven hooks each)
|
|
14
|
+
* - Gemini CLI for heavy lifting (40x cost savings)
|
|
15
|
+
* - Pattern recognition and scoring
|
|
16
|
+
* - Volume mode: Generate 50 hooks, Claude auto-selects top 3, Ralph enhances
|
|
17
|
+
* - Hybrid selector: Auto-detects API key or Claude Code environment
|
|
18
|
+
*
|
|
19
|
+
* Hybrid Scoring:
|
|
20
|
+
* - Has API key: Uses Anthropic API for scoring
|
|
21
|
+
* - No API key: Creates scoring request for manual handling
|
|
22
|
+
* - Works in both standalone and Claude Code environments
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* Standard mode (3 hooks, Gemini only, no enhancement):
|
|
26
|
+
* node generate-hooks-unified.js \
|
|
27
|
+
* --content "path/to/blog.md" \
|
|
28
|
+
* --platform twitter \
|
|
29
|
+
* --brand linkedgraphix.app \
|
|
30
|
+
* --count 3
|
|
31
|
+
*
|
|
32
|
+
* Volume mode v3.0 (50 hooks + Sonnet selection + Ralph enhancement ā 90-95/100):
|
|
33
|
+
* node generate-hooks-unified.js \
|
|
34
|
+
* --content "path/to/blog.md" \
|
|
35
|
+
* --platform twitter \
|
|
36
|
+
* --brand linkedgraphix.app \
|
|
37
|
+
* --count 50 \
|
|
38
|
+
* --volume
|
|
39
|
+
*
|
|
40
|
+
* Volume mode with Gemini override (lower quality, cheaper):
|
|
41
|
+
* node generate-hooks-unified.js \
|
|
42
|
+
* --content "path/to/blog.md" \
|
|
43
|
+
* --platform twitter \
|
|
44
|
+
* --brand linkedgraphix.app \
|
|
45
|
+
* --count 50 \
|
|
46
|
+
* --volume \
|
|
47
|
+
* --model gemini-2.0-flash-exp
|
|
48
|
+
*
|
|
49
|
+
* Environment:
|
|
50
|
+
* ANTHROPIC_API_KEY - Required for Ralph enhancement and Sonnet selection
|
|
51
|
+
* Without key: Creates scoring request for manual processing
|
|
52
|
+
*
|
|
53
|
+
* Output: JSON with scored, ranked, and enhanced hooks (v3.0)
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
const fs = require('fs');
|
|
57
|
+
const path = require('path');
|
|
58
|
+
const { spawn, execSync } = require('child_process');
|
|
59
|
+
|
|
60
|
+
// Load environment variables from .env (4 levels up from /scripts/)
|
|
61
|
+
require('dotenv').config({ path: path.join(__dirname, '../../../../.env') });
|
|
62
|
+
|
|
63
|
+
// Parse command line arguments
|
|
64
|
+
function parseArgs() {
|
|
65
|
+
const args = process.argv.slice(2);
|
|
66
|
+
const options = {};
|
|
67
|
+
|
|
68
|
+
for (let i = 0; i < args.length; i++) {
|
|
69
|
+
if (args[i].startsWith('--')) {
|
|
70
|
+
const key = args[i].slice(2);
|
|
71
|
+
const value = args[i + 1];
|
|
72
|
+
options[key] = value;
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return options;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Niche-to-brand mapping for automatic niche detection
|
|
81
|
+
const BRAND_NICHE_MAP = {
|
|
82
|
+
'enchantents': 'enchantents-glamping',
|
|
83
|
+
'nomadixgear': 'enchantents-glamping',
|
|
84
|
+
'nomadix': 'enchantents-glamping',
|
|
85
|
+
'aiwithjai': 'ai-agents',
|
|
86
|
+
'aiwithjai': 'ai-agents',
|
|
87
|
+
'linkedgraphix': 'ai-agents',
|
|
88
|
+
'clawver': 'ai-agents',
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Load platform-specific hook database, with optional niche filtering
|
|
92
|
+
function loadPlatformHooks(platform, niche = null) {
|
|
93
|
+
const dbPath = path.join(__dirname, '../database', `${platform}-hooks.json`);
|
|
94
|
+
|
|
95
|
+
if (!fs.existsSync(dbPath)) {
|
|
96
|
+
throw new Error(`Hook database not found for platform: ${platform}`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const db = JSON.parse(fs.readFileSync(dbPath, 'utf8'));
|
|
100
|
+
console.log(` ā Loaded ${db.examples.length} ${platform} hook examples`);
|
|
101
|
+
|
|
102
|
+
if (niche) {
|
|
103
|
+
const nicheExamples = db.examples.filter(e => e.niche === niche);
|
|
104
|
+
const generalExamples = db.examples.filter(e => !e.niche);
|
|
105
|
+
|
|
106
|
+
if (nicheExamples.length > 0) {
|
|
107
|
+
db.examples = [...nicheExamples, ...generalExamples];
|
|
108
|
+
console.log(` ā Prioritized ${nicheExamples.length} ${niche} hooks (${generalExamples.length} general as fallback)`);
|
|
109
|
+
} else {
|
|
110
|
+
console.log(` ā No hooks found for niche "${niche}", using all ${db.examples.length} examples`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return db;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Read content from file or string
|
|
118
|
+
function readContent(contentPath) {
|
|
119
|
+
if (fs.existsSync(contentPath)) {
|
|
120
|
+
return fs.readFileSync(contentPath, 'utf8');
|
|
121
|
+
}
|
|
122
|
+
return contentPath; // Treat as direct content string
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Extract content elements for hook generation
|
|
126
|
+
function extractContentElements(content) {
|
|
127
|
+
console.log(` Extracting content elements...`);
|
|
128
|
+
|
|
129
|
+
// Simple extraction (Gemini will do the heavy lifting)
|
|
130
|
+
const elements = {
|
|
131
|
+
// Numbers/data
|
|
132
|
+
numbers: (content.match(/\d+(?:,\d+)*(?:\.\d+)?(?:%|K|M|B)?/g) || []).slice(0, 10),
|
|
133
|
+
|
|
134
|
+
// Timeframes
|
|
135
|
+
timeframes: (content.match(/\d+\s+(?:second|minute|hour|day|week|month|year)s?/gi) || []).slice(0, 5),
|
|
136
|
+
|
|
137
|
+
// Quotes (rough extraction)
|
|
138
|
+
quotes: (content.match(/"([^"]+)"/g) || []).slice(0, 3),
|
|
139
|
+
|
|
140
|
+
// First 500 chars for context
|
|
141
|
+
context: content.substring(0, 500)
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
console.log(` ā Found ${elements.numbers.length} numbers, ${elements.timeframes.length} timeframes`);
|
|
145
|
+
|
|
146
|
+
return elements;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Generate hooks using Gemini CLI
|
|
150
|
+
async function generateHooksWithGemini(platform, hookDatabase, content, elements, count) {
|
|
151
|
+
console.log(` Generating ${count} hooks via Gemini CLI...`);
|
|
152
|
+
|
|
153
|
+
// Select top examples to show Gemini (5-7 examples)
|
|
154
|
+
const exampleCount = Math.min(7, hookDatabase.examples.length);
|
|
155
|
+
const examples = hookDatabase.examples.slice(0, exampleCount);
|
|
156
|
+
|
|
157
|
+
// Build prompt for Gemini
|
|
158
|
+
const prompt = `
|
|
159
|
+
You are a ${platform.toUpperCase()} hook generation expert.
|
|
160
|
+
|
|
161
|
+
Study these ${exampleCount} PROVEN high-performing ${platform} hooks:
|
|
162
|
+
|
|
163
|
+
${examples.map((ex, i) => `
|
|
164
|
+
EXAMPLE ${i + 1}:
|
|
165
|
+
Hook: ${typeof ex.hook === 'string' ? ex.hook : JSON.stringify(ex.hook)}
|
|
166
|
+
Engagement: ${JSON.stringify(ex.engagement)}
|
|
167
|
+
Why it works: ${ex.why_it_works}
|
|
168
|
+
Pattern: ${ex.pattern}
|
|
169
|
+
`).join('\n')}
|
|
170
|
+
|
|
171
|
+
${platform === 'linkedin' ? `
|
|
172
|
+
CRITICAL: Use first-person witness style like "I watched [person] do [thing]..."
|
|
173
|
+
NOT third-person reporter style like "[Person] did [thing]..."
|
|
174
|
+
` : ''}
|
|
175
|
+
|
|
176
|
+
${platform === 'twitter' ? `
|
|
177
|
+
CRITICAL: Use conversational, punchy style with short lines and white space.
|
|
178
|
+
NOT information overload with everything crammed into one sentence.
|
|
179
|
+
` : ''}
|
|
180
|
+
|
|
181
|
+
CONTENT TO CREATE HOOKS FROM:
|
|
182
|
+
${content.substring(0, 1500)}
|
|
183
|
+
|
|
184
|
+
EXTRACTED ELEMENTS:
|
|
185
|
+
- Numbers: ${elements.numbers.join(', ')}
|
|
186
|
+
- Timeframes: ${elements.timeframes.join(', ')}
|
|
187
|
+
- Context: ${elements.context}
|
|
188
|
+
|
|
189
|
+
TASK:
|
|
190
|
+
Generate ${count} hooks using the SAME PATTERNS as the proven examples above.
|
|
191
|
+
|
|
192
|
+
For each hook, provide:
|
|
193
|
+
1. hook_text: The actual hook (follow platform style from examples)
|
|
194
|
+
2. pattern: Which example pattern it follows
|
|
195
|
+
3. why_it_works: Specific reason this hook will perform
|
|
196
|
+
4. estimated_score: 0-100 (based on pattern match + specificity + curiosity gap)
|
|
197
|
+
5. similar_to_example: Which example number (1-${exampleCount}) it's most similar to
|
|
198
|
+
|
|
199
|
+
OUTPUT AS JSON:
|
|
200
|
+
{
|
|
201
|
+
"hooks": [
|
|
202
|
+
{
|
|
203
|
+
"hook_text": "...",
|
|
204
|
+
"pattern": "...",
|
|
205
|
+
"why_it_works": "...",
|
|
206
|
+
"estimated_score": 85,
|
|
207
|
+
"similar_to_example": 1
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
`;
|
|
212
|
+
|
|
213
|
+
return new Promise((resolve, reject) => {
|
|
214
|
+
let output = '';
|
|
215
|
+
let errorOutput = '';
|
|
216
|
+
|
|
217
|
+
// Write prompt to temp file
|
|
218
|
+
const tmpFile = path.join('/tmp', `hook-prompt-${Date.now()}.txt`);
|
|
219
|
+
fs.writeFileSync(tmpFile, prompt);
|
|
220
|
+
|
|
221
|
+
const gemini = spawn('gemini', ['-o', 'json', '-p', prompt], {
|
|
222
|
+
cwd: process.cwd()
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
gemini.stdout.on('data', (data) => {
|
|
226
|
+
output += data.toString();
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
gemini.stderr.on('data', (data) => {
|
|
230
|
+
errorOutput += data.toString();
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
gemini.on('close', (code) => {
|
|
234
|
+
if (code !== 0) {
|
|
235
|
+
console.error(` ā Gemini CLI error: ${errorOutput}`);
|
|
236
|
+
reject(new Error(`Gemini CLI failed with code ${code}`));
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
try {
|
|
241
|
+
// Parse Gemini CLI JSON output (wrapper format)
|
|
242
|
+
const cliOutput = JSON.parse(output);
|
|
243
|
+
|
|
244
|
+
// Extract response field (contains markdown with JSON)
|
|
245
|
+
let responseText = cliOutput.response || output;
|
|
246
|
+
|
|
247
|
+
// Remove markdown code blocks if present
|
|
248
|
+
responseText = responseText.replace(/^```json\s*/i, '').replace(/^```\s*/, '').replace(/\s*```$/, '');
|
|
249
|
+
|
|
250
|
+
// Try to find JSON object with hooks array
|
|
251
|
+
const jsonMatch = responseText.match(/\{[\s\S]*\}/);
|
|
252
|
+
if (jsonMatch) {
|
|
253
|
+
const result = JSON.parse(jsonMatch[0]);
|
|
254
|
+
if (result.hooks && Array.isArray(result.hooks)) {
|
|
255
|
+
console.log(` ā Generated ${result.hooks.length} hooks`);
|
|
256
|
+
resolve(result.hooks);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Fallback: try to parse as JSON array directly
|
|
262
|
+
const arrayMatch = responseText.match(/\[[\s\S]*\]/);
|
|
263
|
+
if (arrayMatch) {
|
|
264
|
+
const hooks = JSON.parse(arrayMatch[0]);
|
|
265
|
+
console.log(` ā Generated ${hooks.length} hooks`);
|
|
266
|
+
resolve(hooks);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
throw new Error('No valid JSON with hooks array found in Gemini output');
|
|
271
|
+
} catch (err) {
|
|
272
|
+
console.error(` ā Failed to parse Gemini output: ${err.message}`);
|
|
273
|
+
console.error(` Raw output length: ${output.length}`);
|
|
274
|
+
reject(err);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Score and rank hooks
|
|
281
|
+
function scoreAndRankHooks(hooks, platform) {
|
|
282
|
+
console.log(` Scoring and ranking hooks...`);
|
|
283
|
+
|
|
284
|
+
// Sort by estimated_score (descending)
|
|
285
|
+
const ranked = hooks.sort((a, b) => b.estimated_score - a.estimated_score);
|
|
286
|
+
|
|
287
|
+
console.log(` ā Top hook: ${ranked[0].estimated_score}/100`);
|
|
288
|
+
|
|
289
|
+
return ranked;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// ============================================================================
|
|
293
|
+
// VOLUME MODE FUNCTIONS
|
|
294
|
+
// ============================================================================
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Generate 50+ hooks using volume-hook-generator.js or volume-hook-generator-haiku.js
|
|
298
|
+
*/
|
|
299
|
+
async function generateVolumeHooks(contentPath, platform, brand, count, model) {
|
|
300
|
+
console.log(`\n š„ VOLUME MODE: Generating ${count} hooks with ${model}...`);
|
|
301
|
+
|
|
302
|
+
// Read content to extract topic
|
|
303
|
+
const content = readContent(contentPath);
|
|
304
|
+
const topic = extractTopic(content);
|
|
305
|
+
|
|
306
|
+
console.log(` š Extracted topic: ${topic}\n`);
|
|
307
|
+
|
|
308
|
+
// Determine which generator to use based on model
|
|
309
|
+
// Default to Haiku for quality, allow Gemini override
|
|
310
|
+
const useHaikuAgent = model === 'claude-haiku' || model === 'default' || !model.includes('gemini');
|
|
311
|
+
|
|
312
|
+
const volumeGeneratorPath = useHaikuAgent
|
|
313
|
+
? path.join(process.cwd(), 'scripts/hooks/volume-hook-generator-haiku.js')
|
|
314
|
+
: path.join(process.cwd(), 'scripts/hooks/volume-hook-generator.js');
|
|
315
|
+
|
|
316
|
+
const generatorName = useHaikuAgent ? 'Claude Haiku' : 'Gemini';
|
|
317
|
+
|
|
318
|
+
console.log(` š¤ Using ${generatorName} for generation`);
|
|
319
|
+
|
|
320
|
+
if (useHaikuAgent) {
|
|
321
|
+
console.log(` š” Zero AI slop, higher quality, 4x cost\n`);
|
|
322
|
+
} else {
|
|
323
|
+
console.log(` š” Fast and cheap, may have AI slop\n`);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const outputFile = path.join('/tmp', `volume-hooks-${Date.now()}.json`);
|
|
327
|
+
|
|
328
|
+
try {
|
|
329
|
+
// Build command
|
|
330
|
+
const baseCmd = `node "${volumeGeneratorPath}" --topic "${topic}" --platform ${platform} --brand ${brand} --count ${count} --output "${outputFile}"`;
|
|
331
|
+
const command = useHaikuAgent ? baseCmd : `${baseCmd} --model ${model}`;
|
|
332
|
+
|
|
333
|
+
execSync(command, {
|
|
334
|
+
stdio: 'inherit',
|
|
335
|
+
encoding: 'utf-8'
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// Read generated hooks
|
|
339
|
+
const hooksData = JSON.parse(fs.readFileSync(outputFile, 'utf-8'));
|
|
340
|
+
return { hooksData, outputFile };
|
|
341
|
+
|
|
342
|
+
} catch (error) {
|
|
343
|
+
throw new Error(`Volume generation failed: ${error.message}`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Generate 50 hooks using hook-writer-master agent (Claude Haiku 4.5)
|
|
349
|
+
* Fallback: Direct Anthropic API if agent unavailable
|
|
350
|
+
*/
|
|
351
|
+
async function generateVolumeHooksWithAgent(content, platform, brand, count) {
|
|
352
|
+
console.log(`\n š¤ Volume generation with hook-writer-master agent (Haiku 4.5)...\n`);
|
|
353
|
+
|
|
354
|
+
const { invokeHookWriter } = require(path.join(process.cwd(), 'scripts/validation/invoke-hook-writer-agent.js'));
|
|
355
|
+
|
|
356
|
+
const prompt = `Generate ${count} scroll-stopping hooks for ${platform}.
|
|
357
|
+
|
|
358
|
+
Content to extract hooks from:
|
|
359
|
+
${content.substring(0, 1500)}
|
|
360
|
+
|
|
361
|
+
Requirements:
|
|
362
|
+
- Platform: ${platform}
|
|
363
|
+
- Brand: ${brand}
|
|
364
|
+
- Count: ${count}
|
|
365
|
+
- Use 10 proven hook formulas
|
|
366
|
+
- Zero AI slop
|
|
367
|
+
|
|
368
|
+
CRITICAL: Return ONLY a valid JSON array with this exact structure, NO explanation text:
|
|
369
|
+
[
|
|
370
|
+
{"hook": "hook text here", "formula": "formula name", "rationale": "why it works"},
|
|
371
|
+
{"hook": "hook text here", "formula": "formula name", "rationale": "why it works"}
|
|
372
|
+
]
|
|
373
|
+
|
|
374
|
+
Do not include any text before or after the JSON array. Start with [ and end with ].`;
|
|
375
|
+
|
|
376
|
+
try {
|
|
377
|
+
// Try agent first
|
|
378
|
+
const result = await invokeHookWriter(prompt, {
|
|
379
|
+
timeout: 120000,
|
|
380
|
+
model: 'haiku',
|
|
381
|
+
verbose: false
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
if (result) {
|
|
385
|
+
// Extract JSON from response (may have markdown code blocks or explanation text)
|
|
386
|
+
let jsonText = result.trim();
|
|
387
|
+
|
|
388
|
+
// Remove markdown code blocks if present
|
|
389
|
+
jsonText = jsonText.replace(/^```json\s*/i, '').replace(/^```\s*/, '').replace(/\s*```$/, '');
|
|
390
|
+
|
|
391
|
+
// Try to find JSON array in the text
|
|
392
|
+
const arrayMatch = jsonText.match(/\[[\s\S]*\]/);
|
|
393
|
+
if (arrayMatch) {
|
|
394
|
+
jsonText = arrayMatch[0];
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const hooks = JSON.parse(jsonText);
|
|
398
|
+
console.log(` ā Agent generated ${hooks.length} hooks\n`);
|
|
399
|
+
return { hooks, method: 'agent' };
|
|
400
|
+
}
|
|
401
|
+
} catch (err) {
|
|
402
|
+
console.log(` ā ļø Agent failed: ${err.message}`);
|
|
403
|
+
console.log(` āŖ Falling back to direct API...\n`);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// Fallback: Direct Anthropic API
|
|
407
|
+
console.log(` š Using direct Anthropic API as fallback...\n`);
|
|
408
|
+
|
|
409
|
+
const Anthropic = require('@anthropic-ai/sdk');
|
|
410
|
+
const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
411
|
+
|
|
412
|
+
const message = await anthropic.messages.create({
|
|
413
|
+
model: 'claude-3-5-haiku-20241022',
|
|
414
|
+
max_tokens: 4096,
|
|
415
|
+
messages: [{ role: 'user', content: prompt }]
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// Extract JSON from response
|
|
419
|
+
let jsonText = message.content[0].text.trim();
|
|
420
|
+
jsonText = jsonText.replace(/^```json\s*/i, '').replace(/^```\s*/, '').replace(/\s*```$/, '');
|
|
421
|
+
const arrayMatch = jsonText.match(/\[[\s\S]*\]/);
|
|
422
|
+
if (arrayMatch) {
|
|
423
|
+
jsonText = arrayMatch[0];
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
const hooks = JSON.parse(jsonText);
|
|
427
|
+
console.log(` ā API generated ${hooks.length} hooks\n`);
|
|
428
|
+
return { hooks, method: 'api' };
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Select top 3 hooks using Claude via claude-hook-selector.js (Hybrid)
|
|
433
|
+
*
|
|
434
|
+
* The hybrid selector auto-detects environment:
|
|
435
|
+
* - If API key available: uses Anthropic API
|
|
436
|
+
* - If no API key: outputs scoring request for manual handling
|
|
437
|
+
*/
|
|
438
|
+
async function selectTopHooksWithClaude(hooksFile, platform, brand, topCount = 3) {
|
|
439
|
+
console.log(`\n š¤ Selecting top ${topCount} hooks with Claude (Hybrid)...\n`);
|
|
440
|
+
|
|
441
|
+
const selectorPath = path.join(
|
|
442
|
+
process.cwd(),
|
|
443
|
+
'scripts/hooks/claude-hook-selector.js'
|
|
444
|
+
);
|
|
445
|
+
|
|
446
|
+
const outputFile = path.join('/tmp', `selected-hooks-${Date.now()}.json`);
|
|
447
|
+
|
|
448
|
+
try {
|
|
449
|
+
// Pass ANTHROPIC_API_KEY if available
|
|
450
|
+
const envVars = { ...process.env };
|
|
451
|
+
|
|
452
|
+
const command = `node "${selectorPath}" \
|
|
453
|
+
--hooks-file "${hooksFile}" \
|
|
454
|
+
--platform ${platform} \
|
|
455
|
+
--brand ${brand} \
|
|
456
|
+
--top-count ${topCount} \
|
|
457
|
+
--output "${outputFile}"`;
|
|
458
|
+
|
|
459
|
+
execSync(command, {
|
|
460
|
+
stdio: 'inherit',
|
|
461
|
+
encoding: 'utf-8',
|
|
462
|
+
env: envVars
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// Check if output file exists (API method succeeded)
|
|
466
|
+
if (fs.existsSync(outputFile)) {
|
|
467
|
+
const selectionData = JSON.parse(fs.readFileSync(outputFile, 'utf-8'));
|
|
468
|
+
return selectionData;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Check for request file (Agent method - needs manual handling)
|
|
472
|
+
const requestFile = outputFile.replace('.json', '-request.json');
|
|
473
|
+
if (fs.existsSync(requestFile)) {
|
|
474
|
+
console.log(`\n ā ļø Hybrid selector created scoring request (no API key)`);
|
|
475
|
+
console.log(` š Request file: ${requestFile}`);
|
|
476
|
+
console.log(`\n š” To complete: Set ANTHROPIC_API_KEY or run in Claude Code with Task tool\n`);
|
|
477
|
+
|
|
478
|
+
throw new Error('Scoring request created - manual intervention needed. See request file: ' + requestFile);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
throw new Error('No output file or request file found');
|
|
482
|
+
|
|
483
|
+
} catch (error) {
|
|
484
|
+
throw new Error(`Claude selection failed: ${error.message}`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Extract topic from content (first heading or first sentence)
|
|
490
|
+
*/
|
|
491
|
+
function extractTopic(content) {
|
|
492
|
+
// Try to find first H1 heading
|
|
493
|
+
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
494
|
+
if (h1Match) {
|
|
495
|
+
return h1Match[1].trim();
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// Try first sentence
|
|
499
|
+
const firstSentence = content.split(/[.!?]/)[0].trim();
|
|
500
|
+
if (firstSentence && firstSentence.length < 150) {
|
|
501
|
+
return firstSentence;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// Fallback to first 100 characters
|
|
505
|
+
return content.substring(0, 100).replace(/\n/g, ' ').trim();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Convert volume mode hooks to unified format
|
|
510
|
+
*/
|
|
511
|
+
function convertVolumeHooksToUnifiedFormat(topHooks) {
|
|
512
|
+
return topHooks.map(hook => ({
|
|
513
|
+
hook_text: hook.hook,
|
|
514
|
+
pattern: hook.pattern || 'volume_generated',
|
|
515
|
+
why_it_works: hook.selection_reasoning || 'Claude selected as top performer',
|
|
516
|
+
estimated_score: hook.total_score,
|
|
517
|
+
dimension_scores: hook.dimension_scores,
|
|
518
|
+
strengths: hook.strengths || [],
|
|
519
|
+
weaknesses: hook.weaknesses || [],
|
|
520
|
+
primary_emotion: hook.primary_emotion || 'unknown'
|
|
521
|
+
}));
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Main execution
|
|
525
|
+
async function main() {
|
|
526
|
+
const options = parseArgs();
|
|
527
|
+
|
|
528
|
+
// Validate required options
|
|
529
|
+
if (!options.content || !options.platform) {
|
|
530
|
+
console.error('Usage: node generate-hooks-unified.js --content <path> --platform <platform> [--brand <brand>] [--niche <niche>] [--count <number>] [--volume] [--model <model>]');
|
|
531
|
+
process.exit(1);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const {
|
|
535
|
+
content: contentPath,
|
|
536
|
+
platform,
|
|
537
|
+
brand = 'default',
|
|
538
|
+
count = 3,
|
|
539
|
+
volume = false,
|
|
540
|
+
model = 'claude-haiku',
|
|
541
|
+
niche = null
|
|
542
|
+
} = options;
|
|
543
|
+
|
|
544
|
+
const resolvedNiche = niche || BRAND_NICHE_MAP[brand.toLowerCase()] || null;
|
|
545
|
+
|
|
546
|
+
// Determine mode
|
|
547
|
+
const isVolumeMode = volume === 'true' || volume === true || parseInt(count) >= 20;
|
|
548
|
+
|
|
549
|
+
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
550
|
+
console.log(`šÆ Unified Hook Generator v3.0 ${isVolumeMode ? '- VOLUME MODE (Haiku + Sonnet + Ralph)' : ''}`);
|
|
551
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
552
|
+
console.log(` Platform: ${platform}`);
|
|
553
|
+
console.log(` Brand: ${brand}`);
|
|
554
|
+
console.log(` Niche: ${resolvedNiche || 'auto-detect'}`);
|
|
555
|
+
console.log(` Hooks to generate: ${count}`);
|
|
556
|
+
console.log(` Mode: ${isVolumeMode ? 'Volume (50 hooks ā Claude selects top 3)' : 'Standard (Gemini generates count)'}`);
|
|
557
|
+
if (isVolumeMode) {
|
|
558
|
+
console.log(` Model: ${model}`);
|
|
559
|
+
}
|
|
560
|
+
console.log('');
|
|
561
|
+
|
|
562
|
+
try {
|
|
563
|
+
let rankedHooks;
|
|
564
|
+
|
|
565
|
+
if (isVolumeMode) {
|
|
566
|
+
// ===================================================================
|
|
567
|
+
// VOLUME MODE: Generate 50, Claude selects top 3
|
|
568
|
+
// ===================================================================
|
|
569
|
+
|
|
570
|
+
const useHaikuAgent = model === 'claude-haiku' || model === 'default' || !model.includes('gemini');
|
|
571
|
+
const generatorName = useHaikuAgent ? 'Claude Haiku (Agent)' : 'Gemini';
|
|
572
|
+
|
|
573
|
+
console.log(' š„ Volume Mode Activated\n');
|
|
574
|
+
console.log(` Step 1: Generate ${count} hooks with ${generatorName}`);
|
|
575
|
+
console.log(` Step 2: Sonnet scores all ${count} hooks`);
|
|
576
|
+
console.log(` Step 3: Ralph enhancement ā 90-95/100\n`);
|
|
577
|
+
|
|
578
|
+
let hooksData, outputFile;
|
|
579
|
+
|
|
580
|
+
// Step 1: Generate volume hooks
|
|
581
|
+
if (useHaikuAgent) {
|
|
582
|
+
// Use Haiku agent invocation (primary for v3.0)
|
|
583
|
+
const content = readContent(contentPath);
|
|
584
|
+
const { hooks, method } = await generateVolumeHooksWithAgent(content, platform, brand, parseInt(count));
|
|
585
|
+
|
|
586
|
+
// Save to temp file for selector
|
|
587
|
+
outputFile = path.join('/tmp', `volume-hooks-${Date.now()}.json`);
|
|
588
|
+
hooksData = { hooks };
|
|
589
|
+
fs.writeFileSync(outputFile, JSON.stringify(hooksData, null, 2));
|
|
590
|
+
|
|
591
|
+
console.log(` ā Generated ${hooks.length} hooks via ${method}`);
|
|
592
|
+
} else {
|
|
593
|
+
// Use Gemini volume generator (fallback)
|
|
594
|
+
const result = await generateVolumeHooks(
|
|
595
|
+
contentPath,
|
|
596
|
+
platform,
|
|
597
|
+
brand,
|
|
598
|
+
parseInt(count),
|
|
599
|
+
model
|
|
600
|
+
);
|
|
601
|
+
hooksData = result.hooksData;
|
|
602
|
+
outputFile = result.outputFile;
|
|
603
|
+
console.log(` ā Generated ${hooksData.hooks.length} hooks`);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// Step 2 & 3: Claude selection
|
|
607
|
+
const selectionResult = await selectTopHooksWithClaude(
|
|
608
|
+
outputFile,
|
|
609
|
+
platform,
|
|
610
|
+
brand,
|
|
611
|
+
3 // Always return top 3
|
|
612
|
+
);
|
|
613
|
+
|
|
614
|
+
console.log(` ā Selected top ${selectionResult.top_hooks.length} hooks\n`);
|
|
615
|
+
|
|
616
|
+
// Convert to unified format
|
|
617
|
+
rankedHooks = convertVolumeHooksToUnifiedFormat(selectionResult.top_hooks);
|
|
618
|
+
|
|
619
|
+
} else {
|
|
620
|
+
// ===================================================================
|
|
621
|
+
// STANDARD MODE: Original behavior (3 hooks)
|
|
622
|
+
// ===================================================================
|
|
623
|
+
|
|
624
|
+
// 1. Load platform hook database
|
|
625
|
+
const hookDatabase = loadPlatformHooks(platform, resolvedNiche);
|
|
626
|
+
|
|
627
|
+
// 2. Read content
|
|
628
|
+
const content = readContent(contentPath);
|
|
629
|
+
console.log(` ā Loaded content (${content.length} chars)\n`);
|
|
630
|
+
|
|
631
|
+
// 3. Extract elements
|
|
632
|
+
const elements = extractContentElements(content);
|
|
633
|
+
|
|
634
|
+
// 4. Generate hooks with Gemini CLI
|
|
635
|
+
const hooks = await generateHooksWithGemini(platform, hookDatabase, content, elements, parseInt(count));
|
|
636
|
+
|
|
637
|
+
// 5. Score and rank
|
|
638
|
+
rankedHooks = scoreAndRankHooks(hooks, platform);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// ===================================================================
|
|
642
|
+
// STEP 3: RALPH ENHANCEMENT (NEW)
|
|
643
|
+
// ===================================================================
|
|
644
|
+
|
|
645
|
+
if (isVolumeMode) {
|
|
646
|
+
console.log('\n šØ Step 3: Ralph Enhancement...\n');
|
|
647
|
+
|
|
648
|
+
const { enhanceHookBatch } = require('./ralph-hook-enhancer.js');
|
|
649
|
+
|
|
650
|
+
const enhancedHooks = await enhanceHookBatch(
|
|
651
|
+
rankedHooks.slice(0, 3), // Top 3 from Sonnet
|
|
652
|
+
platform,
|
|
653
|
+
brand,
|
|
654
|
+
85 // Target score (realistic: 75-85/100 is excellent)
|
|
655
|
+
);
|
|
656
|
+
|
|
657
|
+
console.log(` ā Enhanced ${enhancedHooks.length} hooks\n`);
|
|
658
|
+
|
|
659
|
+
// Replace rankedHooks with enhanced versions
|
|
660
|
+
rankedHooks = enhancedHooks;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// ===================================================================
|
|
664
|
+
// OUTPUT RESULTS (same for both modes)
|
|
665
|
+
// ===================================================================
|
|
666
|
+
|
|
667
|
+
console.log('\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
668
|
+
console.log('ā
Hook Generation Complete');
|
|
669
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
670
|
+
|
|
671
|
+
rankedHooks.forEach((hook, i) => {
|
|
672
|
+
console.log(`HOOK ${i + 1} (Score: ${hook.estimated_score}/100):`);
|
|
673
|
+
console.log(`"${hook.hook_text}"`);
|
|
674
|
+
console.log(`Pattern: ${hook.pattern}`);
|
|
675
|
+
console.log(`Why it works: ${hook.why_it_works}`);
|
|
676
|
+
|
|
677
|
+
// Show enhancement info if available
|
|
678
|
+
if (hook.enhanced) {
|
|
679
|
+
console.log(`Enhanced: ${hook.iterations} iterations`);
|
|
680
|
+
console.log(`Improvement: +${hook.improvement_delta} points`);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// Volume mode shows additional details
|
|
684
|
+
if (isVolumeMode && hook.dimension_scores) {
|
|
685
|
+
console.log(`Dimension scores:`);
|
|
686
|
+
Object.entries(hook.dimension_scores).forEach(([dim, score]) => {
|
|
687
|
+
console.log(` - ${dim}: ${score}`);
|
|
688
|
+
});
|
|
689
|
+
if (hook.strengths && hook.strengths.length > 0) {
|
|
690
|
+
console.log(`Strengths: ${hook.strengths.join(', ')}`);
|
|
691
|
+
}
|
|
692
|
+
} else if (hook.similar_to_example) {
|
|
693
|
+
console.log(`Similar to example: #${hook.similar_to_example}`);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
console.log('');
|
|
697
|
+
});
|
|
698
|
+
|
|
699
|
+
// Output JSON for programmatic use
|
|
700
|
+
console.log('JSON OUTPUT:');
|
|
701
|
+
console.log(JSON.stringify({
|
|
702
|
+
hooks: rankedHooks,
|
|
703
|
+
platform,
|
|
704
|
+
brand,
|
|
705
|
+
mode: isVolumeMode ? 'volume' : 'standard'
|
|
706
|
+
}, null, 2));
|
|
707
|
+
|
|
708
|
+
} catch (error) {
|
|
709
|
+
console.error(`\nā Error: ${error.message}`);
|
|
710
|
+
if (error.stack) {
|
|
711
|
+
console.error(error.stack);
|
|
712
|
+
}
|
|
713
|
+
process.exit(1);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
// Run if called directly
|
|
718
|
+
if (require.main === module) {
|
|
719
|
+
main();
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
module.exports = { generateHooksWithGemini, loadPlatformHooks };
|