@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,123 @@
|
|
|
1
|
+
# Off-Page Strategy (Backlinks + Distribution)
|
|
2
|
+
|
|
3
|
+
On-page work (everything in the pattern references) only gets you so far. Without inbound links from other domains, even a perfect page caps out around DR + 20 in achievable KD targets. The off-page work expands that ceiling.
|
|
4
|
+
|
|
5
|
+
This skill does **not** submit links anywhere on the user's behalf. It generates a prioritized checklist and a researched target list — the user (or the user's marketing team) does the outreach.
|
|
6
|
+
|
|
7
|
+
## The starter stack (universal)
|
|
8
|
+
|
|
9
|
+
Every new SaaS/app site should be in these by week 4. Most are free; all are worth a one-time submission.
|
|
10
|
+
|
|
11
|
+
### Directories (just submit and check off)
|
|
12
|
+
|
|
13
|
+
- **Product Hunt** — single biggest launch-day backlink + traffic source
|
|
14
|
+
- **G2** — high-DR, becomes a destination for "[brand] reviews" searches
|
|
15
|
+
- **Capterra / GetApp / Software Advice** (Gartner Digital Markets — same submission flow)
|
|
16
|
+
- **SaaSHub**
|
|
17
|
+
- **AlternativeTo** — DR 80+, list yourself as an alternative to your top 5 competitors
|
|
18
|
+
- **Betalist** (if pre-launch or recently launched)
|
|
19
|
+
- **Indie Hackers** — products section
|
|
20
|
+
- **TopAlternatives.com / SimilarSiteSearch / Slant.co** — niche but useful
|
|
21
|
+
- **Crunchbase** — even free profile gets DR pass-through
|
|
22
|
+
|
|
23
|
+
### Community surfaces (selective)
|
|
24
|
+
|
|
25
|
+
- **Reddit** — niche subreddits ONLY. Find them via Ahrefs site-explorer on `reddit.com` for your keywords. Engage genuinely; never just post a link.
|
|
26
|
+
- **Slack/Discord communities** — for your audience. Join 3-5, contribute for 2 weeks before mentioning the product.
|
|
27
|
+
- **Hacker News** — for technical products. Show HN posts can drive enormous traffic spikes; require a real launch story.
|
|
28
|
+
|
|
29
|
+
### Founder outreach (the slow-burn channel)
|
|
30
|
+
|
|
31
|
+
- **Founder link trades** with complementary (non-competitive) products. Reach out to 5-10 founders of products your audience also uses. Offer mutual blog mentions, "tools we love" pages, or guest posts.
|
|
32
|
+
- **Guest posts on DR 30+ blogs** in your niche. Find them via Recipe F (competitor referring-domains). Pitch 1-2 strong posts per month.
|
|
33
|
+
|
|
34
|
+
## Recipe F — researched target list
|
|
35
|
+
|
|
36
|
+
Use Ahrefs MCP to surface high-value link opportunities your competitors already have.
|
|
37
|
+
|
|
38
|
+
For each top-3 competitor:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
mcp__ahrefs__site-explorer-referring-domains
|
|
42
|
+
target: <competitor-domain>
|
|
43
|
+
where: domain_rating >= 30 AND traffic_dofollow >= 100
|
|
44
|
+
order_by: domain_rating:desc
|
|
45
|
+
limit: 100
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Then for each candidate domain, filter manually into buckets:
|
|
49
|
+
|
|
50
|
+
| Bucket | Signal |
|
|
51
|
+
|---|---|
|
|
52
|
+
| **Directory candidates** | Site name matches "[category] directory", "best of [category]", "[category] tools", "alternatives to [tool]" |
|
|
53
|
+
| **Listicle candidates** | Blog posts titled "Top X [category] in YYYY" — pitch yourself for inclusion |
|
|
54
|
+
| **Guest-post candidates** | Looks like a blog (`*.com/blog/...` URLs), DR 30+, posts on your niche |
|
|
55
|
+
| **Skip** | PR wires, paid networks, irrelevant niches, sites that link to *everyone* in the space |
|
|
56
|
+
|
|
57
|
+
Save to `.seo/backlink-targets.json` as:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"generated_at": "2026-MM-DD",
|
|
62
|
+
"directories": [
|
|
63
|
+
{ "domain": "g2.com", "dr": 88, "url_to_submit": "https://www.g2.com/products/new", "competitor_uses": ["hootsuite", "buffer"] }
|
|
64
|
+
],
|
|
65
|
+
"listicles": [
|
|
66
|
+
{ "domain": "thedigitalprojectmanager.com", "dr": 65, "url": "https://...", "topic": "Best Twitter monitoring tools", "competitor_listed": "hootsuite" }
|
|
67
|
+
],
|
|
68
|
+
"guest_posts": [
|
|
69
|
+
{ "domain": "indiehackers.com/blog", "dr": 81, "topic_fit": "founder-led marketing" }
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Off-page phase template
|
|
75
|
+
|
|
76
|
+
Add 2-4 off-page phases near the end of the tracker:
|
|
77
|
+
|
|
78
|
+
```markdown
|
|
79
|
+
### Phase N — Directory submissions (starter stack)
|
|
80
|
+
|
|
81
|
+
**Why:** baseline backlinks from high-DR directories. Cap at 2-3 hours of submission work.
|
|
82
|
+
|
|
83
|
+
**Scope:**
|
|
84
|
+
|
|
85
|
+
- [ ] Product Hunt — schedule launch (separate launch-strategy work)
|
|
86
|
+
- [ ] G2 — submit product page
|
|
87
|
+
- [ ] Capterra — submit product page
|
|
88
|
+
- [ ] SaaSHub
|
|
89
|
+
- [ ] AlternativeTo — list as alternative to: hootsuite, buffer, sprout-social, agorapulse, later
|
|
90
|
+
- [ ] Indie Hackers — claim product page
|
|
91
|
+
- [ ] Crunchbase — basic profile
|
|
92
|
+
|
|
93
|
+
**Files modified:** none — this is external work. Track status in `.seo/off-page-status.md`.
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
### Phase N+1 — Listicle outreach (top 10 targets)
|
|
98
|
+
|
|
99
|
+
**Why:** "Top X [category]" listicles already rank for our target keywords. Getting added is faster than displacing them.
|
|
100
|
+
|
|
101
|
+
**Targets (from .seo/backlink-targets.json):**
|
|
102
|
+
|
|
103
|
+
1. example.com/best-twitter-monitoring-tools (DR 65)
|
|
104
|
+
2. example.com/top-social-listening-tools-2026 (DR 72)
|
|
105
|
+
3. ...
|
|
106
|
+
|
|
107
|
+
**Action:**
|
|
108
|
+
- [ ] For each, find the author via the byline or about page
|
|
109
|
+
- [ ] Send a personalized note: short pitch + screenshot proof of value + link to demo
|
|
110
|
+
- [ ] Track reply status in `.seo/off-page-status.md`
|
|
111
|
+
|
|
112
|
+
**Verification:** 3+ listicles update to include the product within 60 days.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## What this skill explicitly does NOT do
|
|
116
|
+
|
|
117
|
+
- **Auto-submit anything.** Submission flows often need real human review (G2 needs a screenshot + URL + verification email; Product Hunt needs a launch coordinator).
|
|
118
|
+
- **Generate outreach emails.** Use the `cold-email` skill for that.
|
|
119
|
+
- **Track ongoing referring-domain growth.** That's a weekly checking-in task the user owns; the skill just provides the initial target list.
|
|
120
|
+
|
|
121
|
+
## Honest caveats
|
|
122
|
+
|
|
123
|
+
Off-page work is slower and more uncertain than on-page work. A great alternatives page ranks within 30-90 days. A great backlink campaign might produce 3 useful links in the first month, 10 in three months. **Don't gate the on-page sprint on off-page progress.** Ship pages; queue outreach in parallel.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Pattern A — `/alternatives/[competitor]`
|
|
2
|
+
|
|
3
|
+
The single highest-converting page type for SaaS SEO. User typing "[competitor] alternative" is one decision away from signing up for a replacement. Most sprints should start with this pattern and ship 5-15 of these before anything else.
|
|
4
|
+
|
|
5
|
+
## Target keyword profile
|
|
6
|
+
|
|
7
|
+
Each `/alternatives/[brand]` page must rank for at least TWO related keywords:
|
|
8
|
+
|
|
9
|
+
1. **Singular** — `[brand] alternative` (e.g. "hootsuite alternative") — vol typically 100-400
|
|
10
|
+
2. **Plural** — `[brand] alternatives` (e.g. "hootsuite alternatives") — vol typically 2-3× the singular
|
|
11
|
+
|
|
12
|
+
A single URL captures both if the H2 reads "Best [Brand] alternatives in [Year]" and the meta title hints at plural. **Build for both from day 1.** Retrofitting is wasted work.
|
|
13
|
+
|
|
14
|
+
Secondary keywords often capturable from the same URL (verify via SERP):
|
|
15
|
+
- `alternative to [brand]` — vol typically 50-150
|
|
16
|
+
- `[brand] pricing` — if their pricing is public and contentious (e.g. price hike, removed free plan)
|
|
17
|
+
- `is [brand] free` — if there's a recent change to their free tier
|
|
18
|
+
- `[brand] review` — captures evaluation-stage searchers
|
|
19
|
+
|
|
20
|
+
## URL slug rules
|
|
21
|
+
|
|
22
|
+
- lowercase, hyphenated. `sprout-social` not `sprout_social` and not `SproutSocial`
|
|
23
|
+
- match the competitor's primary brand spelling. "Sprout Social" → `sprout-social`. "MeetEdgar" → `meetedgar` (no internal cap)
|
|
24
|
+
- avoid pluralizing in the URL even though keywords are plural. `/alternatives/buffer` not `/alternatives/buffers`
|
|
25
|
+
|
|
26
|
+
## Required data shape
|
|
27
|
+
|
|
28
|
+
Every alternatives page renders from this payload. The shape is the same regardless of stack — only the serialization differs (Ruby hash, JSON, TypeScript interface, frontmatter).
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
interface AlternativeData {
|
|
32
|
+
competitor_name: string // "Hootsuite" — display form, not slug
|
|
33
|
+
hero_eyebrow: string // e.g. "Hootsuite alternative"
|
|
34
|
+
hero_h1: string // "Looking for a Hootsuite alternative?"
|
|
35
|
+
hero_lede: string // 30-60 word subhead
|
|
36
|
+
|
|
37
|
+
// First H2 — CAPTURES PLURAL KEYWORD
|
|
38
|
+
table_h2: string // "Best Hootsuite alternatives in 2026"
|
|
39
|
+
table_lede: string // 30-50 words
|
|
40
|
+
comparison_rows: ComparisonRow[] // ≥10 rows: feature + your-cell + competitor-cell
|
|
41
|
+
|
|
42
|
+
// Why switch — 4 reasons
|
|
43
|
+
switch_eyebrow: string // "Why switch"
|
|
44
|
+
switch_h2: string
|
|
45
|
+
switch_lede: string
|
|
46
|
+
switch_reasons: SwitchReason[] // exactly 4 reasons, each ≥40 words
|
|
47
|
+
|
|
48
|
+
// HONESTY SECTION — NON-NEGOTIABLE
|
|
49
|
+
honesty_eyebrow: string
|
|
50
|
+
honesty_h2: string // "Where Hootsuite still wins"
|
|
51
|
+
honesty_lede: string
|
|
52
|
+
honesty_rows: HonestyRow[] // 3-4 honest tradeoffs, each ≥30 words
|
|
53
|
+
|
|
54
|
+
faq_h2: string
|
|
55
|
+
faqs: AlternativeFAQ[] // 4-6 Q/A
|
|
56
|
+
|
|
57
|
+
cta_h2: string
|
|
58
|
+
cta_lede: string
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface ComparisonRow {
|
|
62
|
+
feature: string
|
|
63
|
+
yours: { state: "yes" | "no" | "partial" | "text"; note?: string }
|
|
64
|
+
theirs: { state: "yes" | "no" | "partial" | "text"; note?: string }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface SwitchReason {
|
|
68
|
+
icon: SwitchReasonIcon // bolt | sparkle | check | info | shield | chart | clock | target | flame
|
|
69
|
+
title: string
|
|
70
|
+
body: string // ≥40 words
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface HonestyRow {
|
|
74
|
+
feature: string
|
|
75
|
+
body: string // ≥30 words explaining why they win here
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
interface AlternativeFAQ {
|
|
79
|
+
question: string
|
|
80
|
+
answer: string // ≥40 words
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Quality bar (verification gate)
|
|
85
|
+
|
|
86
|
+
A phase is NOT done until all of these pass. Use `scripts/word_count.py` and `scripts/link_audit.py`.
|
|
87
|
+
|
|
88
|
+
- [ ] **≥600 words of unique rendered copy.** Strip out JSX/Ruby syntax and recount. Anything under is thin.
|
|
89
|
+
- [ ] **First H2 reads "Best [Brand] alternatives in [Year]".** Captures plural.
|
|
90
|
+
- [ ] **Meta title ≤60 chars, includes brand + "Alternative" + a hint at free/price intent.**
|
|
91
|
+
- Example: `"Hootsuite Alternative — ReplySocial (free, $25/mo Pro)"`
|
|
92
|
+
- Bad: `"Hootsuite Alternative"` (wasted character budget, no pricing hook)
|
|
93
|
+
- [ ] **Meta description ≤155 chars, has primary keyword + reason to click.**
|
|
94
|
+
- [ ] **Comparison table has ≥10 rows.** Each row honest. Pricing must be one row (even if you do "Free" vs "$249/mo"). Free-tier presence/absence must be one row if either party has free or recently removed it.
|
|
95
|
+
- [ ] **Honesty section present with 3-4 rows.** Acknowledge real competitor strengths. Don't fabricate weakness in yourself; fabricate nothing.
|
|
96
|
+
- [ ] **4-6 FAQs.** At least one answers "is [brand] free" or "[brand] pricing" if there's any volume on those intents.
|
|
97
|
+
- [ ] **Internal links from this page:** ≥2 sibling `/alternatives/*`, ≥1 `/features/*`, ≥1 `/tools/*` (or whatever the user's equivalent of "tools" is in their nav).
|
|
98
|
+
- [ ] **Internal links TO this page:** ≥2 from existing pages. Common spots: homepage marketing block, sibling alts (link cluster), feature pages mentioning the competitor.
|
|
99
|
+
- [ ] **JSON-LD schemas:**
|
|
100
|
+
- `BreadcrumbList` (auto from meta helper, but verify present)
|
|
101
|
+
- `FAQPage` (from the FAQ section)
|
|
102
|
+
- `SoftwareApplication` or `Product` representing the user's product
|
|
103
|
+
- [ ] **OG image generated** (defer to `og-image` skill if not yet wired).
|
|
104
|
+
- [ ] **Sitemap updated** with the new URL + today's lastmod. Never future-date.
|
|
105
|
+
|
|
106
|
+
## Worked example (skeleton)
|
|
107
|
+
|
|
108
|
+
```ruby
|
|
109
|
+
# Rails+Inertia example. For other stacks see references/stacks/*.md
|
|
110
|
+
{
|
|
111
|
+
competitor_name: "Hootsuite",
|
|
112
|
+
hero_eyebrow: "Hootsuite alternative",
|
|
113
|
+
hero_h1: "Looking for a Hootsuite alternative?",
|
|
114
|
+
hero_lede: "ReplySocial is the lightweight social media monitoring and engagement tool that does what most Hootsuite users actually need — without the $249/mo enterprise price tag or the deprecated free plan.",
|
|
115
|
+
|
|
116
|
+
table_h2: "Best Hootsuite alternatives in 2026",
|
|
117
|
+
table_lede: "We built ReplySocial after years of paying Hootsuite for features we never used. Here's how the two compare on the things our users actually care about.",
|
|
118
|
+
comparison_rows: [
|
|
119
|
+
{ feature: "Free plan",
|
|
120
|
+
yours: { state: "yes", note: "Free forever for 1 X account" },
|
|
121
|
+
theirs: { state: "no", note: "Discontinued in 2023" } },
|
|
122
|
+
{ feature: "Starting price",
|
|
123
|
+
yours: { state: "text", note: "$25/mo Pro" },
|
|
124
|
+
theirs: { state: "text", note: "$249/mo Professional" } },
|
|
125
|
+
# … 8+ more
|
|
126
|
+
],
|
|
127
|
+
|
|
128
|
+
switch_reasons: [
|
|
129
|
+
{ icon: "bolt",
|
|
130
|
+
title: "Reply in 30 seconds, not 5 minutes",
|
|
131
|
+
body: "ReplySocial's unified inbox surfaces every mention…" }, # ≥40 words
|
|
132
|
+
# 3 more
|
|
133
|
+
],
|
|
134
|
+
|
|
135
|
+
honesty_eyebrow: "Honest tradeoffs",
|
|
136
|
+
honesty_h2: "Where Hootsuite still wins",
|
|
137
|
+
honesty_lede: "We won't pretend we've matched everything Hootsuite does. Here's where their product is still ahead.",
|
|
138
|
+
honesty_rows: [
|
|
139
|
+
{ feature: "Multi-platform scheduling",
|
|
140
|
+
body: "Hootsuite supports scheduling to Instagram, TikTok, LinkedIn, and Facebook from one dashboard. ReplySocial is X-first and doesn't schedule to those platforms — if you need cross-platform scheduling, Hootsuite (or Buffer) is the better fit." },
|
|
141
|
+
# 2-3 more
|
|
142
|
+
],
|
|
143
|
+
|
|
144
|
+
faqs: [
|
|
145
|
+
{ question: "Why did Hootsuite end its free plan?",
|
|
146
|
+
answer: "Hootsuite discontinued its free plan in March 2023…" },
|
|
147
|
+
# …
|
|
148
|
+
],
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Sibling-link selection logic
|
|
153
|
+
|
|
154
|
+
When picking ≥2 sibling alts to link to, prefer:
|
|
155
|
+
1. **Closest substitute** — same audience, similar feature set (e.g. Buffer ↔ Hootsuite, both general SMM)
|
|
156
|
+
2. **Adjacent category** — covers the next-most-likely query (e.g. Hootsuite ↔ Sprout Social, both enterprise-tier)
|
|
157
|
+
3. **Up-funnel** — a more well-known competitor someone might also be searching (e.g. Buffer ↔ Hootsuite, both top-of-mind)
|
|
158
|
+
|
|
159
|
+
Don't link to obscure alts just to hit the count. Each link should be useful to the reader.
|
|
160
|
+
|
|
161
|
+
## Anti-patterns
|
|
162
|
+
|
|
163
|
+
- **Fabricated honesty rows** ("they have a worse UI" is not honest, it's just a fluffy claim with no specifics). Real honest tradeoffs reference concrete features.
|
|
164
|
+
- **Pricing rows with "Contact sales"** if the competitor publishes actual numbers. Use their actual numbers.
|
|
165
|
+
- **"Best" claims in copy.** "ReplySocial is the best Hootsuite alternative" reads like a product page. Let the comparison speak; you provide structure and honesty.
|
|
166
|
+
- **No FAQ schema.** Featured-snippet opportunity wasted.
|
|
167
|
+
- **Sitemap lastmod in the future.** A red flag to crawlers. Use today's date.
|
|
168
|
+
|
|
169
|
+
## Reference implementation
|
|
170
|
+
|
|
171
|
+
This pattern's reference implementation is in the `reply-social` repo:
|
|
172
|
+
- Hash entry: `app/controllers/marketing_controller.rb` — search for `ALTERNATIVES = {` then the `'hootsuite'` key
|
|
173
|
+
- Component: `app/frontend/components/AlternativeLayout.tsx`
|
|
174
|
+
- Routing: `get 'alternatives/:slug', to: 'marketing#alternatives_show'`
|
|
175
|
+
|
|
176
|
+
For non-Rails stacks, see `references/stacks/<framework>.md`.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Pattern D — `/compare/[a]-vs-[b]`
|
|
2
|
+
|
|
3
|
+
Third-party comparison pages between two competitors (neither is your product). The funnel:
|
|
4
|
+
|
|
5
|
+
> User searches "[a] vs [b]" → lands on your page → reads your honest take → sees CTA at the bottom: "If both feel too heavy, try [your product] free."
|
|
6
|
+
|
|
7
|
+
Volumes per page are usually small (30-500), but commercial intent is the **highest of any pattern** — these searchers are mid-decision and ready to evaluate options.
|
|
8
|
+
|
|
9
|
+
## When to add a compare page
|
|
10
|
+
|
|
11
|
+
Each page targets ONE canonical comparison. Add when:
|
|
12
|
+
|
|
13
|
+
1. Both brands appear in the user's competitor list in `.seo/brand.md`
|
|
14
|
+
2. Combined volume of "a vs b" + "b vs a" ≥ 30 (via Recipe D)
|
|
15
|
+
3. KD ≤ DR + 10
|
|
16
|
+
4. At least one search result in the current SERP for that comparison is a generic listicle (`forbes.com/best...`, `g2.com/categories/...`) — those are weak rankers you can displace with a focused page
|
|
17
|
+
|
|
18
|
+
## URL slug rules
|
|
19
|
+
|
|
20
|
+
- **Always alphabetical** for the canonical slug: `buffer-vs-hootsuite`, not `hootsuite-vs-buffer`.
|
|
21
|
+
- Both directional searches ("buffer vs hootsuite" AND "hootsuite vs buffer") will rank for the same URL — Google understands the intent is identical.
|
|
22
|
+
- Internal-link anchor text on each individual alt page should match the canonical slug, but the link text can be either direction ("compare Buffer vs Hootsuite" or "Hootsuite vs Buffer comparison" both fine).
|
|
23
|
+
|
|
24
|
+
## Required data shape
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
interface ComparisonData {
|
|
28
|
+
a_name: string // "Buffer"
|
|
29
|
+
b_name: string // "Hootsuite"
|
|
30
|
+
|
|
31
|
+
hero_h1: string // "Buffer vs Hootsuite: which is better in 2026?"
|
|
32
|
+
hero_lede: string // 40-80 words
|
|
33
|
+
|
|
34
|
+
// The verdict goes EARLY — searchers want the answer up front
|
|
35
|
+
verdict_h2: string // "Our take, in one paragraph"
|
|
36
|
+
verdict_body: string // ≥80 words
|
|
37
|
+
|
|
38
|
+
comparison_rows: ComparisonRow[] // ~12 rows. 3 columns: feature / [A] / [B]
|
|
39
|
+
|
|
40
|
+
pricing_h2: string
|
|
41
|
+
pricing_a: { tier: string; price: string; notes: string }[]
|
|
42
|
+
pricing_b: { tier: string; price: string; notes: string }[]
|
|
43
|
+
|
|
44
|
+
winner_h2: string // "Pick [A] if… pick [B] if…"
|
|
45
|
+
winner_a_for: string[] // 3-5 bullet criteria
|
|
46
|
+
winner_b_for: string[]
|
|
47
|
+
|
|
48
|
+
// The ONLY place your product shows up prominently
|
|
49
|
+
replysocial_aside_h2: string // "Neither one fits? Here's what we'd suggest"
|
|
50
|
+
replysocial_aside_body: string // 80-120 words; soft pitch with link to /pricing
|
|
51
|
+
|
|
52
|
+
faq_h2: string
|
|
53
|
+
faqs: { question: string; answer: string }[] // 4-6
|
|
54
|
+
|
|
55
|
+
cta_h2: string
|
|
56
|
+
cta_lede: string
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Quality bar
|
|
61
|
+
|
|
62
|
+
- [ ] **≥700 words of unique rendered copy.**
|
|
63
|
+
- [ ] **Verdict appears within the first viewport.** Don't make searchers scroll for the answer. The verdict is 80-150 words and states an opinion (with caveats).
|
|
64
|
+
- [ ] **12+ comparison rows.** Each cell concrete and verifiable. Pricing rows must use the brands' actual published numbers.
|
|
65
|
+
- [ ] **Pricing section uses live published pricing.** Re-fetch via web search if data is >60 days old.
|
|
66
|
+
- [ ] **"Pick A if / pick B if" criteria are mutually exclusive and concrete.** "Pick Buffer if you prioritize simplicity" — vague. "Pick Buffer if you manage ≤5 accounts and don't need analytics deeper than 30 days" — concrete.
|
|
67
|
+
- [ ] **Your product mention is honest and short** — 80-120 words, mentioned ONCE in the dedicated aside. Not sprinkled throughout. Google rewards genuine comparison; thinly-veiled vendor pages get demoted.
|
|
68
|
+
- [ ] **Internal links:** to `/alternatives/[a]`, `/alternatives/[b]`, ≥1 relevant `/for/*`, your `/pricing`.
|
|
69
|
+
- [ ] **Inbound links:** both `/alternatives/[a]` and `/alternatives/[b]` link here. Homepage compare-block if you have one.
|
|
70
|
+
- [ ] **JSON-LD:** `BreadcrumbList`, `FAQPage`, `ComparisonReview` if you implement it (rare; FAQ schema is the high-leverage one).
|
|
71
|
+
|
|
72
|
+
## The verdict paragraph — the most important section
|
|
73
|
+
|
|
74
|
+
If a reader only reads one paragraph, this is it. It must:
|
|
75
|
+
|
|
76
|
+
1. Open with the verdict — "Buffer is the better fit for X; Hootsuite is the better fit for Y."
|
|
77
|
+
2. Acknowledge the close-call dimensions — "Both are strong on [shared strength]."
|
|
78
|
+
3. State the situation-dependent factor — "The choice usually comes down to [budget / team size / specific feature]."
|
|
79
|
+
4. Be honest. If they're nearly tied, say so. Don't manufacture differentiation.
|
|
80
|
+
|
|
81
|
+
A good verdict reads like advice from a friend who's used both. A bad verdict reads like a "best of" listicle with hedge-everything language.
|
|
82
|
+
|
|
83
|
+
## The "your product aside" — the soft pitch
|
|
84
|
+
|
|
85
|
+
This is where your product appears. Rules:
|
|
86
|
+
|
|
87
|
+
- **Tone: humble.** "If you tried both and felt they were overkill" is better than "Or skip both and try us — we're better."
|
|
88
|
+
- **Trigger: when both don't fit.** Don't pitch as a primary recommendation. Pitch as the third option for a specific scenario.
|
|
89
|
+
- **Length: 80-120 words.** Not more. Searchers came for "A vs B" — respect that.
|
|
90
|
+
- **Honest about what you don't do.** If you don't match their scale or feature breadth, say so.
|
|
91
|
+
|
|
92
|
+
## Anti-patterns
|
|
93
|
+
|
|
94
|
+
- **Recency disclaimers without recency.** "As of January 2024" on a page written today and never updated will age badly. Either commit to keeping it fresh, or omit the date.
|
|
95
|
+
- **"Our take" without an actual take.** Hedging on every dimension reads like AI-generated comparison content. Pick a side per dimension and defend it.
|
|
96
|
+
- **Pricing tables with "Contact sales" when actual numbers are public.** Look them up. Searchers can.
|
|
97
|
+
- **Both alts treated identically.** Compare pages need editorial direction — usually one tool wins for one audience, the other for a different audience. State it.
|
|
98
|
+
|
|
99
|
+
## Reference implementation
|
|
100
|
+
|
|
101
|
+
Reply-social repo:
|
|
102
|
+
- Hash entry: `app/controllers/marketing_controller.rb` — `COMPARISONS = {`
|
|
103
|
+
- Routing: `get 'compare/:slug', to: 'marketing#compare_show'`
|
|
104
|
+
- Component: `app/frontend/components/ComparisonLayout.tsx`
|
|
105
|
+
- Phase 3 PR (`#425`) is the proof-of-concept ship.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Pattern E — `/playbooks/[topic]` (long-form pillar)
|
|
2
|
+
|
|
3
|
+
Long-form prose guides (2,500+ words) targeting commercial-investigation queries. These are the only pattern where you write long-form custom content per page rather than fan out templated data.
|
|
4
|
+
|
|
5
|
+
## Why this pattern exists
|
|
6
|
+
|
|
7
|
+
Three distinct jobs:
|
|
8
|
+
1. **Brand authority.** A genuine 3,000-word guide on "B2B social media strategy" positions the author as a real practitioner, not a tool vendor.
|
|
9
|
+
2. **AI-citation surface area.** LLMs (ChatGPT, Claude, Perplexity, Gemini) cite long-form guides when answering related queries. Long, well-structured playbooks get scraped into training and inference contexts way more than templated pages.
|
|
10
|
+
3. **Inbound link draw.** Other writers cite playbooks. Almost nobody cites an alternatives page.
|
|
11
|
+
|
|
12
|
+
The tradeoff: each playbook is 2-3 days of real writing work, vs ~4 hours for a `/alternatives/*` page. Ship 2-3 playbooks early in the sprint as pillar content; defer the rest until programmatic patterns are exhausted.
|
|
13
|
+
|
|
14
|
+
## Target keyword profile
|
|
15
|
+
|
|
16
|
+
- Volume 50-700 (small head terms)
|
|
17
|
+
- KD ≤ DR + 15 (slightly more aggressive than templated patterns because long-form content can punch above its KD)
|
|
18
|
+
- Strong "commercial investigation" or "informational with commercial sub-intent" — e.g. "b2b social media strategy" (people doing this are buying tools)
|
|
19
|
+
- High traffic potential (≥500 ideal). The keyword cluster matters more than the head term.
|
|
20
|
+
|
|
21
|
+
Avoid:
|
|
22
|
+
- Pure informational queries with no buying intent ("what is social media")
|
|
23
|
+
- Brand-direct queries (those are alternatives/compare territory)
|
|
24
|
+
- Queries dominated by Wikipedia / how-to listicles in top 5 (you won't displace them at low DR)
|
|
25
|
+
|
|
26
|
+
## URL slug rules
|
|
27
|
+
|
|
28
|
+
- lowercase, hyphenated, descriptive
|
|
29
|
+
- 2-5 words
|
|
30
|
+
- Match common phrasing of the keyword: "b2b social media strategy" → `b2b-social-media-strategy` (not `b2bsocialmediastrategy` and not `b2b-social-strategy`)
|
|
31
|
+
|
|
32
|
+
## Required data shape
|
|
33
|
+
|
|
34
|
+
Playbooks are written as long-form components, not data hashes. Each playbook has:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
interface PlaybookMetadata {
|
|
38
|
+
slug: string
|
|
39
|
+
component: string // path to the React/Astro/Markdown component
|
|
40
|
+
headline: string // displays on listing
|
|
41
|
+
summary: string // 1-2 sentence summary
|
|
42
|
+
meta_title: string // ≤60 chars
|
|
43
|
+
meta_description: string // ≤155 chars
|
|
44
|
+
og_subtitle: string
|
|
45
|
+
date_published: string // ISO
|
|
46
|
+
date_modified: string // ISO; update when you edit
|
|
47
|
+
read_time_min: number // honest estimate; ~140 wpm for operator content
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface PlaybookContent {
|
|
51
|
+
eyebrow: string
|
|
52
|
+
title: string
|
|
53
|
+
lede: string // 60-120 word intro
|
|
54
|
+
toc: TocEntry[] // section anchors
|
|
55
|
+
body: ReactNode | MarkdownAST // the article itself
|
|
56
|
+
related: RelatedLink[] // 4-6 cards: features, tools, /for/, /alternatives/
|
|
57
|
+
also_useful: InlineLink[] // 3-6 secondary inline links
|
|
58
|
+
cta_h2: string
|
|
59
|
+
cta_lede: string
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Quality bar (the hard one)
|
|
64
|
+
|
|
65
|
+
Playbooks have the strictest quality gate of any pattern. **Most first-draft playbooks fail this gate and need rewriting.** Set the bar high upfront.
|
|
66
|
+
|
|
67
|
+
- [ ] **≥2,500 words of original prose** in the article body. Strip JSX/markdown syntax before counting (`scripts/word_count.py --pattern=playbook`).
|
|
68
|
+
- [ ] **8 sections minimum.** Each `<section id="..." className="scroll-mt-24">` with an anchor. No section under ~250 words.
|
|
69
|
+
- [ ] **TOC ordered identically to section order.** Every section has a TOC entry.
|
|
70
|
+
- [ ] **Vignettes/case studies have three beats each:** (1) scenario (what they did), (2) what surprised them (non-obvious outcome), (3) lesson. Single-paragraph vignettes allowed only if all three beats fit.
|
|
71
|
+
- [ ] **Operational sections name actual numbers.** A "30-day plan" with "Week 2: connect monitoring" is a TOC entry, not a plan. Each step needs (a) "what done looks like" measurable outcome and (b) "if you're behind" branch.
|
|
72
|
+
- [ ] **Tooling sections name what NOT to use.** Listing 4 good tools is generic. Listing 4 good tools + 4 categories of tools to avoid (with reasons) is differentiated.
|
|
73
|
+
- [ ] **Internal links (in body, NOT sidebar):** ≥3 features, ≥2 tools, ≥2 `/for/*`, ≥1 `/alternatives/*`.
|
|
74
|
+
- [ ] **Schema:** `Article` JSON-LD with author + datePublished + dateModified.
|
|
75
|
+
- [ ] **Read-time honest.** 2,500 words ≈ 18 min for operator-audience skim. Don't lowball; readers calibrate trust against the displayed read-time.
|
|
76
|
+
- [ ] **Cross-link inbound from ≥2 relevant existing pages.** Don't ship an orphan.
|
|
77
|
+
|
|
78
|
+
## Section structure pattern
|
|
79
|
+
|
|
80
|
+
Most successful playbooks follow this shape (8-12 sections, ≥250 words each):
|
|
81
|
+
|
|
82
|
+
1. **The problem framing** — why this topic, why now, why this is hard
|
|
83
|
+
2. **The mental-model section** — the framework or framing the rest of the playbook hangs on
|
|
84
|
+
3. **3-5 "do this" sections** — concrete actions, with examples
|
|
85
|
+
4. **2-3 "don't do this" sections** — anti-patterns, mistakes, what NOT to use
|
|
86
|
+
5. **An operational plan** — week-by-week or step-by-step, with measurable outcomes per step
|
|
87
|
+
6. **The closing section** — what success looks like, when to know you've made it, what to do next
|
|
88
|
+
|
|
89
|
+
Don't slavishly copy this structure if a different one fits better, but if you're stuck, use it.
|
|
90
|
+
|
|
91
|
+
## Writing style notes (specific to playbooks)
|
|
92
|
+
|
|
93
|
+
- **Operator voice.** First-person plural ("we") is fine if the brand uses it elsewhere. Personal stories are welcome. Detached "best practices" voice loses to lived-experience voice.
|
|
94
|
+
- **Concrete numbers everywhere.** "Many companies struggle" → "73% of B2B SaaS companies under 50 employees post less than once a week." If you don't have a source, use a *bracketed* range: "[somewhere between 50-80% of teams we've worked with]" and source it later.
|
|
95
|
+
- **Counter-arguments inline.** When you make a strong claim, address the obvious counter-argument in the next paragraph. This is what differentiates 2,500 words of *thinking* from 2,500 words of *content*.
|
|
96
|
+
- **No padding.** If a paragraph could be cut without losing meaning, cut it. 2,500 words of real content beats 4,000 words of fluff.
|
|
97
|
+
|
|
98
|
+
## Reference implementation
|
|
99
|
+
|
|
100
|
+
Reply-social repo:
|
|
101
|
+
- Hash entry: `app/controllers/marketing_controller.rb` — `PLAYBOOKS = {`
|
|
102
|
+
- Routing: `get 'playbooks/:slug', to: 'marketing#playbooks_show'`
|
|
103
|
+
- Layout: `app/frontend/components/PlaybookLayout.tsx`
|
|
104
|
+
- Reference playbook (highest-quality bar): `app/frontend/pages/Playbooks/B2bSocialMediaStrategy.tsx`
|
|
105
|
+
|
|
106
|
+
Note `VignetteCard` and `WeekCard` components in that file — clone them for new playbooks.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Pattern B+C — `/for/[use-case]` and `/for/[audience]`
|
|
2
|
+
|
|
3
|
+
Two flavors of the same template, same data shape, same component. The difference is only in framing:
|
|
4
|
+
|
|
5
|
+
- **Pattern B (use-case):** slug is a verb-or-noun describing what the user is trying to *accomplish* — `social-listening`, `competitor-monitoring`, `crisis-management`, `customer-support`.
|
|
6
|
+
- **Pattern C (audience):** slug is the user's industry or role — `agencies`, `small-business`, `ecommerce`, `freelancers`, `creators`.
|
|
7
|
+
|
|
8
|
+
Build the infra once; fan out per slug.
|
|
9
|
+
|
|
10
|
+
## Why this pattern is high-leverage
|
|
11
|
+
|
|
12
|
+
Pattern B/C pages target keywords with **the highest traffic-potential-to-volume ratio** in the entire roadmap. Examples from a real execution:
|
|
13
|
+
|
|
14
|
+
- `social media tools for agencies`: vol 150, KD 9, **TP 34,000**
|
|
15
|
+
- `competitor monitoring tool`: vol 150, KD 22, **TP 2,500**
|
|
16
|
+
- `twitter mentions tracker`: vol 50, KD 6, **TP 2,100**
|
|
17
|
+
|
|
18
|
+
These low-volume head terms gate access to massive long-tail clusters. A `/for/agencies` page that ranks for "social media tools for agencies" will also pick up dozens of long-tail variants and sub-queries — sometimes 50-100 additional ranking keywords per page.
|
|
19
|
+
|
|
20
|
+
## Target keyword profile
|
|
21
|
+
|
|
22
|
+
Pick ONE primary keyword per page. Mid-volume (50-500), mid-KD (≤DR+10), high TP (≥500 ideal, ≥150 acceptable).
|
|
23
|
+
|
|
24
|
+
Good targets:
|
|
25
|
+
- "[category] for [audience]" — e.g. "social media tools for agencies"
|
|
26
|
+
- "[verb] [object] tool" — e.g. "competitor monitoring tool"
|
|
27
|
+
- "[platform] [verb-noun]" — e.g. "twitter mentions tracker"
|
|
28
|
+
|
|
29
|
+
Validate via SERP overview (Recipe G) before adding to the tracker. If top 5 are all DR > 60 mega-sites with template content, the KD score lied — skip.
|
|
30
|
+
|
|
31
|
+
## URL slug rules
|
|
32
|
+
|
|
33
|
+
- lowercase, hyphenated
|
|
34
|
+
- noun or short noun phrase, not a full sentence
|
|
35
|
+
- ≤4 words, ideally 1-2
|
|
36
|
+
- `/for/agencies`, `/for/social-listening`, `/for/competitor-monitoring`
|
|
37
|
+
|
|
38
|
+
## Required data shape
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
interface ForData {
|
|
42
|
+
name: string // "Social Listening", "Agencies"
|
|
43
|
+
hero_eyebrow: string // "For agencies" or "For social listening"
|
|
44
|
+
hero_h1: string // e.g. "Social media monitoring built for agencies"
|
|
45
|
+
hero_lede: string // 40-80 words
|
|
46
|
+
|
|
47
|
+
pain_h2: string // "The agency reality"
|
|
48
|
+
pain_lede: string
|
|
49
|
+
pains: { title: string; body: string }[] // 3-4 specific pains, ≥40 words each
|
|
50
|
+
|
|
51
|
+
solution_h2: string // "How ReplySocial helps"
|
|
52
|
+
solution_lede: string
|
|
53
|
+
solutions: { icon: SwitchReasonIcon; title: string; body: string }[] // exactly 4
|
|
54
|
+
|
|
55
|
+
proof_h2?: string // optional but recommended
|
|
56
|
+
proof_lede?: string
|
|
57
|
+
proof?: { title: string; body: string }[] // 2-3 proof points
|
|
58
|
+
|
|
59
|
+
related: {
|
|
60
|
+
features: { slug: string; title: string }[] // ≥2 internal /features/ links
|
|
61
|
+
tools: { slug: string; title: string }[] // ≥2 internal /tools/ links
|
|
62
|
+
siblings: { slug: string; title: string }[] // ≥1 sibling /for/ link
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
faq_h2: string
|
|
66
|
+
faqs: { question: string; answer: string }[] // 4-6
|
|
67
|
+
|
|
68
|
+
cta_h2: string
|
|
69
|
+
cta_lede: string
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Quality bar
|
|
74
|
+
|
|
75
|
+
- [ ] **≥800 words of unique rendered copy.**
|
|
76
|
+
- [ ] **Hero H1 contains the primary keyword** (e.g. for `/for/agencies` targeting "social media tools for agencies", H1 should include "social media" + "agencies").
|
|
77
|
+
- [ ] **Meta title ≤60 chars.** Format: "[Primary keyword] — [Product name]" or "[Primary keyword]: [outcome]".
|
|
78
|
+
- [ ] **Meta description ≤155 chars.** Lead with the keyword, end with the conversion hook.
|
|
79
|
+
- [ ] **3-4 pains, 4 solutions.** Each ≥40 words. Pains must be specific to the audience/use-case, not generic ("social media is hard" is generic; "agencies juggle 8-15 brands with no unified inbox" is specific).
|
|
80
|
+
- [ ] **Internal links:** ≥2 features, ≥2 tools, ≥1 sibling `/for/*`.
|
|
81
|
+
- [ ] **Inbound links:** ≥2 existing pages link to this new one. Common spots: homepage, related alts (audience-relevant), `/pricing` page if it mentions the audience.
|
|
82
|
+
- [ ] **JSON-LD:** `BreadcrumbList`, `FAQPage`, `SoftwareApplication` representing your product. Optionally `Service` schema if framing as a service.
|
|
83
|
+
- [ ] **No vague "for everyone" framing.** Audience-specific = better signals. If the page would apply equally to a 1-person solo creator and a 50-person agency, it's not pointed enough.
|
|
84
|
+
|
|
85
|
+
## Pain section quality bar
|
|
86
|
+
|
|
87
|
+
The most common failure mode in `/for/*` pages is generic pain copy. Each pain row should have:
|
|
88
|
+
1. **A concrete trigger** (the moment the user notices the pain) — "Every Monday morning you open Hootsuite and see 47 unread mentions across 8 client accounts…"
|
|
89
|
+
2. **The cost** (what they lose) — "…and your most important client expected a reply by 9am."
|
|
90
|
+
3. **The current workaround** (what they do today) — "So you switch tabs frantically, copy-paste from a Google Sheet, and miss two anyway."
|
|
91
|
+
|
|
92
|
+
Generic: "Agencies have a lot of social media to manage." Useless.
|
|
93
|
+
Specific: "Agency social leads spend 11 hours a week triaging mentions across 8-15 client accounts in tools that don't share an inbox." Concrete + ownable.
|
|
94
|
+
|
|
95
|
+
## Sibling-link selection
|
|
96
|
+
|
|
97
|
+
For Pattern B (use-case): link to 1 other use-case in the same audience cluster (e.g. `social-listening` ↔ `competitor-monitoring`, both monitoring-flavored).
|
|
98
|
+
|
|
99
|
+
For Pattern C (audience): link to 1 other audience that overlaps (e.g. `agencies` ↔ `freelancers`, both service-providers).
|
|
100
|
+
|
|
101
|
+
If a sibling doesn't exist yet, queue an inbound-link update for when it ships (track in `.seo/link-inventory.md`).
|
|
102
|
+
|
|
103
|
+
## Reference implementation
|
|
104
|
+
|
|
105
|
+
Reply-social repo:
|
|
106
|
+
- Hash entry: `app/controllers/marketing_controller.rb` — `USE_CASES = {`
|
|
107
|
+
- Routing: `get 'for/:slug', to: 'marketing#for_show'`
|
|
108
|
+
- Component: `app/frontend/components/ForLayout.tsx`
|
|
109
|
+
- The `/for/agencies` page is the gold-standard reference — TP 34k on KD 9 was the proof-of-concept that validated this pattern.
|