@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,325 @@
|
|
|
1
|
+
# SERP Clustering Algorithm
|
|
2
|
+
|
|
3
|
+
**Purpose**: Prevent keyword cannibalization by grouping keywords with identical search intent
|
|
4
|
+
|
|
5
|
+
## The Problem: Keyword Cannibalization
|
|
6
|
+
|
|
7
|
+
When multiple pages on your site target keywords with the same search intent, they compete against each other for rankings. Google will typically only rank one page from your site for a given search intent, so multiple pages dilute your authority instead of multiplying it.
|
|
8
|
+
|
|
9
|
+
**Example**:
|
|
10
|
+
- Page A targets "email marketing tools"
|
|
11
|
+
- Page B targets "best email marketing software"
|
|
12
|
+
- SERP overlap: 85% (same domains appear in top 10)
|
|
13
|
+
- Result: Pages compete, both rank lower than if you had one comprehensive page
|
|
14
|
+
|
|
15
|
+
## The Solution: SERP-Based Clustering
|
|
16
|
+
|
|
17
|
+
Group keywords by analyzing their search results. If two keywords show the same URLs in their top 10 results, Google considers them to have the same search intent.
|
|
18
|
+
|
|
19
|
+
## Algorithm
|
|
20
|
+
|
|
21
|
+
### Step 1: Fetch SERP URLs
|
|
22
|
+
For each keyword in your universe:
|
|
23
|
+
1. Query Google (or SERP API)
|
|
24
|
+
2. Extract top 10 organic results
|
|
25
|
+
3. Store: `[keyword → [url1, url2, ..., url10]]`
|
|
26
|
+
4. Rate limit: 2-3 seconds between requests (avoid blocking)
|
|
27
|
+
5. Cache results (SERPs don't change daily)
|
|
28
|
+
|
|
29
|
+
### Step 2: Calculate Jaccard Similarity
|
|
30
|
+
For each pair of keywords, calculate URL overlap:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Jaccard Similarity = |A ∩ B| / |A ∪ B|
|
|
34
|
+
|
|
35
|
+
Where:
|
|
36
|
+
- A = Set of domains in keyword A's top 10
|
|
37
|
+
- B = Set of domains in keyword B's top 10
|
|
38
|
+
- ∩ = Intersection (domains in both sets)
|
|
39
|
+
- ∪ = Union (all unique domains)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Example**:
|
|
43
|
+
```
|
|
44
|
+
Keyword A top 10 domains: [zapier.com, buffer.com, hootsuite.com, hubspot.com, semrush.com, ahrefs.com, moz.com, ...]
|
|
45
|
+
Keyword B top 10 domains: [zapier.com, buffer.com, hootsuite.com, hubspot.com, mailchimp.com, sendgrid.com, activecampaign.com, ...]
|
|
46
|
+
|
|
47
|
+
Intersection: [zapier.com, buffer.com, hootsuite.com, hubspot.com] = 4 domains
|
|
48
|
+
Union: 13 unique domains
|
|
49
|
+
|
|
50
|
+
Jaccard Similarity = 4 / 13 = 0.31 (31% overlap)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Step 3: Three-Tier Classification
|
|
54
|
+
|
|
55
|
+
**Tier 1: Obvious Same Intent (≥70% overlap)**
|
|
56
|
+
- Action: Group into same cluster automatically
|
|
57
|
+
- Reason: High overlap = Google sees these as identical intent
|
|
58
|
+
- Example: "email marketing tools" vs "best email marketing software" (85% overlap)
|
|
59
|
+
- Cost: Free (no AI needed)
|
|
60
|
+
|
|
61
|
+
**Tier 2: Ambiguous (30-69% overlap)**
|
|
62
|
+
- Action: Use Gemini/GPT-4 to analyze intent
|
|
63
|
+
- Reason: Medium overlap = unclear if intent is same or different
|
|
64
|
+
- Example: "content marketing tools" vs "social media marketing tools" (45% overlap)
|
|
65
|
+
- Cost: ~$0.001 per comparison
|
|
66
|
+
- Optimization: Only call AI for ambiguous cases (saves 70-80% of AI costs)
|
|
67
|
+
|
|
68
|
+
**Tier 3: Obvious Different Intent (<30% overlap)**
|
|
69
|
+
- Action: Keep in separate clusters automatically
|
|
70
|
+
- Reason: Low overlap = Google sees these as different intent
|
|
71
|
+
- Example: "email marketing" vs "email marketing automation" (25% overlap)
|
|
72
|
+
- Cost: Free (no AI needed)
|
|
73
|
+
|
|
74
|
+
### Step 4: Gemini Intent Analysis (Tier 2 Only)
|
|
75
|
+
|
|
76
|
+
**Prompt Template**:
|
|
77
|
+
```
|
|
78
|
+
You are an SEO search intent analyzer.
|
|
79
|
+
Compare these two keywords and determine if they have the SAME search intent (should be on same page) or DIFFERENT intent (need separate pages).
|
|
80
|
+
|
|
81
|
+
Keyword 1: "{keyword1}"
|
|
82
|
+
Keyword 2: "{keyword2}"
|
|
83
|
+
|
|
84
|
+
Return ONLY "SAME" or "DIFFERENT". No explanation.
|
|
85
|
+
|
|
86
|
+
SAME = Same topic, same user goal, same type of content expected
|
|
87
|
+
DIFFERENT = Different topics, different user goals, or different content types
|
|
88
|
+
|
|
89
|
+
Examples:
|
|
90
|
+
Q: "email marketing tools" vs "best email marketing software" → SAME
|
|
91
|
+
Q: "email marketing" vs "email marketing automation" → DIFFERENT
|
|
92
|
+
Q: "content calendar" vs "social media calendar" → SAME
|
|
93
|
+
Q: "seo tools" vs "seo strategy" → DIFFERENT
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Response Parsing**:
|
|
97
|
+
- If response contains "SAME" → Group into same cluster
|
|
98
|
+
- If response contains "DIFFERENT" → Keep in separate clusters
|
|
99
|
+
- If error/timeout → Default to DIFFERENT (conservative approach)
|
|
100
|
+
|
|
101
|
+
### Step 5: Cluster Merging
|
|
102
|
+
|
|
103
|
+
After pairwise comparisons, merge overlapping clusters:
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
// Cluster building algorithm
|
|
107
|
+
const clusters = [];
|
|
108
|
+
|
|
109
|
+
for (const [kw1, kw2] of keyword_pairs) {
|
|
110
|
+
const similarity = calculateJaccardSimilarity(kw1, kw2);
|
|
111
|
+
let shouldCluster = false;
|
|
112
|
+
|
|
113
|
+
if (similarity >= 0.7) {
|
|
114
|
+
shouldCluster = true; // Obvious same
|
|
115
|
+
} else if (similarity < 0.3) {
|
|
116
|
+
shouldCluster = false; // Obvious different
|
|
117
|
+
} else {
|
|
118
|
+
shouldCluster = analyzeIntentWithGemini(kw1, kw2); // Ambiguous
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (shouldCluster) {
|
|
122
|
+
// Find existing cluster or create new one
|
|
123
|
+
let cluster = clusters.find(c => c.keywords.includes(kw1) || c.keywords.includes(kw2));
|
|
124
|
+
|
|
125
|
+
if (cluster) {
|
|
126
|
+
// Add to existing cluster
|
|
127
|
+
if (!cluster.keywords.includes(kw1)) cluster.keywords.push(kw1);
|
|
128
|
+
if (!cluster.keywords.includes(kw2)) cluster.keywords.push(kw2);
|
|
129
|
+
} else {
|
|
130
|
+
// Create new cluster
|
|
131
|
+
clusters.push({ keywords: [kw1, kw2] });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Step 6: Singleton Handling
|
|
138
|
+
|
|
139
|
+
Keywords not clustered with any others become singleton clusters (one keyword = one page).
|
|
140
|
+
|
|
141
|
+
## Cost Optimization
|
|
142
|
+
|
|
143
|
+
**Traditional approach**: Call SERP API + AI for every keyword pair
|
|
144
|
+
- 500 keywords = 124,750 pairs
|
|
145
|
+
- Cost: $0.01 per API call = $1,247.50
|
|
146
|
+
- Time: Hours to days
|
|
147
|
+
|
|
148
|
+
**Our optimized approach**: Jaccard similarity + selective AI
|
|
149
|
+
- Free: 70% obvious same (≥70% overlap)
|
|
150
|
+
- Free: 20% obvious different (<30% overlap)
|
|
151
|
+
- AI: 10% ambiguous (30-69% overlap)
|
|
152
|
+
- Cost for 500 keywords: ~$2-5 (only 12,475 AI calls)
|
|
153
|
+
- Time: 10-30 minutes
|
|
154
|
+
|
|
155
|
+
**Savings**: 99.5% cost reduction
|
|
156
|
+
|
|
157
|
+
## Implementation Details
|
|
158
|
+
|
|
159
|
+
### SERP Fetching Options
|
|
160
|
+
|
|
161
|
+
**Option 1: Free HTTP Requests** (Development)
|
|
162
|
+
```javascript
|
|
163
|
+
async function fetchGoogleSERP(keyword) {
|
|
164
|
+
const url = `https://www.google.com/search?q=${encodeURIComponent(keyword)}`;
|
|
165
|
+
// Parse HTML, extract top 10 domains
|
|
166
|
+
// Rate limit: 2-3 seconds between requests
|
|
167
|
+
// Risk: Google may block after ~100 requests
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Option 2: SERP APIs** (Production)
|
|
172
|
+
- DataForSEO: $0.002 per keyword
|
|
173
|
+
- SerpAPI: $0.004 per keyword
|
|
174
|
+
- ValueSERP: $0.003 per keyword
|
|
175
|
+
- Benefit: Reliable, no blocking, structured data
|
|
176
|
+
|
|
177
|
+
**Option 3: Browser Automation** (Alternative)
|
|
178
|
+
- Puppeteer/Playwright with rotating proxies
|
|
179
|
+
- Cost: Proxy fees (~$5/mo)
|
|
180
|
+
- Benefit: More reliable than raw HTTP
|
|
181
|
+
|
|
182
|
+
### Caching Strategy
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
// Cache SERP results to avoid re-fetching
|
|
186
|
+
const cache = {
|
|
187
|
+
keyword: {
|
|
188
|
+
urls: [...],
|
|
189
|
+
fetchedAt: ISO_timestamp,
|
|
190
|
+
ttl: 30_days // SERPs don't change daily
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Checkpointing
|
|
196
|
+
|
|
197
|
+
For large keyword sets (1,000+), save progress every 100 keywords:
|
|
198
|
+
```javascript
|
|
199
|
+
if (processedCount % 100 === 0) {
|
|
200
|
+
saveCheckpoint(clusters, processedCount);
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Output Format
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"clusters": [
|
|
209
|
+
{
|
|
210
|
+
"id": "cluster-1",
|
|
211
|
+
"keywords": [
|
|
212
|
+
"email marketing tools",
|
|
213
|
+
"best email marketing software",
|
|
214
|
+
"top email marketing platforms"
|
|
215
|
+
],
|
|
216
|
+
"size": 3,
|
|
217
|
+
"primaryKeyword": "email marketing tools",
|
|
218
|
+
"avgOverlap": 0.82
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "cluster-2",
|
|
222
|
+
"keywords": ["email marketing automation"],
|
|
223
|
+
"size": 1,
|
|
224
|
+
"primaryKeyword": "email marketing automation",
|
|
225
|
+
"avgOverlap": 0
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
"summary": {
|
|
229
|
+
"totalKeywords": 500,
|
|
230
|
+
"totalClusters": 87,
|
|
231
|
+
"avgClusterSize": 5.7,
|
|
232
|
+
"singletons": 23,
|
|
233
|
+
"geminiCalls": 12,
|
|
234
|
+
"estimatedCost": "0.012"
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Validation
|
|
240
|
+
|
|
241
|
+
**Quality Checks**:
|
|
242
|
+
1. No keyword appears in multiple clusters (mutual exclusivity)
|
|
243
|
+
2. All keywords accounted for (clustered or singleton)
|
|
244
|
+
3. Cluster sizes make sense (most 1-10 keywords, few outliers)
|
|
245
|
+
4. Primary keyword is most generic in cluster
|
|
246
|
+
|
|
247
|
+
**Manual Spot Checks**:
|
|
248
|
+
- Sample 10 clusters
|
|
249
|
+
- Verify keywords have same intent
|
|
250
|
+
- Check if SERP overlap makes sense
|
|
251
|
+
|
|
252
|
+
## Common Edge Cases
|
|
253
|
+
|
|
254
|
+
### 1. Brand vs Generic Keywords
|
|
255
|
+
```
|
|
256
|
+
"mailchimp" vs "email marketing software"
|
|
257
|
+
```
|
|
258
|
+
- SERP overlap: 15% (mailchimp.com dominates first, not second)
|
|
259
|
+
- Action: Separate clusters (different intent: branded vs category)
|
|
260
|
+
|
|
261
|
+
### 2. How-to vs What-is
|
|
262
|
+
```
|
|
263
|
+
"how to do email marketing" vs "what is email marketing"
|
|
264
|
+
```
|
|
265
|
+
- SERP overlap: 35% (ambiguous)
|
|
266
|
+
- Gemini: DIFFERENT (how-to = implementation, what-is = definition)
|
|
267
|
+
- Action: Separate clusters
|
|
268
|
+
|
|
269
|
+
### 3. Singular vs Plural
|
|
270
|
+
```
|
|
271
|
+
"email marketing tool" vs "email marketing tools"
|
|
272
|
+
```
|
|
273
|
+
- SERP overlap: 95% (nearly identical)
|
|
274
|
+
- Action: Same cluster
|
|
275
|
+
|
|
276
|
+
### 4. Year-Specific Keywords
|
|
277
|
+
```
|
|
278
|
+
"email marketing tools 2024" vs "email marketing tools 2025"
|
|
279
|
+
```
|
|
280
|
+
- SERP overlap: 60% (ambiguous)
|
|
281
|
+
- Gemini: SAME (same intent, just time-specific)
|
|
282
|
+
- Action: Same cluster, update content yearly
|
|
283
|
+
|
|
284
|
+
## Integration with Hub Architecture
|
|
285
|
+
|
|
286
|
+
After clustering:
|
|
287
|
+
1. Large clusters (5+ keywords) → Pillar pages
|
|
288
|
+
2. Medium clusters (2-4 keywords) → Supporting cluster pages
|
|
289
|
+
3. Singletons → Decide: Create page or merge into related cluster
|
|
290
|
+
|
|
291
|
+
## Performance Benchmarks
|
|
292
|
+
|
|
293
|
+
**500 keywords**:
|
|
294
|
+
- SERP fetching: 5-10 minutes (with rate limiting)
|
|
295
|
+
- Jaccard calculation: <1 minute (local computation)
|
|
296
|
+
- Gemini calls: 2-5 minutes (only 10-15% of pairs)
|
|
297
|
+
- Total time: 10-20 minutes
|
|
298
|
+
- Total cost: $2-5
|
|
299
|
+
|
|
300
|
+
**1,000 keywords**:
|
|
301
|
+
- SERP fetching: 15-30 minutes
|
|
302
|
+
- Jaccard calculation: 2-3 minutes
|
|
303
|
+
- Gemini calls: 5-10 minutes
|
|
304
|
+
- Total time: 25-45 minutes
|
|
305
|
+
- Total cost: $5-10
|
|
306
|
+
|
|
307
|
+
## Troubleshooting
|
|
308
|
+
|
|
309
|
+
**Issue**: Google blocking requests
|
|
310
|
+
- Solution: Use SERP API or browser automation with proxies
|
|
311
|
+
|
|
312
|
+
**Issue**: High Gemini costs
|
|
313
|
+
- Solution: Increase ambiguous threshold (30-69% → 40-60%)
|
|
314
|
+
|
|
315
|
+
**Issue**: Too many singletons
|
|
316
|
+
- Solution: Lower clustering threshold (70% → 60%)
|
|
317
|
+
|
|
318
|
+
**Issue**: Too few clusters
|
|
319
|
+
- Solution: Raise clustering threshold (70% → 80%)
|
|
320
|
+
|
|
321
|
+
## References
|
|
322
|
+
|
|
323
|
+
- Jake Ward's SERP Clustering Method
|
|
324
|
+
- Jaccard Similarity Algorithm
|
|
325
|
+
- Implementation: `scripts/seo/gemini-serp-clustering.js`
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Topical Authority Orchestrator
|
|
5
|
+
*
|
|
6
|
+
* Coordinates all 12 topical authority scripts using Gemini CLI for token efficiency.
|
|
7
|
+
* Delegates script execution to Gemini CLI, tracks progress, validates outputs.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* node .claude/skills/topical-authority/scripts/orchestrator.js --brand ai.withjai --phase all
|
|
11
|
+
* node .claude/skills/topical-authority/scripts/orchestrator.js --brand ai.withjai --phase discover
|
|
12
|
+
* node .claude/skills/topical-authority/scripts/orchestrator.js --brand ai.withjai --phase cluster
|
|
13
|
+
* node .claude/skills/topical-authority/scripts/orchestrator.js --brand ai.withjai --phase analyze
|
|
14
|
+
*
|
|
15
|
+
* Phases:
|
|
16
|
+
* discover - Forum discovery (scripts 1-5)
|
|
17
|
+
* cluster - SERP clustering (scripts 6-8)
|
|
18
|
+
* analyze - Gap analysis + linking (scripts 9-12)
|
|
19
|
+
* all - Run complete workflow
|
|
20
|
+
*
|
|
21
|
+
* Token Optimization:
|
|
22
|
+
* All script execution delegated to Gemini CLI = 95%+ token savings
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const { spawnSync } = require('child_process');
|
|
26
|
+
const { fs, path, fromConfig, parseArgs, ensureDir } = require('../../../../scripts/utils/_utils');
|
|
27
|
+
|
|
28
|
+
const MODEL = process.env.GEMINI_MODEL || 'gemini-2.0-flash-exp';
|
|
29
|
+
|
|
30
|
+
const PHASES = {
|
|
31
|
+
discover: {
|
|
32
|
+
name: 'Forum Discovery & Keyword Extraction',
|
|
33
|
+
scripts: [
|
|
34
|
+
{ id: 1, file: 'scripts/seo/scrape-reddit-pain-points.js', args: '--brand {brand}' },
|
|
35
|
+
{ id: 2, file: 'scripts/seo/scrape-quora-questions.js', args: '--brand {brand} --topics "{topics}"' },
|
|
36
|
+
{ id: 3, file: 'scripts/seo/extract-paa-questions.js', args: '--brand {brand} --seed-keywords "{seedKeywords}"' },
|
|
37
|
+
{ id: 4, file: 'scripts/seo/analyze-competitor-coverage.js', args: '--brand {brand}' },
|
|
38
|
+
{ id: 5, file: 'scripts/seo/extract-keywords-from-forums.js', args: '--brand {brand} --target {target}' }
|
|
39
|
+
],
|
|
40
|
+
outputs: [
|
|
41
|
+
'brands/{brand}/content/02-strategy/forum-data/reddit-pain-points.json',
|
|
42
|
+
'brands/{brand}/content/02-strategy/forum-data/quora-questions.json',
|
|
43
|
+
'brands/{brand}/content/02-strategy/forum-data/paa-questions.json',
|
|
44
|
+
'brands/{brand}/content/02-strategy/forum-data/competitor-coverage.json',
|
|
45
|
+
'brands/{brand}/content/02-strategy/keyword-universe.json'
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
cluster: {
|
|
49
|
+
name: 'SERP Clustering & Hub Architecture',
|
|
50
|
+
scripts: [
|
|
51
|
+
{ id: 6, file: 'scripts/seo/fetch-serp-urls.js', args: '--brand {brand} --limit {limit}' },
|
|
52
|
+
{ id: 7, file: 'scripts/seo/gemini-serp-clustering.js', args: '--brand {brand} --threshold {threshold}' },
|
|
53
|
+
{ id: 8, file: 'scripts/seo/build-clusters-from-serp.js', args: '--brand {brand} --min-cluster-size {minClusterSize}' }
|
|
54
|
+
],
|
|
55
|
+
outputs: [
|
|
56
|
+
'brands/{brand}/content/02-strategy/serp-data/serp-urls.json',
|
|
57
|
+
'brands/{brand}/content/02-strategy/serp-data/keyword-clusters.json',
|
|
58
|
+
'brands/{brand}/content/02-strategy/hub-architecture.json'
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
analyze: {
|
|
62
|
+
name: 'Gap Analysis & Internal Linking',
|
|
63
|
+
scripts: [
|
|
64
|
+
{ id: 9, file: 'scripts/seo/identify-content-gaps.js', args: '--brand {brand} --min-volume {minVolume}' },
|
|
65
|
+
{ id: 10, file: 'scripts/seo/identify-research-gaps.js', args: '--brand {brand} --min-priority {minPriority}' },
|
|
66
|
+
{ id: 11, file: 'scripts/seo/audit-internal-links.js', args: '--brand {brand} --min-links {minLinks}' },
|
|
67
|
+
{ id: 12, file: 'scripts/seo/weave-internal-links.js', args: '--brand {brand} {autoInsert}' }
|
|
68
|
+
],
|
|
69
|
+
outputs: [
|
|
70
|
+
'brands/{brand}/content/02-strategy/content-gaps.json',
|
|
71
|
+
'brands/{brand}/content/02-strategy/research-gaps.json',
|
|
72
|
+
'brands/{brand}/content/02-strategy/internal-links-graph.json',
|
|
73
|
+
'brands/{brand}/content/02-strategy/link-suggestions.md'
|
|
74
|
+
]
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
function main() {
|
|
79
|
+
const args = parseArgs();
|
|
80
|
+
const { brand } = fromConfig(args.brand);
|
|
81
|
+
|
|
82
|
+
if (!brand) {
|
|
83
|
+
console.error('❌ Brand not specified. Use --brand {brand}');
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const phase = args.phase || 'all';
|
|
88
|
+
const validPhases = ['discover', 'cluster', 'analyze', 'all'];
|
|
89
|
+
|
|
90
|
+
if (!validPhases.includes(phase)) {
|
|
91
|
+
console.error(`❌ Invalid phase: ${phase}`);
|
|
92
|
+
console.error(` Valid phases: ${validPhases.join(', ')}`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Collect parameters
|
|
97
|
+
const params = {
|
|
98
|
+
brand,
|
|
99
|
+
topics: args.topics || getDefaultTopics(brand),
|
|
100
|
+
seedKeywords: args['seed-keywords'] || getDefaultSeedKeywords(brand),
|
|
101
|
+
target: args.target ? Number(args.target) : 1000,
|
|
102
|
+
limit: args.limit ? Number(args.limit) : 100,
|
|
103
|
+
threshold: args.threshold ? Number(args.threshold) : 0.7,
|
|
104
|
+
minClusterSize: args['min-cluster-size'] ? Number(args['min-cluster-size']) : 3,
|
|
105
|
+
minVolume: args['min-volume'] ? Number(args['min-volume']) : 100,
|
|
106
|
+
minPriority: args['min-priority'] ? Number(args['min-priority']) : 2,
|
|
107
|
+
minLinks: args['min-links'] ? Number(args['min-links']) : 3,
|
|
108
|
+
autoInsert: args['auto-insert'] ? '--auto-insert' : ''
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
console.log('🎯 Topical Authority Orchestrator');
|
|
112
|
+
console.log('════════════════════════════════════════════════════════════');
|
|
113
|
+
console.log(`Brand: ${brand}`);
|
|
114
|
+
console.log(`Phase: ${phase}`);
|
|
115
|
+
console.log(`Model: ${MODEL}`);
|
|
116
|
+
console.log('════════════════════════════════════════════════════════════\n');
|
|
117
|
+
|
|
118
|
+
const phasesToRun = phase === 'all'
|
|
119
|
+
? ['discover', 'cluster', 'analyze']
|
|
120
|
+
: [phase];
|
|
121
|
+
|
|
122
|
+
const startTime = Date.now();
|
|
123
|
+
const results = {};
|
|
124
|
+
|
|
125
|
+
phasesToRun.forEach((phaseName, idx) => {
|
|
126
|
+
console.log(`\n${'='.repeat(60)}`);
|
|
127
|
+
console.log(`Phase ${idx + 1}/${phasesToRun.length}: ${PHASES[phaseName].name}`);
|
|
128
|
+
console.log('='.repeat(60));
|
|
129
|
+
|
|
130
|
+
const result = runPhaseWithGemini(phaseName, params);
|
|
131
|
+
results[phaseName] = result;
|
|
132
|
+
|
|
133
|
+
if (!result.success) {
|
|
134
|
+
console.error(`\n❌ Phase "${phaseName}" failed. Stopping workflow.`);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
140
|
+
|
|
141
|
+
console.log('\n' + '='.repeat(60));
|
|
142
|
+
console.log('✅ Topical Authority Workflow Complete');
|
|
143
|
+
console.log('='.repeat(60));
|
|
144
|
+
console.log(`Duration: ${duration}s`);
|
|
145
|
+
console.log(`\nPhase Results:`);
|
|
146
|
+
|
|
147
|
+
Object.entries(results).forEach(([phaseName, result]) => {
|
|
148
|
+
console.log(` • ${PHASES[phaseName].name}: ${result.success ? '✅' : '❌'}`);
|
|
149
|
+
if (result.summary) {
|
|
150
|
+
console.log(` ${result.summary}`);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
console.log(`\n📊 Outputs saved to: brands/${brand}/content/02-strategy/`);
|
|
155
|
+
console.log(`\n💡 Next steps:`);
|
|
156
|
+
|
|
157
|
+
if (phase === 'all' || phase === 'analyze') {
|
|
158
|
+
console.log(` 1. Review research gaps: brands/${brand}/content/02-strategy/research-gaps.json`);
|
|
159
|
+
console.log(` 2. Review content opportunities: brands/${brand}/content/02-strategy/content-gaps.json`);
|
|
160
|
+
console.log(` 3. Review link suggestions: brands/${brand}/content/02-strategy/link-suggestions.md`);
|
|
161
|
+
console.log(` 4. Start content creation for GOLDEN opportunities`);
|
|
162
|
+
} else if (phase === 'discover') {
|
|
163
|
+
console.log(` Run SERP clustering: node .claude/skills/topical-authority/scripts/orchestrator.js --brand ${brand} --phase cluster`);
|
|
164
|
+
} else if (phase === 'cluster') {
|
|
165
|
+
console.log(` Run gap analysis: node .claude/skills/topical-authority/scripts/orchestrator.js --brand ${brand} --phase analyze`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function runPhaseWithGemini(phaseName, params) {
|
|
170
|
+
const phase = PHASES[phaseName];
|
|
171
|
+
|
|
172
|
+
console.log(`\n🤖 Delegating to Gemini CLI for execution...`);
|
|
173
|
+
console.log(` Scripts to run: ${phase.scripts.length}`);
|
|
174
|
+
|
|
175
|
+
const prompt = buildGeminiPrompt(phaseName, phase, params);
|
|
176
|
+
|
|
177
|
+
const proc = spawnSync('gemini', ['-m', MODEL, '-p', prompt], {
|
|
178
|
+
encoding: 'utf8',
|
|
179
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB
|
|
180
|
+
timeout: 600000 // 10 minutes
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
if (proc.error || proc.status !== 0) {
|
|
184
|
+
console.error(`\n❌ Gemini CLI error:`);
|
|
185
|
+
console.error(proc.stderr || proc.error?.message);
|
|
186
|
+
return { success: false, error: proc.stderr || proc.error?.message };
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const output = proc.stdout;
|
|
190
|
+
console.log(`\n📋 Gemini CLI Output:`);
|
|
191
|
+
console.log(output);
|
|
192
|
+
|
|
193
|
+
// Validate outputs exist
|
|
194
|
+
const validationResult = validatePhaseOutputs(phaseName, params.brand);
|
|
195
|
+
|
|
196
|
+
if (!validationResult.success) {
|
|
197
|
+
console.error(`\n❌ Output validation failed:`);
|
|
198
|
+
console.error(` Missing: ${validationResult.missing.join(', ')}`);
|
|
199
|
+
return { success: false, error: 'Output validation failed', ...validationResult };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
console.log(`\n✅ Phase "${phaseName}" completed successfully`);
|
|
203
|
+
console.log(` Outputs: ${validationResult.found.length}/${validationResult.expected.length}`);
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
success: true,
|
|
207
|
+
outputs: validationResult.found,
|
|
208
|
+
summary: extractSummary(output)
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function buildGeminiPrompt(phaseName, phase, params) {
|
|
213
|
+
const lines = [];
|
|
214
|
+
|
|
215
|
+
lines.push(`You are a topical authority automation assistant. Execute the following scripts sequentially and report results.`);
|
|
216
|
+
lines.push(``);
|
|
217
|
+
lines.push(`**Phase**: ${phase.name}`);
|
|
218
|
+
lines.push(`**Brand**: ${params.brand}`);
|
|
219
|
+
lines.push(``);
|
|
220
|
+
lines.push(`**Scripts to Execute**:`);
|
|
221
|
+
lines.push(``);
|
|
222
|
+
|
|
223
|
+
phase.scripts.forEach((script, idx) => {
|
|
224
|
+
const cmd = `node ${script.file} ${interpolateArgs(script.args, params)}`;
|
|
225
|
+
lines.push(`${idx + 1}. Script: ${script.file}`);
|
|
226
|
+
lines.push(` Command: ${cmd}`);
|
|
227
|
+
lines.push(``);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
lines.push(`**Instructions**:`);
|
|
231
|
+
lines.push(`1. Execute each script in order using the Node.js runtime`);
|
|
232
|
+
lines.push(`2. Wait for each script to complete before starting the next`);
|
|
233
|
+
lines.push(`3. Capture stdout and stderr from each execution`);
|
|
234
|
+
lines.push(`4. If a script fails, stop and report the error`);
|
|
235
|
+
lines.push(`5. After all scripts succeed, report:`);
|
|
236
|
+
lines.push(` - Total execution time`);
|
|
237
|
+
lines.push(` - Summary statistics from each script`);
|
|
238
|
+
lines.push(` - Any warnings or errors encountered`);
|
|
239
|
+
lines.push(` - List of output files created`);
|
|
240
|
+
lines.push(``);
|
|
241
|
+
lines.push(`**Expected Outputs**:`);
|
|
242
|
+
phase.outputs.forEach(output => {
|
|
243
|
+
lines.push(`- ${interpolateArgs(output, params)}`);
|
|
244
|
+
});
|
|
245
|
+
lines.push(``);
|
|
246
|
+
lines.push(`**Important**:`);
|
|
247
|
+
lines.push(`- Use absolute paths from project root`);
|
|
248
|
+
lines.push(`- Ensure all output directories exist (scripts create them)`);
|
|
249
|
+
lines.push(`- Report success/failure for each script`);
|
|
250
|
+
lines.push(`- Include key metrics in summary (e.g., keywords found, clusters created, etc.)`);
|
|
251
|
+
lines.push(``);
|
|
252
|
+
lines.push(`Begin execution now. Report progress as you go.`);
|
|
253
|
+
|
|
254
|
+
return lines.join('\n');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function interpolateArgs(template, params) {
|
|
258
|
+
let result = template;
|
|
259
|
+
|
|
260
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
261
|
+
result = result.replace(new RegExp(`\\{${key}\\}`, 'g'), value);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function validatePhaseOutputs(phaseName, brand) {
|
|
268
|
+
const phase = PHASES[phaseName];
|
|
269
|
+
const expected = phase.outputs.map(output =>
|
|
270
|
+
output.replace('{brand}', brand)
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
const found = [];
|
|
274
|
+
const missing = [];
|
|
275
|
+
|
|
276
|
+
expected.forEach(filePath => {
|
|
277
|
+
const fullPath = path.join(process.cwd(), filePath);
|
|
278
|
+
if (fs.existsSync(fullPath)) {
|
|
279
|
+
found.push(filePath);
|
|
280
|
+
} else {
|
|
281
|
+
missing.push(filePath);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
success: missing.length === 0,
|
|
287
|
+
expected: expected.length,
|
|
288
|
+
found,
|
|
289
|
+
missing
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function extractSummary(output) {
|
|
294
|
+
// Extract key metrics from Gemini output
|
|
295
|
+
const lines = output.split('\n');
|
|
296
|
+
|
|
297
|
+
// Look for summary lines (lines with numbers and metrics)
|
|
298
|
+
const summaryLines = lines.filter(line =>
|
|
299
|
+
/✅|keywords|clusters|opportunities|gaps|health score/i.test(line)
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
return summaryLines.slice(0, 5).join(' | ') || 'Completed';
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function getDefaultTopics(brand) {
|
|
306
|
+
// Load from ICP profiles if available
|
|
307
|
+
const icpFile = path.join(process.cwd(), 'brands', brand, 'content', '00-assets', 'icp-profiles.md');
|
|
308
|
+
|
|
309
|
+
if (fs.existsSync(icpFile)) {
|
|
310
|
+
const content = fs.readFileSync(icpFile, 'utf8');
|
|
311
|
+
|
|
312
|
+
// Extract topics from ICP (simple heuristic)
|
|
313
|
+
const topics = [];
|
|
314
|
+
if (/automation/i.test(content)) topics.push('automation');
|
|
315
|
+
if (/marketing/i.test(content)) topics.push('marketing');
|
|
316
|
+
if (/content/i.test(content)) topics.push('content marketing');
|
|
317
|
+
if (/ai/i.test(content)) topics.push('ai');
|
|
318
|
+
if (/productivity/i.test(content)) topics.push('productivity');
|
|
319
|
+
|
|
320
|
+
if (topics.length > 0) return topics.join(',');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Fallback defaults by brand
|
|
324
|
+
const defaults = {
|
|
325
|
+
'ai.withjai': 'ai automation,content marketing,productivity tools',
|
|
326
|
+
'enchantents': 'luxury glamping,eco-tourism,boutique hospitality',
|
|
327
|
+
'xelite-one': 'executive coaching,leadership development,business strategy',
|
|
328
|
+
'voxcoach.online': 'public speaking,voice coaching,communication skills'
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
return defaults[brand] || 'business,marketing,productivity';
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function getDefaultSeedKeywords(brand) {
|
|
335
|
+
// Load from business profile if available
|
|
336
|
+
const profileFile = path.join(process.cwd(), 'brands', brand, 'content', '00-assets', 'business-profile.md');
|
|
337
|
+
|
|
338
|
+
if (fs.existsSync(profileFile)) {
|
|
339
|
+
const content = fs.readFileSync(profileFile, 'utf8');
|
|
340
|
+
|
|
341
|
+
// Extract primary offering
|
|
342
|
+
const offeringMatch = content.match(/Primary Offering[:\s]+([^\n]+)/i);
|
|
343
|
+
if (offeringMatch) return offeringMatch[1].trim();
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Fallback defaults
|
|
347
|
+
const defaults = {
|
|
348
|
+
'ai.withjai': 'ai content automation,automated newsletter,content workflow',
|
|
349
|
+
'enchantents': 'luxury glamping,glamping business,eco-luxury tourism',
|
|
350
|
+
'xelite-one': 'executive coaching,leadership coaching,business coaching',
|
|
351
|
+
'voxcoach.online': 'voice training,public speaking coaching,communication skills'
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
return defaults[brand] || 'business automation,productivity,marketing';
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (require.main === module) {
|
|
358
|
+
try {
|
|
359
|
+
main();
|
|
360
|
+
} catch (err) {
|
|
361
|
+
console.error('❌ Orchestrator failed:', err.message);
|
|
362
|
+
console.error(err.stack);
|
|
363
|
+
process.exit(1);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
module.exports = { runPhaseWithGemini, validatePhaseOutputs };
|