@jairodri/huckleberry-cli 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/agents/cos.json +2 -5
- package/agents/hermes/AGENTS.md +25 -49
- package/agents/hermes/fix-kimaki/SKILL.md +19 -92
- package/agents/hermes/hermes-fixer.md +44 -74
- package/agents/hermes.json +6 -18
- package/kanban/SKILL.md +18 -18
- package/kanban/package.json +1 -1
- package/kanban/src/dispatcher.mjs +1 -1
- package/kanban/templates/blog-social-campaign.yaml +6 -2
- package/kanban/templates/social-campaign.yaml +9 -4
- package/mcp/jev-calibration.mjs +335 -0
- package/mcp/jev-client.mjs +119 -0
- package/mcp/jev-thresholds.json +27 -0
- package/package.json +13 -9
- package/scripts/doctor-watchdog.sh +73 -0
- package/scripts/install-services.sh +34 -27
- package/scripts/self-improve-weekly.sh +34 -0
- package/scripts/sync-skills.mjs +121 -0
- package/skills/ab-test-setup/SKILL.md +266 -0
- package/skills/ab-test-setup/evals/evals.json +105 -0
- package/skills/ab-test-setup/references/sample-size-guide.md +263 -0
- package/skills/ab-test-setup/references/test-templates.md +277 -0
- package/skills/agent-reach/SKILL.md +132 -0
- package/skills/agent-reach/references/career.md +29 -0
- package/skills/agent-reach/references/dev.md +62 -0
- package/skills/agent-reach/references/search.md +33 -0
- package/skills/agent-reach/references/social.md +232 -0
- package/skills/agent-reach/references/video.md +130 -0
- package/skills/agent-reach/references/web.md +50 -0
- package/skills/ai-agent-seo/SKILL.md +450 -0
- package/skills/ai-cold-email-intelligence/SKILL.md +54 -0
- package/skills/ai-cold-email-intelligence/references/prompts.md +21 -0
- package/skills/ai-consensus-builder/SKILL.md +324 -0
- package/skills/ai-seo/SKILL.md +399 -0
- package/skills/ai-seo/evals/evals.json +90 -0
- package/skills/ai-seo/references/content-patterns.md +284 -0
- package/skills/ai-seo/references/platform-ranking-factors.md +152 -0
- package/skills/ai-visibility-audit/SKILL.md +322 -0
- package/skills/analytics-tracking/SKILL.md +309 -0
- package/skills/analytics-tracking/evals/evals.json +90 -0
- package/skills/analytics-tracking/references/event-library.md +260 -0
- package/skills/analytics-tracking/references/ga4-implementation.md +300 -0
- package/skills/analytics-tracking/references/gtm-implementation.md +390 -0
- package/skills/article-generator/SKILL.md +216 -0
- package/skills/auto-indexing/SKILL.md +179 -0
- package/skills/auto-indexing/scripts/auto-indexing.js +257 -0
- package/skills/auto-skill/SKILL.md +151 -0
- package/skills/auto-skill/correction-queue.js +102 -0
- package/skills/auto-skill/dedup.js +97 -0
- package/skills/auto-skill/skill-router.js +224 -0
- package/skills/autoresearch/SKILL.md +334 -0
- package/skills/autoresearch/autoresearch-autoresearch/SKILL.md.baseline +329 -0
- package/skills/autoresearch/autoresearch-autoresearch/changelog.md +34 -0
- package/skills/autoresearch/autoresearch-autoresearch/dashboard.html +116 -0
- package/skills/autoresearch/autoresearch-autoresearch/evals.md +39 -0
- package/skills/autoresearch/autoresearch-autoresearch/results.json +44 -0
- package/skills/autoresearch/autoresearch-autoresearch/results.tsv +3 -0
- package/skills/autoresearch/eval-guide.md +121 -0
- package/skills/b2b-cold-outreach/SKILL.md +322 -0
- package/skills/birdclaw/SKILL.md +82 -0
- package/skills/brainstorm/SKILL.md +168 -0
- package/skills/brand-kit-playground/SKILL.md +312 -0
- package/skills/brand-kit-playground/references/html-architecture.md +316 -0
- package/skills/brand-kit-playground/references/steal-patterns.md +88 -0
- package/skills/brand-voice/SKILL.md +223 -0
- package/skills/brand-voice/references/honesty-as-positioning.md +60 -0
- package/skills/brand-voice/references/voice-modes.md +1158 -0
- package/skills/business-advisory-council/README.md +136 -0
- package/skills/business-advisory-council/SKILL.md +94 -0
- package/skills/business-advisory-council/business-advisory-council.py +492 -0
- package/skills/business-advisory-council/discord-components-decision.json +8 -0
- package/skills/business-advisory-council/examples/steve-conley-partnership.json +6 -0
- package/skills/business-advisory-council/steve-conley-call-brief.json +6 -0
- package/skills/churn-prevention/SKILL.md +305 -0
- package/skills/churn-prevention/evals/evals.json +93 -0
- package/skills/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/skills/churn-prevention/references/dunning-playbook.md +408 -0
- package/skills/claw-compactor/LICENSE +21 -0
- package/skills/claw-compactor/README.md +459 -0
- package/skills/claw-compactor/SKILL.md +329 -0
- package/skills/claw-compactor/benchmark/RESULTS.md +104 -0
- package/skills/claw-compactor/benchmark/__init__.py +1 -0
- package/skills/claw-compactor/benchmark/compressors.py +520 -0
- package/skills/claw-compactor/benchmark/data/sample_01_devops.json +82 -0
- package/skills/claw-compactor/benchmark/data/sample_02_trading.json +54 -0
- package/skills/claw-compactor/benchmark/data/sample_03_ml_short.json +38 -0
- package/skills/claw-compactor/benchmark/data/sample_04_mixed_long.json +318 -0
- package/skills/claw-compactor/benchmark/data/sample_05_sysadmin.json +56 -0
- package/skills/claw-compactor/benchmark/evaluate.py +278 -0
- package/skills/claw-compactor/benchmark/report.py +241 -0
- package/skills/claw-compactor/benchmark/results/benchmark_results.json +405 -0
- package/skills/claw-compactor/benchmark/run_benchmark.py +238 -0
- package/skills/claw-compactor/engram.yaml +49 -0
- package/skills/claw-compactor/proxy/README.md +87 -0
- package/skills/claw-compactor/proxy/dashboard.html +804 -0
- package/skills/claw-compactor/proxy/event-log.mjs +213 -0
- package/skills/claw-compactor/proxy/fair-queue.mjs +288 -0
- package/skills/claw-compactor/proxy/metrics-store.mjs +425 -0
- package/skills/claw-compactor/proxy/package-lock.json +125 -0
- package/skills/claw-compactor/proxy/package.json +15 -0
- package/skills/claw-compactor/proxy/portal.html +360 -0
- package/skills/claw-compactor/proxy/process-registry.mjs +447 -0
- package/skills/claw-compactor/proxy/rate-limiter.mjs +117 -0
- package/skills/claw-compactor/proxy/redis-client.mjs +75 -0
- package/skills/claw-compactor/proxy/retry.mjs +182 -0
- package/skills/claw-compactor/proxy/server.mjs +2100 -0
- package/skills/claw-compactor/proxy/session-affinity.mjs +177 -0
- package/skills/claw-compactor/proxy/start.sh +23 -0
- package/skills/claw-compactor/proxy/test/event-log.test.mjs +237 -0
- package/skills/claw-compactor/proxy/test/helpers.mjs +103 -0
- package/skills/claw-compactor/proxy/test/integration.test.mjs +297 -0
- package/skills/claw-compactor/proxy/test/metrics-store.test.mjs +243 -0
- package/skills/claw-compactor/proxy/test/process-registry.test.mjs +390 -0
- package/skills/claw-compactor/proxy/test/rate-limiter.test.mjs +121 -0
- package/skills/claw-compactor/proxy/test/redis-client.test.mjs +62 -0
- package/skills/claw-compactor/proxy/test/token-tracker.test.mjs +200 -0
- package/skills/claw-compactor/proxy/token-tracker.mjs +482 -0
- package/skills/claw-compactor/pyproject.toml +26 -0
- package/skills/claw-compactor/references/README.md +44 -0
- package/skills/claw-compactor/references/architecture.md +197 -0
- package/skills/claw-compactor/references/benchmarks.md +94 -0
- package/skills/claw-compactor/references/compression-prompts.md +39 -0
- package/skills/claw-compactor/references/compression-techniques.md +219 -0
- package/skills/claw-compactor/references/testing.md +160 -0
- package/skills/claw-compactor/scripts/audit_memory.py +216 -0
- package/skills/claw-compactor/scripts/compress_memory.py +236 -0
- package/skills/claw-compactor/scripts/compressed_context.py +280 -0
- package/skills/claw-compactor/scripts/dedup_memory.py +147 -0
- package/skills/claw-compactor/scripts/dictionary_compress.py +170 -0
- package/skills/claw-compactor/scripts/engram-auto.sh +152 -0
- package/skills/claw-compactor/scripts/engram_auto.py +695 -0
- package/skills/claw-compactor/scripts/engram_cli.py +474 -0
- package/skills/claw-compactor/scripts/estimate_tokens.py +131 -0
- package/skills/claw-compactor/scripts/generate_summary_tiers.py +292 -0
- package/skills/claw-compactor/scripts/lib/__init__.py +34 -0
- package/skills/claw-compactor/scripts/lib/config.py +289 -0
- package/skills/claw-compactor/scripts/lib/dedup.py +119 -0
- package/skills/claw-compactor/scripts/lib/dictionary.py +281 -0
- package/skills/claw-compactor/scripts/lib/engram.py +793 -0
- package/skills/claw-compactor/scripts/lib/engram_prompts.py +175 -0
- package/skills/claw-compactor/scripts/lib/engram_storage.py +254 -0
- package/skills/claw-compactor/scripts/lib/exceptions.py +24 -0
- package/skills/claw-compactor/scripts/lib/markdown.py +312 -0
- package/skills/claw-compactor/scripts/lib/rle.py +165 -0
- package/skills/claw-compactor/scripts/lib/tokenizer_optimizer.py +188 -0
- package/skills/claw-compactor/scripts/lib/tokens.py +68 -0
- package/skills/claw-compactor/scripts/mem_compress.py +788 -0
- package/skills/claw-compactor/scripts/observation_compressor.py +346 -0
- package/skills/claw-compactor/tests/__init__.py +0 -0
- package/skills/claw-compactor/tests/conftest.py +94 -0
- package/skills/claw-compactor/tests/test_audit_comprehensive.py +123 -0
- package/skills/claw-compactor/tests/test_audit_memory.py +67 -0
- package/skills/claw-compactor/tests/test_benchmark.py +122 -0
- package/skills/claw-compactor/tests/test_cli_commands.py +228 -0
- package/skills/claw-compactor/tests/test_compress_memory.py +109 -0
- package/skills/claw-compactor/tests/test_compress_memory_comprehensive.py +191 -0
- package/skills/claw-compactor/tests/test_compressed_context.py +145 -0
- package/skills/claw-compactor/tests/test_config.py +54 -0
- package/skills/claw-compactor/tests/test_dedup_memory.py +124 -0
- package/skills/claw-compactor/tests/test_dictionary.py +327 -0
- package/skills/claw-compactor/tests/test_dictionary_comprehensive.py +241 -0
- package/skills/claw-compactor/tests/test_engram.py +1091 -0
- package/skills/claw-compactor/tests/test_engram_auto.py +529 -0
- package/skills/claw-compactor/tests/test_error_handling.py +194 -0
- package/skills/claw-compactor/tests/test_estimate_tokens.py +99 -0
- package/skills/claw-compactor/tests/test_generate_summary_tiers.py +105 -0
- package/skills/claw-compactor/tests/test_integration.py +249 -0
- package/skills/claw-compactor/tests/test_lib_dedup.py +135 -0
- package/skills/claw-compactor/tests/test_lib_markdown.py +388 -0
- package/skills/claw-compactor/tests/test_lib_tokens.py +82 -0
- package/skills/claw-compactor/tests/test_main_entry.py +176 -0
- package/skills/claw-compactor/tests/test_markdown_advanced.py +284 -0
- package/skills/claw-compactor/tests/test_new_features.py +77 -0
- package/skills/claw-compactor/tests/test_observation_comprehensive.py +261 -0
- package/skills/claw-compactor/tests/test_observation_compressor.py +128 -0
- package/skills/claw-compactor/tests/test_performance.py +172 -0
- package/skills/claw-compactor/tests/test_pipeline.py +109 -0
- package/skills/claw-compactor/tests/test_real_workspace.py +161 -0
- package/skills/claw-compactor/tests/test_rle.py +114 -0
- package/skills/claw-compactor/tests/test_rle_comprehensive.py +151 -0
- package/skills/claw-compactor/tests/test_roundtrip.py +253 -0
- package/skills/claw-compactor/tests/test_roundtrip_comprehensive.py +192 -0
- package/skills/claw-compactor/tests/test_tiers_comprehensive.py +171 -0
- package/skills/claw-compactor/tests/test_token_economics.py +237 -0
- package/skills/claw-compactor/tests/test_tokenizer_optimizer.py +175 -0
- package/skills/claw-compactor/tests/test_tokenizer_optimizer_comprehensive.py +241 -0
- package/skills/claw-compactor/tests/test_tokens.py +27 -0
- package/skills/cmo/CHANGELOG.md +61 -0
- package/skills/cmo/SKILL.md +500 -0
- package/skills/cmo/references/ai-slop-patterns.md +56 -0
- package/skills/cmo/references/analytics-guide.md +152 -0
- package/skills/cmo/references/ideas-library.md +197 -0
- package/skills/cmo/rules/brand-file-map.md +198 -0
- package/skills/cmo/rules/brand-memory.md +158 -0
- package/skills/cmo/rules/cli-runtime-index.md +95 -0
- package/skills/cmo/rules/command-reference.md +167 -0
- package/skills/cmo/rules/communication.md +15 -0
- package/skills/cmo/rules/context-switch.md +101 -0
- package/skills/cmo/rules/ecosystem.md +125 -0
- package/skills/cmo/rules/error-recovery.md +98 -0
- package/skills/cmo/rules/learning-loop.md +170 -0
- package/skills/cmo/rules/monorepo.md +78 -0
- package/skills/cmo/rules/output-format.md +124 -0
- package/skills/cmo/rules/persona.md +15 -0
- package/skills/cmo/rules/playbooks.md +327 -0
- package/skills/cmo/rules/progressive-enhancement.md +231 -0
- package/skills/cmo/rules/publish-index.md +106 -0
- package/skills/cmo/rules/quality-gate.md +90 -0
- package/skills/cmo/rules/recency-grounding.md +124 -0
- package/skills/cmo/rules/safety.md +80 -0
- package/skills/cmo/rules/studio-api-index.md +138 -0
- package/skills/cmo/rules/studio-integration.md +147 -0
- package/skills/cmo/rules/sub-agents.md +167 -0
- package/skills/cold-email/SKILL.md +240 -0
- package/skills/cold-email/evals/evals.json +94 -0
- package/skills/cold-email/references/benchmarks.md +83 -0
- package/skills/cold-email/references/follow-up-sequences.md +81 -0
- package/skills/cold-email/references/frameworks.md +90 -0
- package/skills/cold-email/references/personalization.md +79 -0
- package/skills/cold-email/references/subject-lines.md +53 -0
- package/skills/competitive-intel/SKILL.md +433 -0
- package/skills/competitive-intel/references/competitive-frameworks.md +145 -0
- package/skills/competitor-alternatives/SKILL.md +362 -0
- package/skills/competitor-alternatives/evals/evals.json +93 -0
- package/skills/competitor-alternatives/references/content-architecture.md +271 -0
- package/skills/competitor-alternatives/references/templates.md +223 -0
- package/skills/concreteness-fixer/SKILL.md +483 -0
- package/skills/concreteness-fixer/scripts/validation/concreteness-validator.js +221 -0
- package/skills/concreteness-fixer/utils/execFileNoThrow.js +16 -0
- package/skills/content-atomizer/SKILL.md +424 -0
- package/skills/content-atomizer/references/hook-strategies.md +56 -0
- package/skills/content-atomizer/references/platform-specs.md +118 -0
- package/skills/content-atomizer/references/platforms/bluesky.md +64 -0
- package/skills/content-atomizer/references/platforms/instagram.md +77 -0
- package/skills/content-atomizer/references/platforms/linkedin.md +120 -0
- package/skills/content-atomizer/references/platforms/reddit.md +73 -0
- package/skills/content-atomizer/references/platforms/threads.md +64 -0
- package/skills/content-atomizer/references/platforms/tiktok.md +55 -0
- package/skills/content-atomizer/references/platforms/twitter.md +123 -0
- package/skills/content-atomizer/references/platforms/youtube.md +56 -0
- package/skills/content-atomizer/references/tweet-patterns.md +40 -0
- package/skills/content-repost-manager/SKILL.md +245 -0
- package/skills/content-repost-manager/scripts/content-repost-scan.py +133 -0
- package/skills/context-recovery/.clawdhub/origin.json +7 -0
- package/skills/context-recovery/SKILL.md +198 -0
- package/skills/context-recovery/_meta.json +6 -0
- package/skills/conversion-flow-cro/SKILL.md +248 -0
- package/skills/conversion-flow-cro/references/flow-benchmarks.md +158 -0
- package/skills/copy-editing/SKILL.md +474 -0
- package/skills/copy-editing/evals/evals.json +89 -0
- package/skills/copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/copywriting/SKILL.md +349 -0
- package/skills/copywriting/evals/evals.json +111 -0
- package/skills/copywriting/references/awareness-level-guide.md +227 -0
- package/skills/copywriting/references/copy-frameworks.md +389 -0
- package/skills/copywriting/references/natural-transitions.md +272 -0
- package/skills/creative/SKILL.md +365 -0
- package/skills/creative/modes/ad-creative.md +1748 -0
- package/skills/creative/modes/product-photo.md +1520 -0
- package/skills/creative/modes/product-video.md +1657 -0
- package/skills/creative/modes/social-graphics.md +1511 -0
- package/skills/creative/modes/talking-head.md +2208 -0
- package/skills/creative/references/VISUAL_INTELLIGENCE.md +1233 -0
- package/skills/deep-serp-article/SKILL.md +677 -0
- package/skills/deep-serp-article/SKILL.md.bak +530 -0
- package/skills/earned-media/SKILL.md +260 -0
- package/skills/email-sequences/SKILL.md +446 -0
- package/skills/email-sequences/references/sequence-templates.md +1217 -0
- package/skills/firecrawl/.skill-meta.json +13 -0
- package/skills/firecrawl/SKILL.md +154 -0
- package/skills/firecrawl/rules/install.md +63 -0
- package/skills/firecrawl/rules/security.md +26 -0
- package/skills/form-cro/SKILL.md +429 -0
- package/skills/form-cro/evals/evals.json +90 -0
- package/skills/free-tool-strategy/SKILL.md +325 -0
- package/skills/free-tool-strategy/evals/evals.json +90 -0
- package/skills/free-tool-strategy/references/tool-types.md +253 -0
- package/skills/frontend-slides/SKILL.md +248 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +347 -0
- package/skills/frontend-slides/animation-patterns.md +110 -0
- package/skills/frontend-slides/html-template.md +347 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/guardrail-framework/SKILL.md +319 -0
- package/skills/hook-generator/SKILL.md +438 -0
- package/skills/hook-generator/database/2026-PLATFORM-RESEARCH.md +211 -0
- package/skills/hook-generator/database/instagram-hooks.json +591 -0
- package/skills/hook-generator/database/linkedin-hooks.json +502 -0
- package/skills/hook-generator/database/medium-hooks.json +181 -0
- package/skills/hook-generator/database/tiktok-hooks.json +337 -0
- package/skills/hook-generator/database/twitter-hooks.json +567 -0
- package/skills/hook-generator/database/youtube-hooks.json +275 -0
- package/skills/hook-generator/package-lock.json +24 -0
- package/skills/hook-generator/package.json +5 -0
- package/skills/hook-generator/references/hook-generation-system.md +257 -0
- package/skills/hook-generator/references/hook-performance-analysis.json +153 -0
- package/skills/hook-generator/references/hooks-library.md +128 -0
- package/skills/hook-generator/references/platform-hook-frameworks.md +275 -0
- package/skills/hook-generator/scripts/generate-hooks-unified.js +722 -0
- package/skills/hook-generator/scripts/generate-hooks.js +225 -0
- package/skills/hook-generator/scripts/generate.sh +36 -0
- package/skills/hook-generator/scripts/ralph-hook-enhancer.js +864 -0
- package/skills/hook-generator/scripts/test-gemini-output.js +51 -0
- package/skills/humanizer/README.md +120 -0
- package/skills/humanizer/SKILL.md +699 -0
- package/skills/image-gen/SKILL.md +277 -0
- package/skills/image-gen/references/prompt-patterns.md +114 -0
- package/skills/image-gen/references/visual-metaphors.md +51 -0
- package/skills/impeccable/SKILL.md +86 -0
- package/skills/impeccable/reference/adapt.md +312 -0
- package/skills/impeccable/reference/adapt.native.md +58 -0
- package/skills/impeccable/reference/android.md +40 -0
- package/skills/impeccable/reference/animate.md +86 -0
- package/skills/impeccable/reference/audit.md +136 -0
- package/skills/impeccable/reference/audit.native.md +139 -0
- package/skills/impeccable/reference/bolder.md +31 -0
- package/skills/impeccable/reference/clarify.md +94 -0
- package/skills/impeccable/reference/colorize.md +86 -0
- package/skills/impeccable/reference/craft-floor.md +42 -0
- package/skills/impeccable/reference/craft.md +5 -0
- package/skills/impeccable/reference/critique.md +788 -0
- package/skills/impeccable/reference/degraded/asset-producer.md +90 -0
- package/skills/impeccable/reference/degraded/documenter.md +24 -0
- package/skills/impeccable/reference/degraded/finish-reviewer.md +37 -0
- package/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/skills/impeccable/reference/delight.md +70 -0
- package/skills/impeccable/reference/distill.md +111 -0
- package/skills/impeccable/reference/doctor.md +53 -0
- package/skills/impeccable/reference/document.md +416 -0
- package/skills/impeccable/reference/extract.md +69 -0
- package/skills/impeccable/reference/harden.md +336 -0
- package/skills/impeccable/reference/hooks.md +105 -0
- package/skills/impeccable/reference/init.md +125 -0
- package/skills/impeccable/reference/ios.md +45 -0
- package/skills/impeccable/reference/layout.md +84 -0
- package/skills/impeccable/reference/live-setup.md +102 -0
- package/skills/impeccable/reference/live.md +323 -0
- package/skills/impeccable/reference/new-work.md +110 -0
- package/skills/impeccable/reference/onboard.md +234 -0
- package/skills/impeccable/reference/operate.md +61 -0
- package/skills/impeccable/reference/optimize.md +258 -0
- package/skills/impeccable/reference/overdrive.md +127 -0
- package/skills/impeccable/reference/polish.md +97 -0
- package/skills/impeccable/reference/quieter.md +99 -0
- package/skills/impeccable/reference/routing.md +18 -0
- package/skills/impeccable/reference/shape.md +59 -0
- package/skills/impeccable/reference/typeset.md +80 -0
- package/skills/impeccable/reference/visualize.md +49 -0
- package/skills/impeccable/scripts/command-metadata.json +94 -0
- package/skills/impeccable/scripts/concept-seed.mjs +558 -0
- package/skills/impeccable/scripts/context-signals.mjs +334 -0
- package/skills/impeccable/scripts/context.mjs +1467 -0
- package/skills/impeccable/scripts/critique-storage.mjs +213 -0
- package/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/skills/impeccable/scripts/detect.mjs +21 -0
- package/skills/impeccable/scripts/detector/browser/injected/index.mjs +2023 -0
- package/skills/impeccable/scripts/detector/cli/main.mjs +438 -0
- package/skills/impeccable/scripts/detector/design-system.mjs +1046 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +8283 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
- package/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +372 -0
- package/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +1168 -0
- package/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1186 -0
- package/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +264 -0
- package/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/skills/impeccable/scripts/detector/findings.mjs +18 -0
- package/skills/impeccable/scripts/detector/node/file-system.mjs +203 -0
- package/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/skills/impeccable/scripts/detector/registry/antipatterns.mjs +617 -0
- package/skills/impeccable/scripts/detector/rules/checks.mjs +5580 -0
- package/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/skills/impeccable/scripts/detector/shared/constants.mjs +112 -0
- package/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
- package/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/skills/impeccable/scripts/doctor.mjs +336 -0
- package/skills/impeccable/scripts/embed-prompt.mjs +133 -0
- package/skills/impeccable/scripts/generate-image.mjs +240 -0
- package/skills/impeccable/scripts/hook-admin.mjs +801 -0
- package/skills/impeccable/scripts/hook-before-edit.mjs +508 -0
- package/skills/impeccable/scripts/hook-lib.mjs +2153 -0
- package/skills/impeccable/scripts/hook.mjs +78 -0
- package/skills/impeccable/scripts/lib/artifact-schema.mjs +93 -0
- package/skills/impeccable/scripts/lib/composition-catalog.mjs +200 -0
- package/skills/impeccable/scripts/lib/concept-catalog.mjs +384 -0
- package/skills/impeccable/scripts/lib/design-parser.mjs +925 -0
- package/skills/impeccable/scripts/lib/impeccable-config.mjs +658 -0
- package/skills/impeccable/scripts/lib/impeccable-paths.mjs +137 -0
- package/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
- package/skills/impeccable/scripts/lib/provider.mjs +5 -0
- package/skills/impeccable/scripts/lib/roll-selection.mjs +362 -0
- package/skills/impeccable/scripts/lib/staleness-deep.mjs +478 -0
- package/skills/impeccable/scripts/lib/staleness-notice.mjs +169 -0
- package/skills/impeccable/scripts/lib/staleness.mjs +457 -0
- package/skills/impeccable/scripts/lib/surface-briefs.mjs +151 -0
- package/skills/impeccable/scripts/lib/target-args.mjs +42 -0
- package/skills/impeccable/scripts/lib/target-slug.mjs +33 -0
- package/skills/impeccable/scripts/lib/template-extensions.mjs +146 -0
- package/skills/impeccable/scripts/live/accept-css.mjs +617 -0
- package/skills/impeccable/scripts/live/accept-verify.mjs +60 -0
- package/skills/impeccable/scripts/live/browser-script-parts.mjs +55 -0
- package/skills/impeccable/scripts/live/completion.mjs +28 -0
- package/skills/impeccable/scripts/live/event-validation.mjs +199 -0
- package/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
- package/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +73 -0
- package/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
- package/skills/impeccable/scripts/live/frameworks/journal.mjs +197 -0
- package/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
- package/skills/impeccable/scripts/live/frameworks/nuxt.mjs +161 -0
- package/skills/impeccable/scripts/live/frameworks/script-src.mjs +17 -0
- package/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
- package/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
- package/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
- package/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
- package/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
- package/skills/impeccable/scripts/live/generation-preflight.mjs +149 -0
- package/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
- package/skills/impeccable/scripts/live/instructions.mjs +142 -0
- package/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
- package/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
- package/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
- package/skills/impeccable/scripts/live/poll-lanes.mjs +14 -0
- package/skills/impeccable/scripts/live/roots.mjs +508 -0
- package/skills/impeccable/scripts/live/session-store.mjs +563 -0
- package/skills/impeccable/scripts/live/source-lock.mjs +105 -0
- package/skills/impeccable/scripts/live/source-search.mjs +105 -0
- package/skills/impeccable/scripts/live/svelte-ast.mjs +961 -0
- package/skills/impeccable/scripts/live/svelte-component.mjs +1342 -0
- package/skills/impeccable/scripts/live/sveltekit-adapter.mjs +316 -0
- package/skills/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
- package/skills/impeccable/scripts/live/ui-core.mjs +180 -0
- package/skills/impeccable/scripts/live/vocabulary.mjs +171 -0
- package/skills/impeccable/scripts/live-accept.mjs +954 -0
- package/skills/impeccable/scripts/live-browser-dom.js +146 -0
- package/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/skills/impeccable/scripts/live-browser.js +12520 -0
- package/skills/impeccable/scripts/live-commit-manual-edits.mjs +1244 -0
- package/skills/impeccable/scripts/live-complete.mjs +107 -0
- package/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/skills/impeccable/scripts/live-inject.mjs +503 -0
- package/skills/impeccable/scripts/live-insert.mjs +292 -0
- package/skills/impeccable/scripts/live-manual-edit-evidence.mjs +368 -0
- package/skills/impeccable/scripts/live-poll.mjs +429 -0
- package/skills/impeccable/scripts/live-resume.mjs +123 -0
- package/skills/impeccable/scripts/live-server.mjs +1669 -0
- package/skills/impeccable/scripts/live-status.mjs +71 -0
- package/skills/impeccable/scripts/live-target.mjs +30 -0
- package/skills/impeccable/scripts/live-wrap.mjs +927 -0
- package/skills/impeccable/scripts/live.mjs +359 -0
- package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/impeccable/scripts/palette.mjs +628 -0
- package/skills/impeccable/scripts/pin.mjs +221 -0
- package/skills/impeccable/scripts/serve-question.mjs +932 -0
- package/skills/impeccable/scripts/surface-brief.mjs +74 -0
- package/skills/inkstone-admin/SKILL.md +66 -0
- package/skills/jev-hook-gate/SKILL.md +111 -0
- package/skills/keyword-research/SKILL.md +503 -0
- package/skills/keyword-research/references/dr-cap-and-confidence.md +62 -0
- package/skills/keyword-research/references/keyword-examples.md +769 -0
- package/skills/landing-page-architect/SKILL.md +585 -0
- package/skills/landing-page-architect/references/architecture-reference.md +32 -0
- package/skills/launch-strategy/SKILL.md +384 -0
- package/skills/launch-strategy/evals/evals.json +91 -0
- package/skills/launch-strategy/references/launch-checklist.md +209 -0
- package/skills/launch-strategy/references/launch-timeline.md +159 -0
- package/skills/lead-email-craft/SKILL.md +522 -0
- package/skills/lead-magnets/SKILL.md +310 -0
- package/skills/lead-magnets/references/benchmarks.md +129 -0
- package/skills/lead-magnets/references/format-guide.md +196 -0
- package/skills/link-building-seo/SKILL.md +210 -0
- package/skills/lint-report.txt +1 -0
- package/skills/manifest.json +129 -0
- package/skills/marketing-demo/SKILL.md +249 -0
- package/skills/marketing-demo/references/remotion-examples.md +281 -0
- package/skills/marketing-ideas/SKILL.md +167 -0
- package/skills/marketing-ideas/evals/evals.json +90 -0
- package/skills/marketing-ideas/references/ideas-by-category.md +366 -0
- package/skills/marketing-psychology/SKILL.md +374 -0
- package/skills/marketing-psychology/evals/evals.json +88 -0
- package/skills/marketing-psychology/references/case-studies.md +148 -0
- package/skills/narrative-research-article/SKILL.md +469 -0
- package/skills/narrative-research-article/references/lanusse-patterns.md +166 -0
- package/skills/notebooklm/SKILL.md +674 -0
- package/skills/off-page-seo/SKILL.md +219 -0
- package/skills/onboarding-cro/SKILL.md +220 -0
- package/skills/onboarding-cro/evals/evals.json +92 -0
- package/skills/onboarding-cro/references/experiments.md +258 -0
- package/skills/original-research/SKILL.md +388 -0
- package/skills/page-cro/SKILL.md +269 -0
- package/skills/page-cro/references/cro-benchmarks.md +140 -0
- package/skills/paper-marketing/SKILL.md +448 -0
- package/skills/paper-marketing/references/agent-quality-rubric.md +68 -0
- package/skills/paper-marketing/references/brand-system-template.md +120 -0
- package/skills/paper-marketing/references/paper-mcp-rules.md +71 -0
- package/skills/paper-marketing/references/platform-conventions.md +43 -0
- package/skills/paywall-upgrade-cro/SKILL.md +227 -0
- package/skills/paywall-upgrade-cro/evals/evals.json +93 -0
- package/skills/paywall-upgrade-cro/references/experiments.md +164 -0
- package/skills/platform-formatting/SKILL.md +51 -0
- package/skills/popup-cro/SKILL.md +454 -0
- package/skills/popup-cro/evals/evals.json +94 -0
- package/skills/positioning-angles/SKILL.md +524 -0
- package/skills/positioning-angles/references/ad-matrix-and-examples.md +176 -0
- package/skills/positioning-angles/references/angle-frameworks.md +187 -0
- package/skills/positioning-angles/references/dunford-positioning.md +135 -0
- package/skills/positioning-angles/references/hormozi-offer.md +247 -0
- package/skills/positioning-angles/references/schwartz-sophistication.md +166 -0
- package/skills/positioning-angles/references/unique-mechanism.md +162 -0
- package/skills/pricing-strategy/SKILL.md +346 -0
- package/skills/pricing-strategy/evals/evals.json +90 -0
- package/skills/pricing-strategy/references/research-methods.md +152 -0
- package/skills/pricing-strategy/references/tier-structure.md +307 -0
- package/skills/programmatic-seo/SKILL.md +238 -0
- package/skills/programmatic-seo/evals/evals.json +94 -0
- package/skills/programmatic-seo/references/playbooks.md +308 -0
- package/skills/project-rag/SKILL.md +127 -0
- package/skills/quality-gate/SKILL.md +519 -0
- package/skills/quality-gate/judge-personas/buyer.md +47 -0
- package/skills/quality-gate/judge-personas/expert.md +47 -0
- package/skills/quality-gate/judge-personas/outsider.md +47 -0
- package/skills/quality-gate/judge-personas/scanner.md +41 -0
- package/skills/quality-gate/judge-personas/skeptic.md +40 -0
- package/skills/referral-program/SKILL.md +290 -0
- package/skills/referral-program/evals/evals.json +89 -0
- package/skills/referral-program/references/affiliate-programs.md +163 -0
- package/skills/referral-program/references/program-examples.md +143 -0
- package/skills/review-sites/SKILL.md +279 -0
- package/skills/revops/SKILL.md +343 -0
- package/skills/revops/evals/evals.json +91 -0
- package/skills/revops/references/automation-playbooks.md +290 -0
- package/skills/revops/references/lifecycle-definitions.md +278 -0
- package/skills/revops/references/routing-rules.md +203 -0
- package/skills/revops/references/scoring-models.md +247 -0
- package/skills/saas-product-seo/SKILL.md +324 -0
- package/skills/sales-enablement/SKILL.md +349 -0
- package/skills/sales-enablement/evals/evals.json +91 -0
- package/skills/sales-enablement/references/deck-frameworks.md +263 -0
- package/skills/sales-enablement/references/demo-scripts.md +355 -0
- package/skills/sales-enablement/references/objection-library.md +270 -0
- package/skills/sales-enablement/references/one-pager-templates.md +208 -0
- package/skills/schema-markup/SKILL.md +179 -0
- package/skills/schema-markup/evals/evals.json +87 -0
- package/skills/schema-markup/references/schema-examples.md +398 -0
- package/skills/self-improve/SKILL.md +166 -0
- package/skills/self-improving-agent/README.md +243 -0
- package/skills/self-improving-agent/SKILL.md +437 -0
- package/skills/self-improving-agent/scripts/__init__.py +16 -0
- package/skills/self-improving-agent/scripts/__pycache__/auto_detect.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/__pycache__/nlm_curation.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/__pycache__/self_improving_agent.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/auto_detect.py +270 -0
- package/skills/self-improving-agent/scripts/init_expertise_registry.py +89 -0
- package/skills/self-improving-agent/scripts/nlm_curation.py +259 -0
- package/skills/self-improving-agent/scripts/self-improving-agent +113 -0
- package/skills/self-improving-agent/scripts/self_improving_agent.py +603 -0
- package/skills/self-improving-agent/scripts/test_curation_scorer.py +20 -0
- package/skills/self-improving-agent/scripts/test_self_improving.py +184 -0
- package/skills/send-email/SKILL.md +426 -0
- package/skills/send-email/references/batch-email-examples.md +807 -0
- package/skills/send-email/references/best-practices.md +453 -0
- package/skills/send-email/references/installation.md +123 -0
- package/skills/send-email/references/single-email-examples.md +470 -0
- package/skills/send-email/references/webhooks.md +221 -0
- package/skills/seo-audit/SKILL.md +362 -0
- package/skills/seo-audit/references/ai-writing-detection.md +200 -0
- package/skills/seo-audit/references/architecture-patterns.md +271 -0
- package/skills/seo-audit/references/schema-templates.md +427 -0
- package/skills/seo-content/SKILL.md +510 -0
- package/skills/seo-content/references/anti-ai-detection.md +184 -0
- package/skills/seo-content/references/content-structures.md +148 -0
- package/skills/seo-content/references/eeat-examples.md +235 -0
- package/skills/seo-content/references/on-page-seo.md +261 -0
- package/skills/seo-content/references/pseo-playbooks.md +226 -0
- package/skills/seo-content/references/schema-templates.md +104 -0
- package/skills/seo-content/references/serp-analysis-format.md +151 -0
- package/skills/seo-machine/SKILL.md +331 -0
- package/skills/seo-machine/assets/brand-template.md +73 -0
- package/skills/seo-machine/assets/link-inventory-template.md +74 -0
- package/skills/seo-machine/assets/roadmap-template.md +184 -0
- package/skills/seo-machine/references/api-stack-recipes.md +230 -0
- package/skills/seo-machine/references/exa-recipes.md +260 -0
- package/skills/seo-machine/references/manual-research.md +73 -0
- package/skills/seo-machine/references/methodology.md +87 -0
- package/skills/seo-machine/references/off-page.md +123 -0
- package/skills/seo-machine/references/patterns/alternatives.md +176 -0
- package/skills/seo-machine/references/patterns/compare.md +105 -0
- package/skills/seo-machine/references/patterns/playbooks.md +106 -0
- package/skills/seo-machine/references/patterns/use-case.md +109 -0
- package/skills/seo-machine/references/quality-bars.md +99 -0
- package/skills/seo-machine/references/stacks/astro.md +156 -0
- package/skills/seo-machine/references/stacks/detection.md +61 -0
- package/skills/seo-machine/references/stacks/markdown-fallback.md +181 -0
- package/skills/seo-machine/references/stacks/nextjs.md +108 -0
- package/skills/seo-machine/references/stacks/rails-inertia.md +99 -0
- package/skills/seo-machine/references/striking-distance.md +116 -0
- package/skills/seo-machine/references/technical-audit.md +153 -0
- package/skills/seo-machine/scripts/link_audit.py +265 -0
- package/skills/seo-machine/scripts/tech_audit.py +221 -0
- package/skills/seo-machine/scripts/word_count.py +154 -0
- package/skills/sharp-thesis-validator/SKILL.md +393 -0
- package/skills/sharp-thesis-validator/examples.md +186 -0
- package/skills/signup-flow-cro/SKILL.md +359 -0
- package/skills/signup-flow-cro/evals/evals.json +88 -0
- package/skills/site-architecture/SKILL.md +357 -0
- package/skills/site-architecture/evals/evals.json +88 -0
- package/skills/site-architecture/references/mermaid-templates.md +216 -0
- package/skills/site-architecture/references/navigation-patterns.md +305 -0
- package/skills/site-architecture/references/site-type-templates.md +293 -0
- package/skills/skill-self-improvement/SKILL.md +151 -0
- package/skills/slideshow-script/SKILL.md +274 -0
- package/skills/slideshow-script/references/content-spec-schema.md +77 -0
- package/skills/slideshow-script/references/frameworks.md +84 -0
- package/skills/slideshow-script/references/paips-framework.md +37 -0
- package/skills/social-campaign/SKILL.md +419 -0
- package/skills/social-campaign/references/paper-mcp-workflow.md +48 -0
- package/skills/social-content/SKILL.md +359 -0
- package/skills/social-content/evals/evals.json +92 -0
- package/skills/social-content/references/platforms.md +170 -0
- package/skills/social-content/references/post-templates.md +177 -0
- package/skills/social-content/references/reverse-engineering.md +195 -0
- package/skills/social-worker/SKILL.md +204 -0
- package/skills/startup-launcher/SKILL.md +252 -0
- package/skills/startup-launcher/references/file-router.md +64 -0
- package/skills/startup-launcher/references/platform-matrix.md +65 -0
- package/skills/startup-launcher/references/platforms/alternativeto.md +283 -0
- package/skills/startup-launcher/references/platforms/appsumo.md +495 -0
- package/skills/startup-launcher/references/platforms/auraplusplus.md +736 -0
- package/skills/startup-launcher/references/platforms/betalist.md +98 -0
- package/skills/startup-launcher/references/platforms/capterra.md +276 -0
- package/skills/startup-launcher/references/platforms/crunchbase.md +514 -0
- package/skills/startup-launcher/references/platforms/dealify.md +291 -0
- package/skills/startup-launcher/references/platforms/dealmirror.md +313 -0
- package/skills/startup-launcher/references/platforms/desifounder.md +490 -0
- package/skills/startup-launcher/references/platforms/devhunt.md +210 -0
- package/skills/startup-launcher/references/platforms/devpost.md +448 -0
- package/skills/startup-launcher/references/platforms/fazier.md +56 -0
- package/skills/startup-launcher/references/platforms/firsto.md +489 -0
- package/skills/startup-launcher/references/platforms/g2.md +226 -0
- package/skills/startup-launcher/references/platforms/hackernews.md +99 -0
- package/skills/startup-launcher/references/platforms/hackernoon.md +385 -0
- package/skills/startup-launcher/references/platforms/indiedeals.md +367 -0
- package/skills/startup-launcher/references/platforms/indiehackers.md +80 -0
- package/skills/startup-launcher/references/platforms/kenmoo.md +231 -0
- package/skills/startup-launcher/references/platforms/labstartups.md +618 -0
- package/skills/startup-launcher/references/platforms/launchboard.md +307 -0
- package/skills/startup-launcher/references/platforms/launchfast.md +560 -0
- package/skills/startup-launcher/references/platforms/launchigniter.md +56 -0
- package/skills/startup-launcher/references/platforms/launchingnext.md +674 -0
- package/skills/startup-launcher/references/platforms/launchit.md +574 -0
- package/skills/startup-launcher/references/platforms/launchyourapp.md +677 -0
- package/skills/startup-launcher/references/platforms/libhunt.md +220 -0
- package/skills/startup-launcher/references/platforms/ltdhunt.md +221 -0
- package/skills/startup-launcher/references/platforms/microlaunch.md +45 -0
- package/skills/startup-launcher/references/platforms/openalternative.md +195 -0
- package/skills/startup-launcher/references/platforms/peerlist.md +56 -0
- package/skills/startup-launcher/references/platforms/peerpush.md +64 -0
- package/skills/startup-launcher/references/platforms/primeclub.md +282 -0
- package/skills/startup-launcher/references/platforms/productcanyon.md +190 -0
- package/skills/startup-launcher/references/platforms/producthunt.md +98 -0
- package/skills/startup-launcher/references/platforms/rankinpublic.md +315 -0
- package/skills/startup-launcher/references/platforms/rockethub.md +374 -0
- package/skills/startup-launcher/references/platforms/saasgenius.md +175 -0
- package/skills/startup-launcher/references/platforms/saashub.md +205 -0
- package/skills/startup-launcher/references/platforms/saasmantra.md +221 -0
- package/skills/startup-launcher/references/platforms/saaspirate.md +287 -0
- package/skills/startup-launcher/references/platforms/saaswarrior.md +190 -0
- package/skills/startup-launcher/references/platforms/saaszilla.md +194 -0
- package/skills/startup-launcher/references/platforms/selected.md +925 -0
- package/skills/startup-launcher/references/platforms/sideprojectors.md +86 -0
- package/skills/startup-launcher/references/platforms/softonic.md +240 -0
- package/skills/startup-launcher/references/platforms/sourceforge.md +251 -0
- package/skills/startup-launcher/references/platforms/stacksocial.md +244 -0
- package/skills/startup-launcher/references/platforms/startupstash.md +326 -0
- package/skills/startup-launcher/references/platforms/theresanaiforthat.md +253 -0
- package/skills/startup-launcher/references/platforms/tinylaunch.md +70 -0
- package/skills/startup-launcher/references/platforms/tinystartups.md +72 -0
- package/skills/startup-launcher/references/platforms/toolfolio.md +291 -0
- package/skills/startup-launcher/references/platforms/trustmrr.md +194 -0
- package/skills/startup-launcher/references/platforms/trylaunch.md +531 -0
- package/skills/startup-launcher/references/platforms/uneed.md +57 -0
- package/skills/startup-launcher/references/templates/asset-checklist.md +218 -0
- package/skills/startup-launcher/references/templates/launch-tracker.md +195 -0
- package/skills/startup-launcher/references/templates/product-brief.md +98 -0
- package/skills/summarize/.skill-meta.json +13 -0
- package/skills/summarize/SKILL.md +170 -0
- package/skills/summarize/rules/install.md +157 -0
- package/skills/summarize/rules/usage.md +207 -0
- package/skills/topical-authority/SKILL.md +307 -0
- package/skills/topical-authority/references/jake-ward-framework.md +201 -0
- package/skills/topical-authority/references/serp-clustering-algorithm.md +325 -0
- package/skills/topical-authority/scripts/orchestrator.js +367 -0
- package/skills/topical-authority/scripts/seo/analyze-competitor-coverage.js +3 -0
- package/skills/topical-authority/scripts/seo/audit-internal-links.js +3 -0
- package/skills/topical-authority/scripts/seo/build-clusters-from-serp.js +3 -0
- package/skills/topical-authority/scripts/seo/extract-keywords-from-forums.js +3 -0
- package/skills/topical-authority/scripts/seo/extract-paa-questions.js +3 -0
- package/skills/topical-authority/scripts/seo/fetch-serp-urls.js +3 -0
- package/skills/topical-authority/scripts/seo/gemini-serp-clustering.js +3 -0
- package/skills/topical-authority/scripts/seo/identify-content-gaps.js +3 -0
- package/skills/topical-authority/scripts/seo/identify-research-gaps.js +3 -0
- package/skills/topical-authority/scripts/seo/scrape-quora-questions.js +3 -0
- package/skills/topical-authority/scripts/seo/scrape-reddit-pain-points.js +3 -0
- package/skills/topical-authority/scripts/seo/weave-internal-links.js +3 -0
- package/skills/visual-style/SKILL.md +199 -0
- package/skills/voice-brand-alignment/SKILL.md +70 -0
- package/skills/voice-brand-alignment/references/ai-slop-patterns.md +405 -0
- package/skills/voice-brand-alignment/scripts/validation/gemini-voice-validator.js +96 -0
- package/skills/voice-extraction/SKILL.md +234 -0
- package/skills/voice-extraction/references/extraction-prompt.md +155 -0
- package/skills/voice-extraction/references/voice-dna-template.md +168 -0
- package/skills/voice-extraction/references/voice-elements.md +259 -0
- package/skills/voice-extraction/scripts/build-corpus.js +120 -0
- package/skills/voice-extraction/scripts/collect-sources.sh +168 -0
- package/skills/warm-outbound/SKILL.md +299 -0
- package/skills/warm-outbound/templates/warm-message.md +39 -0
- package/skills/weekly-newsletter-digest/SKILL.md +78 -0
- package/skills/x-playwriter/SKILL.md +428 -0
- package/skills/x-playwriter/scripts/x-browser.js +185 -0
- package/skills/x-post-generator-openclaw/SKILL.md +138 -0
- package/skills/x-post-generator-openclaw/scripts/generate-x-post.js +537 -0
- package/skills/x-posting-playwriter/SKILL.md +203 -0
- package/skills/x-research/SKILL.md +129 -0
- package/skills/x-research/x-research.sh +85 -0
- package/skills/youtube-summarize/SKILL.md +90 -0
- package/skills/youtube-summarize/scripts/youtube-summarize.sh +143 -0
- package/src/cli.js +349 -172
- package/src/harness/deepseek-adapter.js +102 -0
- package/src/harness/deepseek.js +225 -0
- package/src/harness/opencode-adapter.js +174 -0
- package/src/harness/pi-adapter.js +172 -0
- package/src/harness/registry.js +121 -0
- package/src/harness/telemetry.js +102 -0
- package/src/harness/types.js +165 -0
- package/src/interview.js +36 -4
- package/src/postinstall.js +10 -12
- package/templates/AGENTS.md +17 -17
- package/templates/ORG.md +1 -1
- package/templates/TOOLS.md +7 -2
- package/templates/opencode.json +26 -29
- package/wiki/doctor.md +54 -0
- package/wiki/inkstone.md +4 -4
- package/wiki/opencode.md +3 -3
- package/skills/curated.txt +0 -68
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Quality Bars (Verification Gates)
|
|
2
|
+
|
|
3
|
+
Every page-shipping phase ends with a quality check. If it fails, fix it before declaring the phase complete. Don't ship under-spec work — it underperforms in rankings and you'll have to come back to fix it anyway.
|
|
4
|
+
|
|
5
|
+
## The four checks
|
|
6
|
+
|
|
7
|
+
| Check | Tool | Per pattern |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Word count | `scripts/word_count.py` | A ≥600, B/C ≥800, D ≥700, E ≥2,500 |
|
|
10
|
+
| Internal-link minimums | `scripts/link_audit.py` | See per-pattern minimums below |
|
|
11
|
+
| Schema markup | Manual JSON-LD check (or `scripts/tech_audit.py`) | See per-pattern schema requirements |
|
|
12
|
+
| Honesty section (alts only) | Manual visual check | Pattern A only — 3-4 rows |
|
|
13
|
+
|
|
14
|
+
## Internal-link minimums (per pattern)
|
|
15
|
+
|
|
16
|
+
The skill enforces these via `scripts/link_audit.py`.
|
|
17
|
+
|
|
18
|
+
### Pattern A — `/alternatives/[slug]`
|
|
19
|
+
|
|
20
|
+
- **Outbound from this page:** ≥2 sibling `/alternatives/*`, ≥1 `/features/*`, ≥1 `/tools/*` (or stack-equivalent)
|
|
21
|
+
- **Inbound to this page:** ≥2 existing pages must link here. Common spots: homepage, sibling alts, related feature pages.
|
|
22
|
+
|
|
23
|
+
### Pattern B/C — `/for/[slug]`
|
|
24
|
+
|
|
25
|
+
- **Outbound:** ≥2 `/features/*`, ≥2 `/tools/*`, ≥1 sibling `/for/*`
|
|
26
|
+
- **Inbound:** ≥2 existing pages
|
|
27
|
+
|
|
28
|
+
### Pattern D — `/compare/[slug]`
|
|
29
|
+
|
|
30
|
+
- **Outbound:** `/alternatives/[a]`, `/alternatives/[b]`, ≥1 relevant `/for/*`, `/pricing`
|
|
31
|
+
- **Inbound:** both `/alternatives/[a]` and `/alternatives/[b]` link here
|
|
32
|
+
|
|
33
|
+
### Pattern E — `/playbooks/[slug]`
|
|
34
|
+
|
|
35
|
+
- **Outbound (in body, not sidebar):** ≥3 `/features/*`, ≥2 `/tools/*`, ≥2 `/for/*`, ≥1 `/alternatives/*`
|
|
36
|
+
- **Inbound:** ≥2 existing pages (commonly other playbooks + a related `/for/*`)
|
|
37
|
+
|
|
38
|
+
## Universal rule
|
|
39
|
+
|
|
40
|
+
**Every page must be reachable from ≥2 other pages.** No orphans. Check via:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Find pages that nobody links to (orphans)
|
|
44
|
+
python scripts/link_audit.py --orphan-check
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Schema requirements (per pattern)
|
|
48
|
+
|
|
49
|
+
| Pattern | Required JSON-LD |
|
|
50
|
+
|---|---|
|
|
51
|
+
| Homepage | `SoftwareApplication` (or `Product`), `Organization` |
|
|
52
|
+
| `/alternatives/[slug]` | `SoftwareApplication`, `BreadcrumbList`, `FAQPage` |
|
|
53
|
+
| `/for/[slug]` | `SoftwareApplication`, `BreadcrumbList`, `FAQPage` |
|
|
54
|
+
| `/compare/[slug]` | `BreadcrumbList`, `FAQPage` |
|
|
55
|
+
| `/playbooks/[slug]` | `Article`, `BreadcrumbList` |
|
|
56
|
+
| `/tools/[slug]` | `SoftwareApplication` or `WebApplication`, `BreadcrumbList` |
|
|
57
|
+
|
|
58
|
+
Validate at https://validator.schema.org/ on the rendered URL. The skill can curl-and-check via `scripts/tech_audit.py --schema <url>`.
|
|
59
|
+
|
|
60
|
+
## Meta tag requirements (every page)
|
|
61
|
+
|
|
62
|
+
- Unique `<title>`, 30-60 chars
|
|
63
|
+
- Unique `<meta name="description">`, 100-155 chars
|
|
64
|
+
- `<link rel="canonical">` set to the absolute URL (no query params, no trailing slash if your convention is slashless)
|
|
65
|
+
- `<meta property="og:type">`, `og:title`, `og:description`, `og:image`, `og:url`
|
|
66
|
+
- `<meta name="twitter:card">` (`summary_large_image` is standard)
|
|
67
|
+
- Exactly one `<h1>` per page
|
|
68
|
+
|
|
69
|
+
## Honesty section (Pattern A only)
|
|
70
|
+
|
|
71
|
+
Verify presence visually. The section must have:
|
|
72
|
+
|
|
73
|
+
- An eyebrow + H2 labelling it (e.g. "Honest tradeoffs" / "Where [competitor] still wins")
|
|
74
|
+
- 3-4 rows, each with a feature/dimension and a 30+ word body
|
|
75
|
+
- Concrete: each row references a specific feature, not a vague "they're more polished"
|
|
76
|
+
- Honest: each row should be a real strength of the competitor, not a fake weakness in you
|
|
77
|
+
|
|
78
|
+
If the honesty section is missing or thin, the phase fails the quality gate. Rewrite before shipping.
|
|
79
|
+
|
|
80
|
+
## Verification gate flow
|
|
81
|
+
|
|
82
|
+
When a phase's page work is done:
|
|
83
|
+
|
|
84
|
+
1. Run `python scripts/word_count.py <stack-output-path>` — must be ≥ pattern minimum
|
|
85
|
+
2. Run `python scripts/link_audit.py --slug <slug> --pattern <a|b|c|d|e>` — must pass
|
|
86
|
+
3. If applicable, run `python scripts/tech_audit.py --schema <url>` — must validate
|
|
87
|
+
4. Manually verify honesty section (Pattern A)
|
|
88
|
+
5. Visit URL in browser, view-source, confirm:
|
|
89
|
+
- Full SSR HTML (search engines see content)
|
|
90
|
+
- Title + description + canonical present
|
|
91
|
+
- JSON-LD blocks render
|
|
92
|
+
6. **Only after all pass:** update tracker row to `completed` and write the phase summary
|
|
93
|
+
|
|
94
|
+
A failing gate is information, not blame. Often it surfaces:
|
|
95
|
+
- A thin section that needed more depth
|
|
96
|
+
- A missing internal link (easy to forget)
|
|
97
|
+
- A schema helper that didn't fire (existing helper has a bug)
|
|
98
|
+
|
|
99
|
+
Fix the root cause; don't paper over it.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Stack adapter — Astro
|
|
2
|
+
|
|
3
|
+
Astro is the cleanest fit for this skill: static-first, content-collections built-in, fast crawl performance, trivially indexable.
|
|
4
|
+
|
|
5
|
+
## Conventions to use
|
|
6
|
+
|
|
7
|
+
- **Content collections** for each pattern. Define schemas in `src/content/config.ts`.
|
|
8
|
+
- **Dynamic routes** via `src/pages/[pattern]/[slug].astro` with `getStaticPaths` from the collection.
|
|
9
|
+
- **Layouts** in `src/layouts/<Pattern>Layout.astro` — shared structure.
|
|
10
|
+
- **Sitemap** via `@astrojs/sitemap` integration (or hand-rolled `src/pages/sitemap.xml.ts`).
|
|
11
|
+
- **Schema/meta** in each layout's `<head>` via slot data.
|
|
12
|
+
|
|
13
|
+
## Content collection setup
|
|
14
|
+
|
|
15
|
+
`src/content/config.ts`:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { defineCollection, z } from 'astro:content'
|
|
19
|
+
|
|
20
|
+
const alternatives = defineCollection({
|
|
21
|
+
type: 'data',
|
|
22
|
+
schema: z.object({
|
|
23
|
+
competitor_name: z.string(),
|
|
24
|
+
hero_eyebrow: z.string(),
|
|
25
|
+
hero_h1: z.string(),
|
|
26
|
+
hero_lede: z.string(),
|
|
27
|
+
table_h2: z.string(),
|
|
28
|
+
table_lede: z.string(),
|
|
29
|
+
comparison_rows: z.array(z.object({ /* ... */ })),
|
|
30
|
+
switch_reasons: z.array(z.object({ /* ... */ })),
|
|
31
|
+
honesty_rows: z.array(z.object({ feature: z.string(), body: z.string() })),
|
|
32
|
+
faqs: z.array(z.object({ question: z.string(), answer: z.string() })),
|
|
33
|
+
// ...
|
|
34
|
+
}),
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const useCases = defineCollection({ type: 'data', schema: /* ForData */ })
|
|
38
|
+
const comparisons = defineCollection({ type: 'data', schema: /* ComparisonData */ })
|
|
39
|
+
const playbooks = defineCollection({ type: 'content', schema: /* metadata only; body in MDX */ })
|
|
40
|
+
|
|
41
|
+
export const collections = { alternatives, useCases, comparisons, playbooks }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Each entry lives in `src/content/alternatives/<slug>.json` (or `.yaml`). Schema enforces shape.
|
|
45
|
+
|
|
46
|
+
## Pattern A — `src/pages/alternatives/[slug].astro`
|
|
47
|
+
|
|
48
|
+
```astro
|
|
49
|
+
---
|
|
50
|
+
import { getCollection } from 'astro:content'
|
|
51
|
+
import AlternativeLayout from '@/layouts/AlternativeLayout.astro'
|
|
52
|
+
|
|
53
|
+
export async function getStaticPaths() {
|
|
54
|
+
const entries = await getCollection('alternatives')
|
|
55
|
+
return entries.map(entry => ({ params: { slug: entry.id }, props: { data: entry.data } }))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const { data } = Astro.props
|
|
59
|
+
---
|
|
60
|
+
<AlternativeLayout data={data} />
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The layout handles `<head>` (title, description, canonical, OG, JSON-LD) and renders the body.
|
|
64
|
+
|
|
65
|
+
## Pattern E — playbooks in MDX
|
|
66
|
+
|
|
67
|
+
Astro's content collections support MDX natively. Put each playbook in `src/content/playbooks/<slug>.mdx` with frontmatter:
|
|
68
|
+
|
|
69
|
+
```mdx
|
|
70
|
+
---
|
|
71
|
+
title: "B2B social media strategy: a 2,500-word playbook"
|
|
72
|
+
slug: "b2b-social-media-strategy"
|
|
73
|
+
date_published: 2026-01-15
|
|
74
|
+
read_time_min: 18
|
|
75
|
+
related: [...]
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
import PlaybookLayout from '@/layouts/PlaybookLayout.astro'
|
|
79
|
+
import VignetteCard from '@/components/VignetteCard.astro'
|
|
80
|
+
|
|
81
|
+
# Section 1
|
|
82
|
+
|
|
83
|
+
Body content here, freely interleaving MDX components.
|
|
84
|
+
|
|
85
|
+
<VignetteCard scenario="..." surprise="..." lesson="..." />
|
|
86
|
+
|
|
87
|
+
# Section 2
|
|
88
|
+
...
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Renders via `src/pages/playbooks/[slug].astro` with `getCollection('playbooks')`.
|
|
92
|
+
|
|
93
|
+
## Sitemap
|
|
94
|
+
|
|
95
|
+
Use the `@astrojs/sitemap` integration. It auto-discovers all pages including dynamic routes.
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
// astro.config.mjs
|
|
99
|
+
import sitemap from '@astrojs/sitemap'
|
|
100
|
+
|
|
101
|
+
export default defineConfig({
|
|
102
|
+
site: 'https://example.com',
|
|
103
|
+
integrations: [sitemap({
|
|
104
|
+
filter: (page) => !page.includes('/admin'),
|
|
105
|
+
lastmod: new Date('2026-MM-DD'), // bump on phase merges, or use file mtime
|
|
106
|
+
})],
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## JSON-LD pattern in layouts
|
|
111
|
+
|
|
112
|
+
```astro
|
|
113
|
+
---
|
|
114
|
+
const { data } = Astro.props
|
|
115
|
+
const faqSchema = data.faqs && {
|
|
116
|
+
"@context": "https://schema.org",
|
|
117
|
+
"@type": "FAQPage",
|
|
118
|
+
mainEntity: data.faqs.map(f => ({
|
|
119
|
+
"@type": "Question",
|
|
120
|
+
name: f.question,
|
|
121
|
+
acceptedAnswer: { "@type": "Answer", text: f.answer },
|
|
122
|
+
})),
|
|
123
|
+
}
|
|
124
|
+
---
|
|
125
|
+
<html>
|
|
126
|
+
<head>
|
|
127
|
+
<title>{data.meta_title}</title>
|
|
128
|
+
<meta name="description" content={data.meta_description}>
|
|
129
|
+
<link rel="canonical" href={canonical}>
|
|
130
|
+
{faqSchema && <script type="application/ld+json" set:html={JSON.stringify(faqSchema)} />}
|
|
131
|
+
</head>
|
|
132
|
+
<!-- body -->
|
|
133
|
+
</html>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## File-write checklist for any phase
|
|
137
|
+
|
|
138
|
+
- [ ] Data file added at `src/content/<pattern>/<slug>.json` (or MDX for playbooks)
|
|
139
|
+
- [ ] Schema validates (`npm run astro check` or build)
|
|
140
|
+
- [ ] Sibling page references updated (≥2 spots in other content files)
|
|
141
|
+
- [ ] Sitemap rebuilds (automatic if using `@astrojs/sitemap`)
|
|
142
|
+
- [ ] `npm run build` succeeds and emits the new page to `dist/`
|
|
143
|
+
- [ ] Verify HTML output: `grep -c '<h1' dist/alternatives/<slug>/index.html` — must be >0
|
|
144
|
+
- [ ] `docs/seo-machine.md` tracker row updated in same commit
|
|
145
|
+
|
|
146
|
+
## Astro-specific advantages
|
|
147
|
+
|
|
148
|
+
- **Zero JS by default.** Marketing pages ship pure HTML/CSS — fastest possible LCP, best Core Web Vitals.
|
|
149
|
+
- **Content collections enforce schema** — typos in data files fail the build.
|
|
150
|
+
- **MDX is first-class** — playbooks can use React/Vue/Svelte components inline without bundle overhead.
|
|
151
|
+
|
|
152
|
+
## Astro-specific gotchas
|
|
153
|
+
|
|
154
|
+
- **Don't use client-side React for marketing copy.** Use Astro components or framework components with `client:visible` only for interactive widgets, never for static text.
|
|
155
|
+
- **`getStaticPaths` runs at build time.** Adding a new entry requires a rebuild + redeploy. Plan to deploy on every phase merge.
|
|
156
|
+
- **`Astro.glob` is deprecated in v4+** — use content collections.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Stack Detection
|
|
2
|
+
|
|
3
|
+
Goal: pick the right adapter reference file before generating any pages.
|
|
4
|
+
|
|
5
|
+
## Signal table
|
|
6
|
+
|
|
7
|
+
Run from the repo root. First match wins; if none match, fall back to `markdown-fallback.md`.
|
|
8
|
+
|
|
9
|
+
| Signal | Adapter |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `Gemfile` contains `inertia_rails` | `rails-inertia.md` |
|
|
12
|
+
| `Gemfile` contains `rails` (no inertia) | `rails-erb.md` (or `markdown-fallback.md` if not present) |
|
|
13
|
+
| `package.json` has `next` in deps + `app/` directory present | `nextjs.md` (App Router) |
|
|
14
|
+
| `package.json` has `next` in deps + `pages/` directory present | `nextjs-pages.md` (or `nextjs.md` with a Pages-router note) |
|
|
15
|
+
| `astro.config.*` exists | `astro.md` |
|
|
16
|
+
| `package.json` has `@remix-run/*` | `remix.md` (or `markdown-fallback.md`) |
|
|
17
|
+
| `nuxt.config.*` exists | `nuxt.md` (or `markdown-fallback.md`) |
|
|
18
|
+
| `svelte.config.*` exists + SvelteKit deps | `sveltekit.md` (or `markdown-fallback.md`) |
|
|
19
|
+
| `_config.yml` (Jekyll) | `markdown-fallback.md` with Jekyll frontmatter notes |
|
|
20
|
+
| `config.toml` + Hugo signals | `markdown-fallback.md` with Hugo frontmatter notes |
|
|
21
|
+
| `gatsby-config.*` | `markdown-fallback.md` (Gatsby's prog-page API works with markdown) |
|
|
22
|
+
| None of the above | `markdown-fallback.md` |
|
|
23
|
+
|
|
24
|
+
## What to capture once detected
|
|
25
|
+
|
|
26
|
+
Add to `.seo/config.json`:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"stack": "nextjs-app-router",
|
|
31
|
+
"language": "tsx",
|
|
32
|
+
"marketing_route_prefix": "src/app",
|
|
33
|
+
"marketing_layout": "src/app/(marketing)/layout.tsx",
|
|
34
|
+
"components_dir": "src/components/marketing",
|
|
35
|
+
"data_dir": "src/data/seo",
|
|
36
|
+
"sitemap_path": "src/app/sitemap.ts",
|
|
37
|
+
"robots_path": "public/robots.txt",
|
|
38
|
+
"tailwind_config": "tailwind.config.ts",
|
|
39
|
+
"ahrefs_project_id": null,
|
|
40
|
+
"roadmap_path": "docs/seo-machine.md"
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This config is read by every phase. If a value is null, the phase asks once and persists.
|
|
45
|
+
|
|
46
|
+
## Ambiguity resolution
|
|
47
|
+
|
|
48
|
+
When two adapters could match (e.g. Next.js with both `app/` AND `pages/` directories, common during migrations), ask the user via `AskUserQuestion`:
|
|
49
|
+
|
|
50
|
+
- "I see both `app/` and `pages/` directories. Which is the active marketing surface?"
|
|
51
|
+
|
|
52
|
+
Never assume. Use the answer to pick the adapter and write it to `.seo/config.json`.
|
|
53
|
+
|
|
54
|
+
## Marketing-pages-in-app vs marketing-pages-in-separate-repo
|
|
55
|
+
|
|
56
|
+
Both are valid. Ask if there's ambiguity:
|
|
57
|
+
|
|
58
|
+
- **In-app marketing** (this skill's reference repo): marketing controller/pages live alongside the product. `/alternatives/*` is served by the same Rails app as the product dashboard.
|
|
59
|
+
- **Separate marketing site**: a different repo (`marketing.example.com`) shipped to a different host (Vercel, Netlify, Cloudflare Pages). Often a static-site generator.
|
|
60
|
+
|
|
61
|
+
For separate marketing sites, this skill should be run *from the marketing-site repo*, not from the product app repo. Confirm if there's any doubt.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Stack adapter — Markdown fallback (universal)
|
|
2
|
+
|
|
3
|
+
When the framework isn't directly supported, emit content as markdown files with structured frontmatter. The user wires them into their templating layer once; the skill keeps producing markdown for every phase after.
|
|
4
|
+
|
|
5
|
+
## File layout (universal)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
content/seo/
|
|
9
|
+
├── alternatives/
|
|
10
|
+
│ ├── hootsuite.md
|
|
11
|
+
│ ├── buffer.md
|
|
12
|
+
│ └── ...
|
|
13
|
+
├── for/
|
|
14
|
+
│ ├── agencies.md
|
|
15
|
+
│ ├── social-listening.md
|
|
16
|
+
│ └── ...
|
|
17
|
+
├── compare/
|
|
18
|
+
│ ├── buffer-vs-hootsuite.md
|
|
19
|
+
│ └── ...
|
|
20
|
+
└── playbooks/
|
|
21
|
+
├── b2b-social-media-strategy.mdx
|
|
22
|
+
└── ...
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Frontmatter schemas
|
|
26
|
+
|
|
27
|
+
### `content/seo/alternatives/<slug>.md`
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
---
|
|
31
|
+
slug: hootsuite
|
|
32
|
+
competitor_name: Hootsuite
|
|
33
|
+
meta_title: "Hootsuite Alternative — ExampleCo (free, $25/mo Pro)"
|
|
34
|
+
meta_description: "Looking for a Hootsuite alternative? ExampleCo is the lightweight social monitoring tool with a free tier — no $249/mo Enterprise pricing."
|
|
35
|
+
canonical: "https://example.com/alternatives/hootsuite"
|
|
36
|
+
hero_eyebrow: "Hootsuite alternative"
|
|
37
|
+
hero_h1: "Looking for a Hootsuite alternative?"
|
|
38
|
+
hero_lede: "..."
|
|
39
|
+
table_h2: "Best Hootsuite alternatives in 2026"
|
|
40
|
+
table_lede: "..."
|
|
41
|
+
comparison_rows:
|
|
42
|
+
- feature: "Free plan"
|
|
43
|
+
yours: { state: yes, note: "Free forever for 1 X account" }
|
|
44
|
+
theirs: { state: no, note: "Discontinued in 2023" }
|
|
45
|
+
- feature: "Starting price"
|
|
46
|
+
yours: { state: text, note: "$25/mo Pro" }
|
|
47
|
+
theirs: { state: text, note: "$249/mo Professional" }
|
|
48
|
+
# ... ≥10 rows total
|
|
49
|
+
switch_reasons:
|
|
50
|
+
- icon: bolt
|
|
51
|
+
title: "Reply in 30 seconds, not 5 minutes"
|
|
52
|
+
body: "..." # ≥40 words
|
|
53
|
+
# ... 4 total
|
|
54
|
+
honesty_rows:
|
|
55
|
+
- feature: "Multi-platform scheduling"
|
|
56
|
+
body: "..." # ≥30 words
|
|
57
|
+
# ... 3-4 total
|
|
58
|
+
faqs:
|
|
59
|
+
- question: "Why did Hootsuite end its free plan?"
|
|
60
|
+
answer: "..." # ≥40 words
|
|
61
|
+
# ... 4-6 total
|
|
62
|
+
cta_h2: "..."
|
|
63
|
+
cta_lede: "..."
|
|
64
|
+
related_internal_links:
|
|
65
|
+
alternatives: [buffer, sprout-social]
|
|
66
|
+
features: [twitter-monitoring]
|
|
67
|
+
tools: [reply-templates]
|
|
68
|
+
schemas:
|
|
69
|
+
- FAQPage
|
|
70
|
+
- SoftwareApplication
|
|
71
|
+
- BreadcrumbList
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
(Body is optional with this shape — the frontmatter contains all rendered data.)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### `content/seo/for/<slug>.md`
|
|
78
|
+
|
|
79
|
+
Same idea — full `ForData` shape as frontmatter:
|
|
80
|
+
|
|
81
|
+
```yaml
|
|
82
|
+
---
|
|
83
|
+
slug: agencies
|
|
84
|
+
name: Agencies
|
|
85
|
+
meta_title: "Social media tools for agencies — ExampleCo"
|
|
86
|
+
hero_eyebrow: "For agencies"
|
|
87
|
+
hero_h1: "Social media monitoring built for agencies"
|
|
88
|
+
hero_lede: "..."
|
|
89
|
+
pain_h2: "The agency reality"
|
|
90
|
+
pains:
|
|
91
|
+
- title: "..."
|
|
92
|
+
body: "..."
|
|
93
|
+
solution_h2: "..."
|
|
94
|
+
solutions:
|
|
95
|
+
- icon: bolt
|
|
96
|
+
title: "..."
|
|
97
|
+
body: "..."
|
|
98
|
+
faqs: [...]
|
|
99
|
+
related_internal_links:
|
|
100
|
+
features: [twitter-monitoring, brand-monitoring]
|
|
101
|
+
tools: [hashtag-generator, share-of-voice]
|
|
102
|
+
siblings: [freelancers]
|
|
103
|
+
---
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### `content/seo/playbooks/<slug>.mdx`
|
|
107
|
+
|
|
108
|
+
Playbooks are different — frontmatter holds metadata, body holds the 2,500+ word prose:
|
|
109
|
+
|
|
110
|
+
```mdx
|
|
111
|
+
---
|
|
112
|
+
slug: b2b-social-media-strategy
|
|
113
|
+
title: "B2B social media strategy: a 2,500-word playbook"
|
|
114
|
+
meta_title: "B2B social media strategy — ExampleCo playbook"
|
|
115
|
+
meta_description: "..."
|
|
116
|
+
date_published: 2026-01-15
|
|
117
|
+
date_modified: 2026-01-15
|
|
118
|
+
read_time_min: 18
|
|
119
|
+
related_internal_links:
|
|
120
|
+
features: [twitter-monitoring, brand-monitoring, linkedin-inbox]
|
|
121
|
+
tools: [reply-templates, share-of-voice]
|
|
122
|
+
for_pages: [b2b-saas, agencies]
|
|
123
|
+
alternatives: [hootsuite]
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
# B2B social media strategy: a 2,500-word playbook
|
|
127
|
+
|
|
128
|
+
## Section 1 — the problem framing
|
|
129
|
+
|
|
130
|
+
Body content here.
|
|
131
|
+
|
|
132
|
+
## Section 2 — the mental model
|
|
133
|
+
...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## How the user wires this into their template
|
|
137
|
+
|
|
138
|
+
After the skill writes its first markdown file, hand off with this note:
|
|
139
|
+
|
|
140
|
+
> The skill writes content as markdown to `content/seo/`. You'll need to wire your framework to read these files and render them. Common patterns:
|
|
141
|
+
>
|
|
142
|
+
> - **Hugo:** drop the files in `content/seo/alternatives/`, use a custom layout per content type
|
|
143
|
+
> - **Jekyll:** use collections (`_alternatives/`, etc.) configured in `_config.yml`
|
|
144
|
+
> - **Eleventy:** use a `_data/` directory or collection front-matter
|
|
145
|
+
> - **Gatsby:** source-filesystem plugin + `createPages` in `gatsby-node.js`
|
|
146
|
+
> - **VitePress/Docusaurus:** treat as MDX pages
|
|
147
|
+
> - **WordPress:** use a custom theme that parses these or import as posts
|
|
148
|
+
>
|
|
149
|
+
> Once wired, every subsequent phase just adds another file in the same directory. The skill handles the data; you handle the rendering.
|
|
150
|
+
|
|
151
|
+
## Sitemap (universal)
|
|
152
|
+
|
|
153
|
+
Most SSG frameworks generate sitemaps automatically once content is in the right collection. If yours doesn't:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
content/seo/sitemap-data.yaml # generated by skill, alphabetical
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Then have your build step emit `/sitemap.xml` from this file. Example shape:
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
last_modified: 2026-MM-DD
|
|
163
|
+
urls:
|
|
164
|
+
- loc: https://example.com/alternatives/hootsuite
|
|
165
|
+
changefreq: monthly
|
|
166
|
+
priority: 0.8
|
|
167
|
+
- loc: https://example.com/for/agencies
|
|
168
|
+
changefreq: monthly
|
|
169
|
+
priority: 0.8
|
|
170
|
+
# ...
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## File-write checklist for any phase (markdown mode)
|
|
174
|
+
|
|
175
|
+
- [ ] New markdown file at the right `content/seo/<pattern>/<slug>.md` path
|
|
176
|
+
- [ ] Frontmatter validates against the pattern schema
|
|
177
|
+
- [ ] Sibling files updated to add the new slug under `related_internal_links` (≥2 spots)
|
|
178
|
+
- [ ] `sitemap-data.yaml` updated if used
|
|
179
|
+
- [ ] User's build step ran successfully (rebuild + verify HTML output)
|
|
180
|
+
- [ ] HTML output: `grep -c '<h1' build-output/alternatives/<slug>/index.html` — must be >0
|
|
181
|
+
- [ ] `docs/seo-machine.md` tracker row updated in same commit
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Stack adapter — Next.js (App Router)
|
|
2
|
+
|
|
3
|
+
For Next.js 13+ with the `app/` directory. For Pages Router, see `nextjs-pages.md`.
|
|
4
|
+
|
|
5
|
+
## Conventions to use
|
|
6
|
+
|
|
7
|
+
- **Routes:** file-based via `app/[pattern]/[slug]/page.tsx`. Use `generateStaticParams` for build-time generation.
|
|
8
|
+
- **Data:** TypeScript constants in `src/data/seo/<pattern>.ts`, exported as typed records keyed by slug.
|
|
9
|
+
- **Components:** shared layouts in `src/components/marketing/<Pattern>Layout.tsx`.
|
|
10
|
+
- **Metadata:** Next's `generateMetadata` per route to emit dynamic titles/descriptions/OG.
|
|
11
|
+
- **Sitemap:** `app/sitemap.ts` exporting a function that returns all URLs.
|
|
12
|
+
- **Schema:** JSON-LD via `<Script type="application/ld+json">` in each page component.
|
|
13
|
+
|
|
14
|
+
## Pattern A — `/alternatives/[slug]/page.tsx`
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
src/
|
|
18
|
+
├── data/seo/alternatives.ts # AlternativeData by slug
|
|
19
|
+
├── components/marketing/
|
|
20
|
+
│ └── AlternativeLayout.tsx # shared layout
|
|
21
|
+
└── app/(marketing)/alternatives/
|
|
22
|
+
├── page.tsx # /alternatives directory
|
|
23
|
+
└── [slug]/
|
|
24
|
+
└── page.tsx # /alternatives/[slug]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The `[slug]/page.tsx` exports:
|
|
28
|
+
|
|
29
|
+
- `generateStaticParams()` → returns `Object.keys(ALTERNATIVES).map(slug => ({ slug }))`
|
|
30
|
+
- `generateMetadata({ params })` → returns `{ title, description, openGraph, alternates: { canonical } }`
|
|
31
|
+
- Default export → React component reading `ALTERNATIVES[params.slug]`, rendering `<AlternativeLayout />`, including `<Script>` for JSON-LD
|
|
32
|
+
|
|
33
|
+
## Pattern B/C — `/for/[slug]/page.tsx`
|
|
34
|
+
|
|
35
|
+
Same shape as Pattern A but for `USE_CASES` data and `ForLayout`.
|
|
36
|
+
|
|
37
|
+
## Pattern D — `/compare/[slug]/page.tsx`
|
|
38
|
+
|
|
39
|
+
Same shape, `COMPARISONS` data, `ComparisonLayout`.
|
|
40
|
+
|
|
41
|
+
## Pattern E — `/playbooks/[slug]/page.tsx`
|
|
42
|
+
|
|
43
|
+
Different from A-D — playbooks are long-form components rather than data-driven.
|
|
44
|
+
|
|
45
|
+
Option 1 (recommended for ≤20 playbooks): one file per playbook, `app/playbooks/[slug]/page.tsx` is a switch / dynamic import based on slug. Each playbook is its own component in `src/content/playbooks/<slug>.tsx`.
|
|
46
|
+
|
|
47
|
+
Option 2 (for many playbooks): MDX in `src/content/playbooks/<slug>.mdx`, rendered via `next-mdx-remote` or `@next/mdx`. The MDX files can use the `PlaybookLayout` component with frontmatter.
|
|
48
|
+
|
|
49
|
+
## Sitemap (`app/sitemap.ts`)
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { MetadataRoute } from 'next'
|
|
53
|
+
import { ALTERNATIVES } from '@/data/seo/alternatives'
|
|
54
|
+
import { USE_CASES } from '@/data/seo/use-cases'
|
|
55
|
+
import { COMPARISONS } from '@/data/seo/comparisons'
|
|
56
|
+
import { PLAYBOOKS } from '@/data/seo/playbooks'
|
|
57
|
+
|
|
58
|
+
const SITE = 'https://example.com'
|
|
59
|
+
const lastModified = new Date('2026-MM-DD') // bump on every phase merge
|
|
60
|
+
|
|
61
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
62
|
+
const entries: MetadataRoute.Sitemap = []
|
|
63
|
+
for (const slug of Object.keys(ALTERNATIVES)) entries.push({ url: `${SITE}/alternatives/${slug}`, lastModified, changeFrequency: 'monthly', priority: 0.8 })
|
|
64
|
+
for (const slug of Object.keys(USE_CASES)) entries.push({ url: `${SITE}/for/${slug}`, lastModified, changeFrequency: 'monthly', priority: 0.8 })
|
|
65
|
+
for (const slug of Object.keys(COMPARISONS)) entries.push({ url: `${SITE}/compare/${slug}`, lastModified, changeFrequency: 'monthly', priority: 0.7 })
|
|
66
|
+
for (const slug of Object.keys(PLAYBOOKS)) entries.push({ url: `${SITE}/playbooks/${slug}`, lastModified, changeFrequency: 'monthly', priority: 0.7 })
|
|
67
|
+
return entries
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Per-page JSON-LD pattern
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
<Script
|
|
75
|
+
id="ld-faqpage"
|
|
76
|
+
type="application/ld+json"
|
|
77
|
+
dangerouslySetInnerHTML={{
|
|
78
|
+
__html: JSON.stringify({
|
|
79
|
+
"@context": "https://schema.org",
|
|
80
|
+
"@type": "FAQPage",
|
|
81
|
+
mainEntity: data.faqs.map(f => ({
|
|
82
|
+
"@type": "Question",
|
|
83
|
+
name: f.question,
|
|
84
|
+
acceptedAnswer: { "@type": "Answer", text: f.answer },
|
|
85
|
+
})),
|
|
86
|
+
}),
|
|
87
|
+
}}
|
|
88
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Render in the page component, not the layout. One JSON-LD `<Script>` per schema type.
|
|
92
|
+
|
|
93
|
+
## File-write checklist for any phase
|
|
94
|
+
|
|
95
|
+
- [ ] Data entry added to `src/data/seo/<pattern>.ts`
|
|
96
|
+
- [ ] `generateStaticParams` will pick it up (no manual route registration needed)
|
|
97
|
+
- [ ] Sibling page references updated (≥2 spots in other data files)
|
|
98
|
+
- [ ] Sitemap `lastModified` constant bumped
|
|
99
|
+
- [ ] `next build` succeeds and includes the new route in the build manifest
|
|
100
|
+
- [ ] Local SSR check: `curl -s http://localhost:3000/<url> | grep '<h1'` — H1 must be in the response
|
|
101
|
+
- [ ] `docs/seo-sprint.md` tracker row updated in same commit
|
|
102
|
+
|
|
103
|
+
## App Router gotchas
|
|
104
|
+
|
|
105
|
+
- **Server components by default** — good for SEO (full HTML in response). Only opt into `"use client"` for islands of interactivity.
|
|
106
|
+
- **Metadata is per-route, not per-layout.** Each `page.tsx` must export `generateMetadata` (or static `metadata`).
|
|
107
|
+
- **Canonical URLs need explicit setting** via `metadata.alternates.canonical`. Next does NOT auto-emit canonical tags.
|
|
108
|
+
- **OG images** — co-locate `opengraph-image.tsx` next to the page if you want dynamic OG via Next's image generation. Otherwise reference a static image URL in `openGraph.images`.
|