@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,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: x-post-generator-openclaw
|
|
3
|
+
description: "Generate complete X/Twitter posts using 2026 best practices. Includes brand voice loading, proven hook patterns, self-scoring, and humanizer +..."
|
|
4
|
+
depends-on: [hook-generator, humanizer, quality-gate, sharp-thesis-validator]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# X Post Generator for OpenClaw
|
|
8
|
+
|
|
9
|
+
Transform a selected hook into a complete, scored X post or thread. Uses Gemini CLI (free, no API keys).
|
|
10
|
+
|
|
11
|
+
**This skill = the script.** The script generates a draft + self-score. The agent running this skill MUST chain humanizer + quality-gate afterward.
|
|
12
|
+
|
|
13
|
+
## Pipeline (MANDATORY)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
hook-generator → sharp-thesis-validator (social) → user selects hook → this script → humanizer skill → quality-gate (mode: x)
|
|
17
|
+
↓ FAIL = BLOCK
|
|
18
|
+
↓ PASS = continue
|
|
19
|
+
↓
|
|
20
|
+
PASS → present to user
|
|
21
|
+
FAIL → rewrite (max 3 loops)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Sharp-Thesis Validation (Phase 0):** Before proceeding, validate the hook passes the Cerebras Test in social mode:
|
|
25
|
+
```
|
|
26
|
+
sharp-thesis-validator --mode social --brand {brand} "{hook}"
|
|
27
|
+
```
|
|
28
|
+
- PASS: Proceed to script execution
|
|
29
|
+
- FAIL: STOP, return reframing suggestions
|
|
30
|
+
|
|
31
|
+
**Awareness Gate (Phase 00, MANDATORY):** Before hook generation, determine the target audience's awareness level. See `references/awareness-level-guide.md`. If unclear from context, ask the user.
|
|
32
|
+
|
|
33
|
+
**The script does NOT replace humanizer or quality-gate.** It produces a draft. Those skills validate it.
|
|
34
|
+
|
|
35
|
+
## What the Script Does
|
|
36
|
+
|
|
37
|
+
1. Loads brand voice from `brand/voice-dna.md` (first priority), then falls back to `brand/voice-profile.md` or `brand-assets/voice-guide.md`
|
|
38
|
+
2. Loads ICP + pain points from `icp-profile.md`
|
|
39
|
+
3. Loads proven Twitter hook patterns from `hook-generator/database/twitter-hooks.json`
|
|
40
|
+
4. Generates single post or thread via Gemini CLI
|
|
41
|
+
5. Applies regex humanization (basic)
|
|
42
|
+
6. Self-scores on 5 dimensions (hook_strength, voice_authenticity, specificity, value_density, algorithm_fit)
|
|
43
|
+
7. Saves post + metadata to `/tmp/xpost-{timestamp}.txt` and `.json`
|
|
44
|
+
8. Exits with code 2 if self-score says REWRITE
|
|
45
|
+
|
|
46
|
+
## What the Agent Must Do After
|
|
47
|
+
|
|
48
|
+
1. Read the saved draft
|
|
49
|
+
2. Run **humanizer** skill on it (full AI-pattern removal, not just regex)
|
|
50
|
+
3. Spawn **quality-gate** with `mode: x` and the draft path
|
|
51
|
+
4. If FAIL: rewrite with feedback, max 3 loops
|
|
52
|
+
5. If PASS: present to user
|
|
53
|
+
|
|
54
|
+
## Usage
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Single post
|
|
58
|
+
node scripts/generate-x-post.js \
|
|
59
|
+
--hook "I cut my AI memory by 99%. The result?" \
|
|
60
|
+
--topic "lightweight AI tools" \
|
|
61
|
+
--brand aiwithjai \
|
|
62
|
+
--objective engagement
|
|
63
|
+
|
|
64
|
+
# Thread
|
|
65
|
+
node scripts/generate-x-post.js \
|
|
66
|
+
--hook "I rewrote my entire stack in Rust..." \
|
|
67
|
+
--topic "Rust for indie hackers" \
|
|
68
|
+
--brand aiwithjai \
|
|
69
|
+
--objective engagement \
|
|
70
|
+
--thread
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Parameters
|
|
74
|
+
|
|
75
|
+
| Param | Required | Description |
|
|
76
|
+
|-------|----------|-------------|
|
|
77
|
+
| `--hook` | Yes | Selected hook from hook-generator |
|
|
78
|
+
| `--topic` | Yes | Topic for context |
|
|
79
|
+
| `--brand` | No | Brand name (loads voice + ICP from brand/ dir) |
|
|
80
|
+
| `--objective` | No | `engagement` (default), `blog-traffic`, `authority` |
|
|
81
|
+
| `--format` | No | `single` (default) or `thread` |
|
|
82
|
+
| `--thread` | No | Shorthand for `--format thread` |
|
|
83
|
+
|
|
84
|
+
### Objectives
|
|
85
|
+
|
|
86
|
+
1. **engagement**: Reveal 90-95%. Max replies/shares.
|
|
87
|
+
2. **blog-traffic**: Reveal 50%, tease 50%. DM for link.
|
|
88
|
+
3. **authority**: Reveal 70-80%. Methodology focus.
|
|
89
|
+
|
|
90
|
+
## Brand Resolution
|
|
91
|
+
|
|
92
|
+
The script searches these roots for brand dirs:
|
|
93
|
+
- `./businesses/{brand}/`
|
|
94
|
+
- `/Users/Shared/clawd/newsletter/brands/{brand}/`
|
|
95
|
+
|
|
96
|
+
Looks for: `voice-dna.md` (first priority), `voice-profile.md`, `voice-guide.md`, `icp-profile.md`, `audience.md`
|
|
97
|
+
|
|
98
|
+
## 2026 X Algorithm Rules (Built Into Prompt)
|
|
99
|
+
|
|
100
|
+
**Do:**
|
|
101
|
+
- No external URLs (30-60% reach penalty)
|
|
102
|
+
- Reply to every reply in first 30-60 min
|
|
103
|
+
- "Save this" / "Bookmark" CTAs (saves weighted heavily)
|
|
104
|
+
- Short punchy lines with white space
|
|
105
|
+
- Lead with failed stories over success stories
|
|
106
|
+
|
|
107
|
+
**Don't:**
|
|
108
|
+
- Include external URLs
|
|
109
|
+
- Edit post after 10+ min (algo reset)
|
|
110
|
+
- Use more than 2 hashtags
|
|
111
|
+
- Post without humanization
|
|
112
|
+
|
|
113
|
+
## Self-Scoring Dimensions
|
|
114
|
+
|
|
115
|
+
| Dimension | Weight | What it checks |
|
|
116
|
+
|-----------|--------|---------------|
|
|
117
|
+
| hook_strength | High | Does the opening stop the scroll? |
|
|
118
|
+
| voice_authenticity | High | Sounds human, not AI? |
|
|
119
|
+
| specificity | Med | Concrete details vs vague claims? |
|
|
120
|
+
| value_density | Med | Useful info per character? |
|
|
121
|
+
| algorithm_fit | Low | 2026 X algo friendly? |
|
|
122
|
+
|
|
123
|
+
Exit code 2 = self-score failed, agent must humanize + quality-gate before presenting.
|
|
124
|
+
|
|
125
|
+
## Files
|
|
126
|
+
|
|
127
|
+
- `scripts/generate-x-post.js` — Main entry (Gemini CLI, no API keys)
|
|
128
|
+
- `database/twitter-hooks.json` — Proven hooks with engagement data (in hook-generator skill)
|
|
129
|
+
|
|
130
|
+
## Models
|
|
131
|
+
|
|
132
|
+
All via Gemini CLI (free tier, no API key needed):
|
|
133
|
+
- Generation: gemini-2.5-flash-lite
|
|
134
|
+
- Self-scoring: gemini-2.5-flash-lite
|
|
135
|
+
|
|
136
|
+
## Cost
|
|
137
|
+
|
|
138
|
+
$0.00 — all Gemini CLI free tier.
|
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { spawnSync } = require('child_process');
|
|
6
|
+
|
|
7
|
+
const BRAND_ROOTS = [
|
|
8
|
+
'./businesses',
|
|
9
|
+
];
|
|
10
|
+
|
|
11
|
+
function parseArgs() {
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
const opts = {};
|
|
14
|
+
for (let i = 0; i < args.length; i++) {
|
|
15
|
+
if (args[i].startsWith('--')) {
|
|
16
|
+
const key = args[i].slice(2);
|
|
17
|
+
const val = args[i + 1];
|
|
18
|
+
if (val && !val.startsWith('--')) {
|
|
19
|
+
opts[key] = val;
|
|
20
|
+
i++;
|
|
21
|
+
} else {
|
|
22
|
+
opts[key] = true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return opts;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function findFile(dir, candidates) {
|
|
30
|
+
for (const name of candidates) {
|
|
31
|
+
const p = path.join(dir, name);
|
|
32
|
+
if (fs.existsSync(p)) return p;
|
|
33
|
+
}
|
|
34
|
+
for (const sub of fs.readdirSync(dir, { withFileTypes: true }).filter(d => d.isDirectory())) {
|
|
35
|
+
const found = findFile(path.join(dir, sub.name), candidates);
|
|
36
|
+
if (found) return found;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function resolveBrandDir(root, brand) {
|
|
42
|
+
const direct = path.join(root, brand);
|
|
43
|
+
if (fs.existsSync(direct)) return direct;
|
|
44
|
+
for (const entry of fs.readdirSync(root, { withFileTypes: true }).filter(d => d.isDirectory())) {
|
|
45
|
+
const candidate = path.join(entry.path || root, entry.name, brand);
|
|
46
|
+
if (fs.existsSync(candidate)) return candidate;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function loadBrand(brand) {
|
|
52
|
+
if (!brand) return null;
|
|
53
|
+
for (const root of BRAND_ROOTS) {
|
|
54
|
+
if (!fs.existsSync(root)) continue;
|
|
55
|
+
const brandDir = resolveBrandDir(root, brand);
|
|
56
|
+
if (!brandDir) continue;
|
|
57
|
+
|
|
58
|
+
const result = { name: brand, dir: brandDir, voice: null, icp: null, pains: [], positioning: [], offer: null, evergreen: null };
|
|
59
|
+
|
|
60
|
+
// Load voice-dna.md (priority), then voice-profile.md
|
|
61
|
+
const voiceFile = findFile(brandDir, ['voice-dna.md', 'voice-profile.md', 'voice-guide.md']);
|
|
62
|
+
if (voiceFile) {
|
|
63
|
+
const content = fs.readFileSync(voiceFile, 'utf8');
|
|
64
|
+
// Extract practical rules, NOT journaling patterns
|
|
65
|
+
// We want: banned words, terminology, rhythm rules — NOT "staccato self-flagellation" or "cosmic whiplash" as primary modes
|
|
66
|
+
const voiceRules = [];
|
|
67
|
+
|
|
68
|
+
// Extract banned words
|
|
69
|
+
const bannedSection = content.match(/Banned Words[\s\S]*?(?=\n##|\n###|$)/i);
|
|
70
|
+
if (bannedSection) {
|
|
71
|
+
const bannedWords = [...bannedSection[0].matchAll(/[-*]\s+(.+)/g)].map(m => m[1].trim()).slice(0, 10);
|
|
72
|
+
if (bannedWords.length > 0) voiceRules.push(`Banned words: ${bannedWords.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Extract core phrases (terminology)
|
|
76
|
+
const phrasesSection = content.match(/Core Phases[\s\S]*?(?=\n###|$)/i) || content.match(/Must Use[\s\S]*?(?=\n###|$)/i);
|
|
77
|
+
if (phrasesSection) {
|
|
78
|
+
const phrases = [...phrasesSection[0].matchAll(/\|\s*"([^"]+)"/g)].map(m => m[1]).slice(0, 5);
|
|
79
|
+
if (phrases.length > 0) voiceRules.push(`Natural vocabulary: ${phrases.join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Extract contrast pairs (use sparingly)
|
|
83
|
+
const contrastSection = content.match(/Contrast Pairs[\s\S]*?(?=\n##|\n###|$)/i);
|
|
84
|
+
if (contrastSection) {
|
|
85
|
+
const pairs = [...contrastSection[0].matchAll(/-\s+(.+)/g)].map(m => m[1].trim()).slice(0, 4);
|
|
86
|
+
if (pairs.length > 0) voiceRules.push(`Contrast pairs (use ONE per thread max): ${pairs.join('; ')}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Build a practical voice summary
|
|
90
|
+
voiceRules.push('Tone: direct, no hedging, conversational. Sound like a person explaining something to a peer over coffee.');
|
|
91
|
+
voiceRules.push('Rhythm: vary sentence length. Short punchy lines for emphasis. Normal sentences for explanation. Avoid ALL-staccato fragments.');
|
|
92
|
+
voiceRules.push('Use ONE physical detail or metaphor per thread as seasoning. Not every sentence needs a physical anchor.');
|
|
93
|
+
|
|
94
|
+
result.voice = voiceRules.join('\n');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Load evergreen.md from brand dir OR company root (walk up)
|
|
98
|
+
let evergreenFile = findFile(brandDir, ['evergreen.md']);
|
|
99
|
+
if (!evergreenFile) {
|
|
100
|
+
// Walk up to find company-level evergreen.md
|
|
101
|
+
let currentDir = brandDir;
|
|
102
|
+
for (let i = 0; i < 4; i++) {
|
|
103
|
+
const parent = path.dirname(currentDir);
|
|
104
|
+
if (parent === currentDir) break;
|
|
105
|
+
const candidate = path.join(parent, 'evergreen.md');
|
|
106
|
+
if (fs.existsSync(candidate)) {
|
|
107
|
+
evergreenFile = candidate;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
currentDir = parent;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (evergreenFile) {
|
|
114
|
+
const content = fs.readFileSync(evergreenFile, 'utf8');
|
|
115
|
+
result.evergreen = content.slice(0, 5000);
|
|
116
|
+
|
|
117
|
+
// Extract ICP - look for specific ICP description patterns
|
|
118
|
+
const icpPatterns = [
|
|
119
|
+
/Overwhelmed Operator[\s\S]*?(?=\n##|\n###|$)/i,
|
|
120
|
+
/ICP[:\s]*([^\n]+)/i,
|
|
121
|
+
/Primary.*?:\s*([^\n]+)/i,
|
|
122
|
+
/Target Verticals[\s\S]*?(?=\n##|\n###|$)/i,
|
|
123
|
+
/law firm.*?marketing agency.*?real estate/i,
|
|
124
|
+
];
|
|
125
|
+
for (const pattern of icpPatterns) {
|
|
126
|
+
const match = content.match(pattern);
|
|
127
|
+
if (match) {
|
|
128
|
+
result.icp = match[0].slice(0, 300).trim();
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Extract pain points - look for Pain Pill / pain points sections
|
|
134
|
+
const painPatterns = [
|
|
135
|
+
/Pain Pill Positioning[\s\S]*?(?=\n##|\n###|$)/i,
|
|
136
|
+
/pain points?[\s\S]*?(?=\n##|\n###|$)/i,
|
|
137
|
+
/drowning in[\s\S]*?(?=\n##|\n###|$)/i,
|
|
138
|
+
/20\+ AI tabs[\s\S]*?(?=\n##|\n###|$)/i,
|
|
139
|
+
/zero systems in production[\s\S]*?(?=\n##|\n###|$)/i,
|
|
140
|
+
/tool guilt[\s\S]*?(?=\n##|\n###|$)/i,
|
|
141
|
+
/course fatigue[\s\S]*?(?=\n##|\n###|$)/i,
|
|
142
|
+
/wiring part isn't[\s\S]*?(?=\n##|\n###|$)/i,
|
|
143
|
+
];
|
|
144
|
+
for (const pattern of painPatterns) {
|
|
145
|
+
const match = content.match(pattern);
|
|
146
|
+
if (match) {
|
|
147
|
+
const extracted = [...match[0].matchAll(/^[-*]\s+(.+)$/gm)].map(m => m[1]);
|
|
148
|
+
if (extracted.length > 0) {
|
|
149
|
+
result.pains = extracted.slice(0, 5);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
// Also extract inline pain descriptions
|
|
153
|
+
const inline = match[0].match(/([^.]*?(?:tab|tool|wiring|system|production|guilt|fatigue|bleed|delay|wire)[^.]*\.)/gi);
|
|
154
|
+
if (inline) {
|
|
155
|
+
result.pains = inline.slice(0, 5);
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// If no pains found, use defaults from evergreen knowledge
|
|
162
|
+
if (result.pains.length === 0) {
|
|
163
|
+
result.pains = [
|
|
164
|
+
'20+ AI tabs open with zero systems in production',
|
|
165
|
+
'Tool guilt and course fatigue from buying 6+ tools that dont integrate',
|
|
166
|
+
'The coding part is solved, the wiring part isnt - drowning in integrations',
|
|
167
|
+
'Every week of delay costs real money - dollar bleed is measurable',
|
|
168
|
+
'Needs order of operations, not more tools'
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Extract positioning angles
|
|
173
|
+
const posPatterns = [
|
|
174
|
+
/Positioning Angle[\s\S]*?(?=\n##|\n###|$)/gi,
|
|
175
|
+
/Intelligence Multiplier[\s\S]*?(?=\n##|\n###|$)/i,
|
|
176
|
+
/Order of Operations[\s\S]*?(?=\n##|\n###|$)/i,
|
|
177
|
+
/Automate the Tedious[\s\S]*?(?=\n##|\n###|$)/i,
|
|
178
|
+
/Pain Pill Positioning[\s\S]*?(?=\n##|\n###|$)/i,
|
|
179
|
+
/Hacker-Farmer Identity[\s\S]*?(?=\n##|\n###|$)/i,
|
|
180
|
+
];
|
|
181
|
+
for (const pattern of posPatterns) {
|
|
182
|
+
const matches = content.match(pattern);
|
|
183
|
+
if (matches && matches.length > 0) {
|
|
184
|
+
result.positioning = matches.slice(0, 3).map(p => p.slice(0, 400));
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Extract offer info
|
|
190
|
+
const offerPatterns = [
|
|
191
|
+
/Offer Stack[\s\S]*?(?=\n##|\n###|$)/i,
|
|
192
|
+
/Tier 1:.*?Tier 2:.*?Tier 3:[\s\S]*?(?=\n##|\n###|$)/i,
|
|
193
|
+
/\$1,500\/month[\s\S]*?\$5,000\/month/i,
|
|
194
|
+
/Concierge.*?Build.*?Managed/i,
|
|
195
|
+
];
|
|
196
|
+
for (const pattern of offerPatterns) {
|
|
197
|
+
const match = content.match(pattern);
|
|
198
|
+
if (match) {
|
|
199
|
+
result.offer = match[0].slice(0, 500);
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Fallback: try icp-profile.md, audience.md if evergreen didn't give us ICP
|
|
206
|
+
if (!result.icp) {
|
|
207
|
+
const icpFile = findFile(brandDir, ['icp-profile.md', 'icp-profiles.md', 'audience.md']);
|
|
208
|
+
if (icpFile) {
|
|
209
|
+
const content = fs.readFileSync(icpFile, 'utf8');
|
|
210
|
+
const primary = content.match(/Primary.*?:\s*([^\n]+)/i)?.[1]?.trim() || null;
|
|
211
|
+
const pains = content.match(/Pain Points[\s\S]*?(?=###|##|$)/i);
|
|
212
|
+
if (pains) {
|
|
213
|
+
result.pains = [...pains[0].matchAll(/^[-*]\s+(.+)$/gm)].map(m => m[1]).slice(0, 3);
|
|
214
|
+
}
|
|
215
|
+
result.icp = primary;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function loadHooks(brand) {
|
|
225
|
+
const dbPath = path.join(__dirname, '..', 'database', 'twitter-hooks.json');
|
|
226
|
+
if (!fs.existsSync(dbPath)) return [];
|
|
227
|
+
try {
|
|
228
|
+
const db = JSON.parse(fs.readFileSync(dbPath, 'utf8'));
|
|
229
|
+
const examples = (db.examples || []).slice(0, 8);
|
|
230
|
+
return examples.map(e => ({
|
|
231
|
+
hook: e.hook,
|
|
232
|
+
pattern: e.pattern,
|
|
233
|
+
score: e.engagement?.weightedScore || 0,
|
|
234
|
+
why: e.why_it_works,
|
|
235
|
+
}));
|
|
236
|
+
} catch (_) {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function callGemini(prompt, timeoutMs = 30000) {
|
|
242
|
+
const result = spawnSync('gemini', ['-m', 'gemini-2.5-flash-lite', '-o', 'text', '-p', prompt], {
|
|
243
|
+
encoding: 'utf-8',
|
|
244
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
245
|
+
timeout: timeoutMs
|
|
246
|
+
});
|
|
247
|
+
if (result.status !== 0) {
|
|
248
|
+
const stderr = result.stderr || '';
|
|
249
|
+
if (/quota|exhausted/i.test(stderr)) {
|
|
250
|
+
throw new Error('QUOTA_EXHAUSTED: Gemini API quota exhausted');
|
|
251
|
+
}
|
|
252
|
+
if (result.signal === 'SIGTERM') {
|
|
253
|
+
throw new Error('TIMEOUT: Gemini CLI timed out');
|
|
254
|
+
}
|
|
255
|
+
throw new Error(`Gemini CLI failed: ${stderr || 'exit ' + result.status}`);
|
|
256
|
+
}
|
|
257
|
+
return result.stdout.trim().replace(/^```(?:text|markdown)?\s*/i, '').replace(/\s*```$/, '');
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function humanizeRegex(text) {
|
|
261
|
+
if (!text) return '';
|
|
262
|
+
return text
|
|
263
|
+
.replace(/Additionally,?\s*/gi, '')
|
|
264
|
+
.replace(/Furthermore,?\s*/gi, '')
|
|
265
|
+
.replace(/Moreover,?\s*/gi, '')
|
|
266
|
+
.replace(/In today's\s+\w+,?\s*/gi, '')
|
|
267
|
+
.replace(/\bcrucial\b/gi, 'key')
|
|
268
|
+
.replace(/\bpivotal\b/gi, 'important')
|
|
269
|
+
.replace(/\blandscape\b/g, 'space')
|
|
270
|
+
.replace(/\bdelve\b/gi, 'dig')
|
|
271
|
+
.replace(/\bleverage\b/gi, 'use')
|
|
272
|
+
.replace(/\bsynergy\b/gi, 'fit')
|
|
273
|
+
.replace(/\brobust\b/gi, 'solid')
|
|
274
|
+
.replace(/Most people think/gi, 'Some think')
|
|
275
|
+
.replace(/Imagine if/gi, 'Consider')
|
|
276
|
+
.replace(/—/g, ' - ')
|
|
277
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
278
|
+
.replace(/ +/g, ' ')
|
|
279
|
+
.trim();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function selfScore(post, hook, brand) {
|
|
283
|
+
const prompt = `Score this X post on a 0-100 scale. Be harsh.
|
|
284
|
+
|
|
285
|
+
POST:
|
|
286
|
+
${post}
|
|
287
|
+
|
|
288
|
+
HOOK USED: "${hook}"
|
|
289
|
+
BRAND: ${brand || 'none'}
|
|
290
|
+
|
|
291
|
+
Score each dimension 0-100:
|
|
292
|
+
- hook_strength: Does the opening stop the scroll?
|
|
293
|
+
- voice_authenticity: Does it sound human, not AI?
|
|
294
|
+
- specificity: Concrete details vs vague claims?
|
|
295
|
+
- value_density: Useful info per character?
|
|
296
|
+
- algorithm_fit: 2026 X algo friendly (no links, reply-bait CTA)?
|
|
297
|
+
|
|
298
|
+
Return ONLY valid JSON:
|
|
299
|
+
{"hook_strength":N,"voice_authenticity":N,"specificity":N,"value_density":N,"algorithm_fit":N,"total":N,"verdict":"PASS|REWRITE","reason":"one sentence"}`;
|
|
300
|
+
|
|
301
|
+
try {
|
|
302
|
+
const raw = callGemini(prompt, 15000);
|
|
303
|
+
const jsonMatch = raw.match(/\{[\s\S]*\}/);
|
|
304
|
+
if (jsonMatch) return JSON.parse(jsonMatch[0]);
|
|
305
|
+
} catch (err) {
|
|
306
|
+
console.log(` Self-scoring failed (${err.message}), using heuristic...`);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Heuristic fallback scoring
|
|
310
|
+
const isThread = post.includes('---');
|
|
311
|
+
const posts = isThread ? post.split('---').map(p => p.trim()) : [post];
|
|
312
|
+
const firstPost = posts[0];
|
|
313
|
+
const hasLink = /https?:\/\//.test(post);
|
|
314
|
+
const hasEmDash = /—/.test(post);
|
|
315
|
+
const hasAiVocab = /additionally|furthermore|moreover|crucial|pivotal|landscape|delve|leverage|synergy|robust|seamless|game.changer|innovative|utilize/gi.test(post);
|
|
316
|
+
const hasRuleOfThree = /\w+,\s+\w+,\s+and\s+\w+/.test(post) || /\w+,\s+\w+,\s+\w+\./.test(post);
|
|
317
|
+
const hasFirstPerson = /\b(I|my|me)\b/i.test(post);
|
|
318
|
+
const hasNumbers = /\d+(?:,\d+)*(?:\.\d+)?(?:%|K|M|B|x)?/.test(post);
|
|
319
|
+
const hasSpecifics = /(law firm|real estate|marketing agency|34 units|27 drafts|3 weeks|8.75M|AI Employee|Concierge|calculator)/i.test(post);
|
|
320
|
+
const hasPhysicalAnchor = /(mud|rain|coffee|boots|cloud forest|keyboard|desk|farm|harvest|dirt|code)/i.test(post);
|
|
321
|
+
const hasWhiplash = /(mud|rain|coffee|boots|desk|farm|dirt)[^.]*?(orchestrat|wire|system|agent|AI|model|code)/i.test(post);
|
|
322
|
+
const endsWithQuestion = /\?$/.test(post.trim());
|
|
323
|
+
|
|
324
|
+
let hookStrength = 50;
|
|
325
|
+
let voiceAuth = 50;
|
|
326
|
+
let specificity = 50;
|
|
327
|
+
let valueDensity = 50;
|
|
328
|
+
let algoFit = 50;
|
|
329
|
+
|
|
330
|
+
// Hook strength
|
|
331
|
+
if (firstPost.length < 100 && firstPost.length > 20) hookStrength += 10;
|
|
332
|
+
if (/20 tabs|zero systems|AI purgatory|dollar bleed/i.test(firstPost)) hookStrength += 15;
|
|
333
|
+
if (hasAiVocab) hookStrength -= 10;
|
|
334
|
+
if (hasRuleOfThree) hookStrength -= 5;
|
|
335
|
+
|
|
336
|
+
// Voice authenticity
|
|
337
|
+
if (hasFirstPerson) voiceAuth += 10;
|
|
338
|
+
if (hasPhysicalAnchor) voiceAuth += 10;
|
|
339
|
+
if (hasWhiplash) voiceAuth += 15;
|
|
340
|
+
if (hasEmDash) voiceAuth -= 20;
|
|
341
|
+
if (hasAiVocab) voiceAuth -= 15;
|
|
342
|
+
if (hasRuleOfThree) voiceAuth -= 10;
|
|
343
|
+
|
|
344
|
+
// Specificity
|
|
345
|
+
if (hasNumbers) specificity += 15;
|
|
346
|
+
if (hasSpecifics) specificity += 15;
|
|
347
|
+
if (/your|their|our/.test(post) && !/you|your|their|our/.test(firstPost)) specificity -= 5;
|
|
348
|
+
|
|
349
|
+
// Value density
|
|
350
|
+
if (post.length > 200 && posts.length >= 4) valueDensity += 10;
|
|
351
|
+
if (hasSpecifics) valueDensity += 10;
|
|
352
|
+
if (hasAiVocab) valueDensity -= 10;
|
|
353
|
+
if (hasRuleOfThree) valueDensity -= 5;
|
|
354
|
+
|
|
355
|
+
// Algorithm fit
|
|
356
|
+
if (!hasLink) algoFit += 15;
|
|
357
|
+
if (hasEmDash) algoFit -= 10;
|
|
358
|
+
if (endsWithQuestion || /reply|⬇️/.test(post)) algoFit += 10;
|
|
359
|
+
if (hasRuleOfThree) algoFit -= 5;
|
|
360
|
+
|
|
361
|
+
const dims = {hook_strength: hookStrength, voice_authenticity: voiceAuth, specificity, value_density: valueDensity, algorithm_fit: algoFit};
|
|
362
|
+
for (const k of Object.keys(dims)) {
|
|
363
|
+
dims[k] = Math.max(0, Math.min(100, dims[k]));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const total = Math.round(Object.values(dims).reduce((a,b) => a+b, 0) / 5);
|
|
367
|
+
const verdict = total >= 70 ? 'PASS' : 'REWRITE';
|
|
368
|
+
const reason = verdict === 'PASS' ? 'Heuristic pass' : 'Heuristic fail - needs work';
|
|
369
|
+
|
|
370
|
+
return { ...dims, total, verdict, reason };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function buildPrompt(opts, brand, provenHooks) {
|
|
374
|
+
const isThread = opts.thread || opts.format === 'thread';
|
|
375
|
+
const ctaOptions = {
|
|
376
|
+
engagement: ["What's your experience?", "What did I miss?", "Ever tried this?"],
|
|
377
|
+
'blog-traffic': ["DM for the full post", "Reply for the link"],
|
|
378
|
+
authority: ["Save this for later", "Bookmark this"],
|
|
379
|
+
};
|
|
380
|
+
const cta = (ctaOptions[opts.objective || 'engagement'] || ctaOptions.engagement)[0];
|
|
381
|
+
|
|
382
|
+
const targetAudience = brand?.icp || 'Overwhelmed Operator — law firm / marketing agency / real estate agency owner ($300K-$3M), 1-15 employees, low-medium technical, 20+ AI tabs open with zero systems in production, drowning in tool guilt and course fatigue, needs order of operations not more tools';
|
|
383
|
+
const pains = brand?.pains?.join(', ') || '20+ AI tabs open, zero systems in production, tool guilt, course fatigue, no order of operations, wiring not solved';
|
|
384
|
+
const voice = brand?.voice || null;
|
|
385
|
+
const positioning = brand?.positioning?.join('\n') || "Angle 1: Intelligence Multiplier (AI amplifies, doesn't replace). Angle 2: Order of Operations (stop buying tools, start deploying systems). Angle 3: Automate the Tedious to Inhabit the Miraculous (mission). Angle 4: Pain Pill Positioning (every headline must pass the pain pill test — what does this save them from?). Angle 5: Hacker-Farmer Identity (generalist who refuses to be a slave, buy back the forest, fuck-you money).";
|
|
386
|
+
const offer = brand?.evergreen ? 'AI Employee 3-tier: Concierge $1.5K/mo → Build $999+$2K/mo → Managed $5K/mo. Calculator at /calc/ measures dollar bleed.' : '';
|
|
387
|
+
|
|
388
|
+
let prompt = `You are writing an X/Twitter thread that delivers REAL VALUE to the reader. Not poetry. Not a brand voice exercise. A thread someone reads and thinks "I learned something" or "I need to save this."
|
|
389
|
+
|
|
390
|
+
VALUE FIRST. The reader must gain a concrete insight, framework, or perspective they didn't have before. If a post doesn't teach the reader something, cut it.
|
|
391
|
+
|
|
392
|
+
Write ${isThread ? 'a THREAD of 3-6 posts. ONLY as many posts as the insight requires. Never pad. A 3-post thread that nails the insight beats a 7-post thread with filler. Every post must earn its place.' : 'a single post'}.
|
|
393
|
+
|
|
394
|
+
FORMATTING: Use blank lines between thoughts for readability. People scroll fast on X. Make it scannable. No walls of text. No haiku-style one-word-per-line fragments unless it's a deliberate punch.
|
|
395
|
+
|
|
396
|
+
HOOK: "${opts.hook}"
|
|
397
|
+
TOPIC: ${opts.topic}
|
|
398
|
+
AUDIENCE (ICP): ${targetAudience}
|
|
399
|
+
CORE PAIN POINTS: ${pains}
|
|
400
|
+
POSITIONING ANGLES (must align with one):
|
|
401
|
+
${positioning}
|
|
402
|
+
OBJECTIVE: ${opts.objective || 'engagement'}`;
|
|
403
|
+
|
|
404
|
+
if (voice) {
|
|
405
|
+
prompt += `\n\nVOICE RULES (apply as seasoning, NOT as the main structure. Reader value comes first):\n${voice}`;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
if (provenHooks.length > 0) {
|
|
409
|
+
prompt += '\n\nPROVEN PATTERNS THAT WORK (study the style, don\'t copy):';
|
|
410
|
+
for (const h of provenHooks.slice(0, 4)) {
|
|
411
|
+
prompt += `\n- [${h.pattern}] "${h.hook.slice(0, 120)}..." (${h.score} engagement) — ${h.why}`;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (isThread) {
|
|
416
|
+
prompt += `
|
|
417
|
+
|
|
418
|
+
THREAD STRUCTURE (value-driven):
|
|
419
|
+
- Post 1: The hook (sharp, specific, must standalone)
|
|
420
|
+
- Post 2-N: Deliver the insight. Each post adds NEW information the reader didn't have before.
|
|
421
|
+
Use examples, numbers, comparisons, contrarian takes. Explain WHY, not just WHAT.
|
|
422
|
+
- Final post: Land the takeaway. What should the reader do or think differently now?
|
|
423
|
+
- End when the value is delivered. Don't add filler posts.
|
|
424
|
+
|
|
425
|
+
Separate each post with "---"`;
|
|
426
|
+
} else {
|
|
427
|
+
prompt += `
|
|
428
|
+
|
|
429
|
+
SINGLE POST STRUCTURE:
|
|
430
|
+
- Open with the hook (tighten if needed)
|
|
431
|
+
- 1-2 sentences expanding the insight with a specific detail
|
|
432
|
+
- End with the CTA
|
|
433
|
+
- Keep under 280 characters`;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
prompt += `
|
|
437
|
+
|
|
438
|
+
HARD RULES (voice-dna.md enforced):
|
|
439
|
+
- NO external URLs (30-60% reach penalty) — calculator link goes in REPLY tweet only
|
|
440
|
+
- NO "Additionally", "Furthermore", "Moreover", "crucial", "pivotal", "landscape", "delve", "leverage", "synergy", "robust", "seamless", "game-changer", "innovative", "utilize"
|
|
441
|
+
- NO em dashes (—) — use periods, semicolons, or short dashes
|
|
442
|
+
- NO "Most people think", "Imagine if", "Picture this", "Let's dive in"
|
|
443
|
+
- NO rule-of-three lists
|
|
444
|
+
- NO generic predictions ("When X, Y follows", "The shift is clear")
|
|
445
|
+
- NO marketing clichés ("ride the wave", "canary in the coal mine", "governance wall got a door")
|
|
446
|
+
- NO CTA posts ("Link in reply", "What's your experience", "Save this")
|
|
447
|
+
- NO pricing dumps or offer pitches — the thread delivers insight, not a sales pitch
|
|
448
|
+
- NO padding — if a post doesn't add unique value, it shouldn't exist
|
|
449
|
+
- First-person "I" where natural — confessional tone
|
|
450
|
+
- Specific numbers over vague claims (34 units, $8.75M MXN, 27 drafts, 3 weeks → hours)
|
|
451
|
+
- Short punchy lines with white space — staccato fragments allowed
|
|
452
|
+
- Use line breaks for rhythm, not walls of text
|
|
453
|
+
- Physical anchor before abstract claim (Rule 5: mud on boots → orchestration layer evaporated)
|
|
454
|
+
- Whiplash pivot: start grounded, end cosmic with NO transition words (Rule 3)
|
|
455
|
+
- End with unanswered question you genuinely wrestle with (Rule 4)
|
|
456
|
+
- Contrast pairs: Physical vs Digital, Farm vs Tech, Dirt vs Code, Freedom vs Wage slavery
|
|
457
|
+
- Sound like a person talking, not a blog post
|
|
458
|
+
- ${opts.objective === 'blog-traffic' ? 'Tease, don\'t reveal everything. DM for link.' : 'Reveal 90-95% of value. Be generous.'}
|
|
459
|
+
|
|
460
|
+
Return ONLY the post text. No explanations, no labels, no meta-commentary.`;
|
|
461
|
+
|
|
462
|
+
return prompt;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
function main() {
|
|
466
|
+
const args = parseArgs();
|
|
467
|
+
if (!args.hook || !args.topic) {
|
|
468
|
+
console.log('Usage: node generate-x-post.js --hook "..." --topic "..." [--brand name] [--objective engagement|blog-traffic|authority] [--format single|thread] [--thread]');
|
|
469
|
+
process.exit(1);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const brand = loadBrand(args.brand);
|
|
473
|
+
const provenHooks = loadHooks(args.brand);
|
|
474
|
+
|
|
475
|
+
console.log(`Brand: ${brand?.name || 'none'}`);
|
|
476
|
+
console.log(`ICP: ${brand?.icp || 'generic'}`);
|
|
477
|
+
console.log(`Voice: ${brand?.voice ? 'loaded' : 'none'}`);
|
|
478
|
+
console.log(`Proven hooks: ${provenHooks.length}`);
|
|
479
|
+
console.log(`Format: ${args.thread || args.format === 'thread' ? 'thread' : 'single'}`);
|
|
480
|
+
|
|
481
|
+
const prompt = buildPrompt(args, brand, provenHooks);
|
|
482
|
+
|
|
483
|
+
console.log('\nGenerating...');
|
|
484
|
+
let raw;
|
|
485
|
+
try {
|
|
486
|
+
raw = callGemini(prompt);
|
|
487
|
+
} catch (err) {
|
|
488
|
+
console.error('Generation failed:', err.message);
|
|
489
|
+
process.exit(1);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const post = humanizeRegex(raw);
|
|
493
|
+
if (!post || post.length === 0) {
|
|
494
|
+
console.error('Empty post generated');
|
|
495
|
+
process.exit(1);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
console.log('\n' + '='.repeat(50));
|
|
499
|
+
console.log('DRAFT POST:\n');
|
|
500
|
+
console.log(post);
|
|
501
|
+
console.log('\n' + '-'.repeat(50));
|
|
502
|
+
|
|
503
|
+
const isThread = args.thread || args.format === 'thread';
|
|
504
|
+
if (!isThread) {
|
|
505
|
+
console.log(`Characters: ${post.length}/280`);
|
|
506
|
+
} else {
|
|
507
|
+
const parts = post.split('---');
|
|
508
|
+
console.log(`Thread posts: ${parts.length}`);
|
|
509
|
+
parts.forEach((p, i) => console.log(` Post ${i + 1}: ${p.trim().length} chars`));
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
console.log('\nSelf-scoring...');
|
|
513
|
+
const score = selfScore(post, args.hook, args.brand);
|
|
514
|
+
console.log(`Score: ${score.total}/100`);
|
|
515
|
+
console.log(`Verdict: ${score.verdict}`);
|
|
516
|
+
if (score.reason) console.log(`Reason: ${score.reason}`);
|
|
517
|
+
if (score.hook_strength) console.log(` hook_strength: ${score.hook_strength}`);
|
|
518
|
+
if (score.voice_authenticity) console.log(` voice_authenticity: ${score.voice_authenticity}`);
|
|
519
|
+
if (score.specificity) console.log(` specificity: ${score.specificity}`);
|
|
520
|
+
if (score.value_density) console.log(` value_density: ${score.value_density}`);
|
|
521
|
+
if (score.algorithm_fit) console.log(` algorithm_fit: ${score.algorithm_fit}`);
|
|
522
|
+
console.log('='.repeat(50));
|
|
523
|
+
|
|
524
|
+
const out = `/tmp/xpost-${Date.now()}.txt`;
|
|
525
|
+
const metaOut = out.replace('.txt', '.json');
|
|
526
|
+
fs.writeFileSync(out, post);
|
|
527
|
+
fs.writeFileSync(metaOut, JSON.stringify({ post, hook: args.hook, topic: args.topic, brand: args.brand, format: isThread ? 'thread' : 'single', score }, null, 2));
|
|
528
|
+
console.log(`\nPost saved: ${out}`);
|
|
529
|
+
console.log(`Meta saved: ${metaOut}`);
|
|
530
|
+
|
|
531
|
+
if (score.verdict === 'REWRITE') {
|
|
532
|
+
console.log('\n⚠ Self-score below threshold. Agent should run humanizer + quality-gate before presenting.');
|
|
533
|
+
process.exit(2);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
main();
|