@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,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: x-posting-playwriter
|
|
3
|
+
description: >
|
|
4
|
+
Post tweets and threads to X/Twitter via Playwriter (browser automation).
|
|
5
|
+
Use when bird CLI is blocked (error 226) or as primary posting method.
|
|
6
|
+
Handles Draft.js contenteditable, single tweets and multi-tweet threads
|
|
7
|
+
with rate limiting. Triggers on: "post to x", "tweet via playwriter",
|
|
8
|
+
"x thread playwriter", "post tweet browser".
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# X Posting via Playwriter
|
|
12
|
+
|
|
13
|
+
Post tweets and threads to X.com using browser automation via Playwriter. Works when bird CLI is blocked by anti-automation detection (error 226).
|
|
14
|
+
|
|
15
|
+
**Why this exists:** bird CLI uses cookie auth which X flags as automated. Playwriter controls your actual Chrome browser, which X sees as a real user session.
|
|
16
|
+
|
|
17
|
+
## Key Discovery: Draft.js + keyboard.insertText
|
|
18
|
+
|
|
19
|
+
X uses Draft.js for its compose editor. Normal Playwright methods fail:
|
|
20
|
+
- `locator.click()` on textarea → times out (X blocks programmatic clicks on compose)
|
|
21
|
+
- `locator.fill()` → times out
|
|
22
|
+
- `keyboard.type()` → Draft.js doesn't register
|
|
23
|
+
- `keyboard.press()` per char → Draft.js doesn't register
|
|
24
|
+
- `document.execCommand('insertText')` → sometimes works but unreliable
|
|
25
|
+
- `navigator.clipboard.writeText()` + paste → X blocks programmatic paste
|
|
26
|
+
|
|
27
|
+
**What works:**
|
|
28
|
+
1. `mouse.click()` with coordinates from `boundingBox()` → bypasses X's click interception
|
|
29
|
+
2. `keyboard.insertText()` → triggers Draft.js input handler properly
|
|
30
|
+
3. `mouse.click()` on Post button via coordinates → posts successfully
|
|
31
|
+
|
|
32
|
+
## Prerequisites
|
|
33
|
+
|
|
34
|
+
- Chrome must be running with the X account logged in
|
|
35
|
+
- Playwriter extension must be connected
|
|
36
|
+
- Use the correct browser profile (the one logged into X)
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
bunx playwriter@latest session new --browser "profile:108142496489660000816"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Posting a Single Tweet
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
SESSION=7 # your session id
|
|
46
|
+
|
|
47
|
+
# Step 1: Navigate to X home
|
|
48
|
+
bunx playwriter@latest -s $SESSION -e "$(cat <<'EOF'
|
|
49
|
+
state.page = context.pages().find(p => p.url() === 'https://x.com/home')
|
|
50
|
+
if (!state.page) {
|
|
51
|
+
state.page = await context.newPage()
|
|
52
|
+
await state.page.goto('https://x.com/home', { waitUntil: 'domcontentloaded' })
|
|
53
|
+
}
|
|
54
|
+
await state.page.waitForTimeout(5000)
|
|
55
|
+
console.log("Ready:", state.page.url())
|
|
56
|
+
EOF
|
|
57
|
+
)"
|
|
58
|
+
|
|
59
|
+
# Step 2: Click textarea via coordinates and type
|
|
60
|
+
bunx playwriter@latest -s $SESSION -e "$(cat <<'EOF'
|
|
61
|
+
const textarea = state.page.locator('[data-testid="tweetTextarea_0"]')
|
|
62
|
+
const tbox = await textarea.boundingBox()
|
|
63
|
+
await state.page.mouse.click(tbox.x + tbox.width/2, tbox.y + tbox.height/2)
|
|
64
|
+
await state.page.waitForTimeout(1000)
|
|
65
|
+
await state.page.keyboard.insertText("YOUR TWEET TEXT HERE")
|
|
66
|
+
await state.page.waitForTimeout(1000)
|
|
67
|
+
const postBtn = state.page.locator('[data-testid="tweetButtonInline"]')
|
|
68
|
+
const pbox = await postBtn.boundingBox()
|
|
69
|
+
await state.page.mouse.click(pbox.x + pbox.width/2, pbox.y + pbox.height/2)
|
|
70
|
+
console.log("Posted!")
|
|
71
|
+
await state.page.waitForTimeout(3000)
|
|
72
|
+
EOF
|
|
73
|
+
)"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Posting a Thread (Multi-Tweet)
|
|
77
|
+
|
|
78
|
+
Thread = tweet 1, then reply to tweet 1, then reply to reply, etc.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
TWEET1_URL="" # will be captured after first tweet
|
|
82
|
+
|
|
83
|
+
# Step 1: Post first tweet (same as single tweet above)
|
|
84
|
+
# After posting, capture URL:
|
|
85
|
+
bunx playwriter@latest -s $SESSION -e "$(cat <<'EOF'
|
|
86
|
+
await state.page.goto('https://x.com/AIwithJai', { waitUntil: 'domcontentloaded' })
|
|
87
|
+
await state.page.waitForTimeout(4000)
|
|
88
|
+
const articles = await state.page.locator('article').all()
|
|
89
|
+
const tweet1 = articles[1] // skip pinned
|
|
90
|
+
const timeLink = await tweet1.locator('time').evaluateHandle(el => el.closest('a')?.href)
|
|
91
|
+
state.tweet1Url = await timeLink.evaluate(el => el?.href || el)
|
|
92
|
+
console.log("Tweet 1 URL:", state.tweet1Url)
|
|
93
|
+
EOF
|
|
94
|
+
)"
|
|
95
|
+
|
|
96
|
+
# Step 2: Wait 45 seconds (rate limiting!)
|
|
97
|
+
sleep 45
|
|
98
|
+
|
|
99
|
+
# Step 3: Navigate to tweet, click reply, type, post
|
|
100
|
+
bunx playwriter@latest -s $SESSION -e "$(cat <<'EOF'
|
|
101
|
+
await state.page.goto(state.tweet1Url, { waitUntil: 'domcontentloaded' })
|
|
102
|
+
await state.page.waitForTimeout(4000)
|
|
103
|
+
const replyBtn = state.page.locator('[data-testid="reply"]').first()
|
|
104
|
+
const rbox = await replyBtn.boundingBox()
|
|
105
|
+
await state.page.mouse.click(rbox.x + rbox.width/2, rbox.y + rbox.height/2)
|
|
106
|
+
await state.page.waitForTimeout(2000)
|
|
107
|
+
const textarea = state.page.locator('[data-testid="tweetTextarea_0"]').first()
|
|
108
|
+
const tbox = await textarea.boundingBox()
|
|
109
|
+
await state.page.mouse.click(tbox.x + tbox.width/2, tbox.y + tbox.height/2)
|
|
110
|
+
await state.page.waitForTimeout(1000)
|
|
111
|
+
await state.page.keyboard.insertText("REPLY TEXT HERE")
|
|
112
|
+
await state.page.waitForTimeout(1000)
|
|
113
|
+
const postBtn = state.page.locator('[data-testid="tweetButton"]').first()
|
|
114
|
+
const pbox = await postBtn.boundingBox()
|
|
115
|
+
await state.page.mouse.click(pbox.x + pbox.width/2, pbox.y + pbox.height/2)
|
|
116
|
+
console.log("Reply posted!")
|
|
117
|
+
await state.page.waitForTimeout(4000)
|
|
118
|
+
EOF
|
|
119
|
+
)"
|
|
120
|
+
|
|
121
|
+
# Step 4+: Repeat step 3 for each additional reply
|
|
122
|
+
# ALWAYS wait 45 seconds between each tweet
|
|
123
|
+
# After each reply, reload the page before clicking reply again
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Thread Reply Template (reusable)
|
|
127
|
+
|
|
128
|
+
For replies 2-N in a thread, after the first reply:
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
// Reload to see updated thread
|
|
132
|
+
await state.page.reload({ waitUntil: 'domcontentloaded' })
|
|
133
|
+
await state.page.waitForTimeout(3000)
|
|
134
|
+
|
|
135
|
+
// Click first reply button
|
|
136
|
+
const replyBtns = await state.page.locator('[data-testid="reply"]').all()
|
|
137
|
+
const rbox = await replyBtns[0].boundingBox()
|
|
138
|
+
await state.page.mouse.click(rbox.x + rbox.width/2, rbox.y + rbox.height/2)
|
|
139
|
+
await state.page.waitForTimeout(2000)
|
|
140
|
+
|
|
141
|
+
// Click textarea and type
|
|
142
|
+
const textarea = state.page.locator('[data-testid="tweetTextarea_0"]').first()
|
|
143
|
+
const tbox = await textarea.boundingBox()
|
|
144
|
+
await state.page.mouse.click(tbox.x + tbox.width/2, tbox.y + tbox.height/2)
|
|
145
|
+
await state.page.waitForTimeout(1000)
|
|
146
|
+
await state.page.keyboard.insertText("TWEET TEXT")
|
|
147
|
+
await state.page.waitForTimeout(1000)
|
|
148
|
+
|
|
149
|
+
// Click Post
|
|
150
|
+
const postBtn = state.page.locator('[data-testid="tweetButton"]').first()
|
|
151
|
+
const pbox = await postBtn.boundingBox()
|
|
152
|
+
await state.page.mouse.click(pbox.x + pbox.width/2, pbox.y + pbox.height/2)
|
|
153
|
+
console.log("Posted!")
|
|
154
|
+
await state.page.waitForTimeout(4000)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Element Selectors
|
|
158
|
+
|
|
159
|
+
| Element | Selector | Notes |
|
|
160
|
+
|---------|----------|-------|
|
|
161
|
+
| Compose textarea | `[data-testid="tweetTextarea_0"]` | Contenteditable div, NOT input |
|
|
162
|
+
| Post button (home) | `[data-testid="tweetButtonInline"]` | Inline compose on home page |
|
|
163
|
+
| Post button (reply) | `[data-testid="tweetButton"]` | Reply compose dialog |
|
|
164
|
+
| Reply button | `[data-testid="reply"]` | On each tweet |
|
|
165
|
+
| Side nav Post button | `[data-testid="SideNav_NewTweet_Button"]` | Left sidebar |
|
|
166
|
+
|
|
167
|
+
## Rate Limiting (CRITICAL)
|
|
168
|
+
|
|
169
|
+
- **45 seconds minimum** between each tweet in a thread
|
|
170
|
+
- Use `sleep 45` between playwriter commands
|
|
171
|
+
- Max ~5 tweets per thread per session
|
|
172
|
+
- If Post button stays disabled after insertText, reload the page and retry
|
|
173
|
+
- X may still flag accounts that post too frequently
|
|
174
|
+
|
|
175
|
+
## Troubleshooting
|
|
176
|
+
|
|
177
|
+
| Problem | Cause | Fix |
|
|
178
|
+
|---------|-------|-----|
|
|
179
|
+
| Post button stays disabled | Draft.js didn't register text | Reload page, refocus textarea, use `keyboard.insertText()` |
|
|
180
|
+
| Click on textarea times out | X blocks programmatic clicks | Use `mouse.click()` with `boundingBox()` coordinates |
|
|
181
|
+
| Text appears but button disabled | Wrong input method used | Must use `keyboard.insertText()`, not `type()` or `fill()` |
|
|
182
|
+
| Page closed error | User closed the tab | Reset session: `playwriter session reset N` |
|
|
183
|
+
| "Node is not input" error | X uses contenteditable div | Use `textContent()` not `inputValue()` |
|
|
184
|
+
| Reply didn't chain properly | Replied to wrong tweet | Reload page between replies, use first reply button |
|
|
185
|
+
|
|
186
|
+
## Limitations
|
|
187
|
+
|
|
188
|
+
- No media upload support yet (images, video)
|
|
189
|
+
- No emoji picker interaction
|
|
190
|
+
- No poll creation
|
|
191
|
+
- No scheduled posts via this method (use typefully for scheduling)
|
|
192
|
+
- Newlines in tweets not supported (keyboard.insertText treats \n as space)
|
|
193
|
+
- For multi-paragraph tweets, use single paragraph with periods for breaks
|
|
194
|
+
|
|
195
|
+
## When to Use vs Other Methods
|
|
196
|
+
|
|
197
|
+
| Method | Use When | Reliability |
|
|
198
|
+
|--------|----------|-------------|
|
|
199
|
+
| bird CLI | Normal posting, not flagged | High (when not blocked) |
|
|
200
|
+
| **playwriter** | bird blocked (226), threads | Medium (Draft.js quirks) |
|
|
201
|
+
| typefully | Scheduled posts, reliable API | High (needs API key setup) |
|
|
202
|
+
|
|
203
|
+
*Last updated: 2026-05-09*
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
slash_command: false
|
|
3
|
+
name: x-research
|
|
4
|
+
description: Search and research X (Twitter) using bird CLI. Use when researching social media sentiment, trending topics, user activity, or platform-specific content that only exists on X.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## USE WHEN
|
|
8
|
+
**Use this skill when:**
|
|
9
|
+
|
|
10
|
+
- Researching **X/Twitter-specific content** that won't appear in web search
|
|
11
|
+
- Analyzing **social media sentiment** around topics, brands, or people
|
|
12
|
+
- Tracking **trending hashtags** or conversations on X
|
|
13
|
+
- Researching **user activity** and tweet history (recent tweets, engagement patterns)
|
|
14
|
+
- Finding **real-time reactions** to events or announcements
|
|
15
|
+
- Monitoring **brand mentions** or competitor activity on X
|
|
16
|
+
- Researching **influencer or thought leader** presence and engagement
|
|
17
|
+
- Finding **thread content** or quote tweets (context not in web search)
|
|
18
|
+
|
|
19
|
+
**Example scenarios:**
|
|
20
|
+
- "What's X saying about NVDA stock today?" → sentiment analysis + recent tweets
|
|
21
|
+
- "Research @elonmusk's recent AI-related tweets" → user tweet history
|
|
22
|
+
- "Find trending hashtags for #AI" → hashtag research
|
|
23
|
+
- "Who's mentioning Nomadixgear on X?" → brand mention monitoring
|
|
24
|
+
- "What's the reaction to this news on X?" → real-time sentiment
|
|
25
|
+
|
|
26
|
+
## DON'T WHEN
|
|
27
|
+
**Don't use this skill when:**
|
|
28
|
+
|
|
29
|
+
- Researching **general web content** (use web_search or web_fetch instead)
|
|
30
|
+
- Topic is **not X-specific** (general knowledge, Wikipedia, etc.)
|
|
31
|
+
- Looking for **long-form content** (blog posts, articles) → use web_fetch
|
|
32
|
+
- Researching **official documentation** or press releases → use web_fetch on official sites
|
|
33
|
+
- User wants **broad research across platforms** (not just X)
|
|
34
|
+
- Topic is **evergreen content** (not time-sensitive tweets)
|
|
35
|
+
- Need **in-depth analysis** (X is for quick hits, use deep-research for comprehensive)
|
|
36
|
+
|
|
37
|
+
**Wrong uses:**
|
|
38
|
+
- "What's the capital of France?" → Use web_search or answer directly
|
|
39
|
+
- "Read this blog post" → Use web_fetch on the URL
|
|
40
|
+
- "Who is CEO of Apple?" → Use web_search, not X search
|
|
41
|
+
- "Find me documentation for X API" → Use web_fetch on docs.x.com
|
|
42
|
+
- "Research competitor features" → Use deep-research or web_search (broader than X)
|
|
43
|
+
|
|
44
|
+
**Alternative patterns:**
|
|
45
|
+
- Web search → web_search tool (broader sources)
|
|
46
|
+
- URL content → web_fetch tool (direct access)
|
|
47
|
+
- Deep research → deep-research skill (comprehensive with citations)
|
|
48
|
+
- Social media beyond X → Consider platform-specific tools or web_search with site filters
|
|
49
|
+
|
|
50
|
+
# X Research Skill
|
|
51
|
+
Search and research X (Twitter) using bird CLI.
|
|
52
|
+
|
|
53
|
+
## Agent-Reach Integration (Free X Search)
|
|
54
|
+
|
|
55
|
+
**Agent-Reach** (skill: `agent-reach`) provides free X/Twitter search via bird CLI / twitter-cli (no API key, zero config):
|
|
56
|
+
```bash
|
|
57
|
+
agent-reach doctor --json # Check if X backend is available (shows bird CLI or twitter-cli)
|
|
58
|
+
|
|
59
|
+
# Search tweets
|
|
60
|
+
twitter search "query" -n 10
|
|
61
|
+
# or
|
|
62
|
+
bird search "query"
|
|
63
|
+
|
|
64
|
+
# Read single tweet/thread
|
|
65
|
+
twitter tweet URL
|
|
66
|
+
bird tweet URL
|
|
67
|
+
|
|
68
|
+
# User timeline
|
|
69
|
+
twitter user-posts @username -n 20
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Use Agent-Reach for**: Quick searches, broad discovery, zero-setup research.
|
|
73
|
+
**Use x-research skill for**: Structured queries with time filters, sentiment analysis, historical tracking.
|
|
74
|
+
|
|
75
|
+
## Usage
|
|
76
|
+
```bash
|
|
77
|
+
|
|
78
|
+
# Quick search (via x-research skill)
|
|
79
|
+
x-research --query "OpenClaw skills" --time 24h
|
|
80
|
+
|
|
81
|
+
# Quick search (via Agent-Reach, zero config)
|
|
82
|
+
twitter search "OpenClaw skills" -n 10
|
|
83
|
+
|
|
84
|
+
# Deep research with analysis (x-research skill)
|
|
85
|
+
x-research --query "what are people saying about NVDA today" --time today --analyze
|
|
86
|
+
|
|
87
|
+
# Search specific user tweets (x-research skill)
|
|
88
|
+
x-research --query "from:@elonmusk AI" --time 7d
|
|
89
|
+
|
|
90
|
+
# Read specific tweet/thread (Agent-Reach)
|
|
91
|
+
twitter tweet "https://x.com/user/status/123"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Time Filters
|
|
95
|
+
- `1h`, `24h`, `today`, `7d`, `30d`
|
|
96
|
+
|
|
97
|
+
## Output Formats
|
|
98
|
+
|
|
99
|
+
### Quick Search
|
|
100
|
+
- Tweet text and metadata
|
|
101
|
+
- Author, timestamp, engagement stats
|
|
102
|
+
- URLs and hashtags
|
|
103
|
+
|
|
104
|
+
### Analysis Mode (--analyze)
|
|
105
|
+
- Sentiment summary (positive/negative/neutral), Top themes extracted, Key accounts mentioned, Engagement patterns
|
|
106
|
+
|
|
107
|
+
# Recent conversation tracking
|
|
108
|
+
x-research --query "AIwithJai" --time 24h
|
|
109
|
+
|
|
110
|
+
# Sentiment analysis
|
|
111
|
+
x-research --query "Nomadixgear" --time today --analyze
|
|
112
|
+
|
|
113
|
+
# Competitor monitoring
|
|
114
|
+
x-research --query "competitor-name" --time 7d
|
|
115
|
+
|
|
116
|
+
# Trending hashtag research
|
|
117
|
+
x-research --query "#glamping" --time today
|
|
118
|
+
|
|
119
|
+
## Tips
|
|
120
|
+
- X search is best for **recent, time-sensitive content** (last 1-7 days)
|
|
121
|
+
- For older content, X search is limited — use web_search with site:twitter.com
|
|
122
|
+
- Engagement metrics help identify **influential tweets** vs noise
|
|
123
|
+
- Analysis mode provides **qualitative insights** beyond raw tweet lists
|
|
124
|
+
|
|
125
|
+
## Limitations
|
|
126
|
+
- X search API limits historical data (usually 7 days for full search, longer for user-specific)
|
|
127
|
+
- Retweets and quote tweets may need manual inspection for context
|
|
128
|
+
- Direct messages (DMs) are not searchable
|
|
129
|
+
- Deleted tweets remain indexed briefly in some cases
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
QUERY=""
|
|
5
|
+
TIME="24h"
|
|
6
|
+
ANALYZE=false
|
|
7
|
+
MAX_RESULTS=20
|
|
8
|
+
|
|
9
|
+
# Auth tokens from TOOLS.md
|
|
10
|
+
AUTH_TOKEN="16dfd5eaf636980f73c0dfd602df8fea26e63feb"
|
|
11
|
+
CT0="a3b15922b77da31a57fd003b3bc7e769c2617235113ea68327d336244473c5aad91e0519bba46817e37f1c8f4ab87ad8269d82859533da53da252b7fb7d3872f8fe0cb755b0f0507cb1f5ccca936189d"
|
|
12
|
+
|
|
13
|
+
usage() {
|
|
14
|
+
echo "Usage: x-research --query <query> [--time 1h|24h|today|7d|30d] [--analyze]"
|
|
15
|
+
exit 1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
while [[ $# -gt 0 ]]; do
|
|
19
|
+
case $1 in
|
|
20
|
+
--query)
|
|
21
|
+
QUERY="$2"
|
|
22
|
+
shift 2
|
|
23
|
+
;;
|
|
24
|
+
--time)
|
|
25
|
+
TIME="$2"
|
|
26
|
+
shift 2
|
|
27
|
+
;;
|
|
28
|
+
--analyze)
|
|
29
|
+
ANALYZE=true
|
|
30
|
+
shift
|
|
31
|
+
;;
|
|
32
|
+
*)
|
|
33
|
+
echo "Unknown option: $1"
|
|
34
|
+
usage
|
|
35
|
+
;;
|
|
36
|
+
esac
|
|
37
|
+
done
|
|
38
|
+
|
|
39
|
+
if [[ -z "$QUERY" ]]; then
|
|
40
|
+
echo "Error: --query is required"
|
|
41
|
+
usage
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
echo "🔍 Searching X for: $QUERY"
|
|
45
|
+
echo "⏱️ Time filter: $TIME"
|
|
46
|
+
echo ""
|
|
47
|
+
|
|
48
|
+
# Run bird search
|
|
49
|
+
bird search "$QUERY" -n $MAX_RESULTS --auth-token "$AUTH_TOKEN" --ct0 "$CT0" 2>&1 | awk '
|
|
50
|
+
BEGIN { topic=1; first=1 }
|
|
51
|
+
/^@[a-zA-Z0-9_]+ \(/ {
|
|
52
|
+
if (!first) print ""
|
|
53
|
+
first=0
|
|
54
|
+
|
|
55
|
+
# Parse user and name
|
|
56
|
+
user=$1
|
|
57
|
+
name=$0
|
|
58
|
+
sub(/^@[a-zA-Z0-9_]+ \(/, "", name)
|
|
59
|
+
sub(/\):.*$/, "", name)
|
|
60
|
+
|
|
61
|
+
# Get the tweet text (everything after the first closing paren and colon)
|
|
62
|
+
tweet=""
|
|
63
|
+
for (i=2; i<=NF; i++) {
|
|
64
|
+
if ($i ~ /\):$/) {
|
|
65
|
+
tweet_start=i+1
|
|
66
|
+
break
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (i=tweet_start; i<=NF; i++) {
|
|
70
|
+
tweet=tweet " " $i
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Print formatted output
|
|
74
|
+
print "• " user ":" tweet
|
|
75
|
+
next
|
|
76
|
+
}
|
|
77
|
+
/^🔗/ {
|
|
78
|
+
sub(/^🔗 /, "→ ", $0)
|
|
79
|
+
print $0
|
|
80
|
+
print ""
|
|
81
|
+
next
|
|
82
|
+
}
|
|
83
|
+
/^📅/ { next }
|
|
84
|
+
/^[─═]/ { next }
|
|
85
|
+
{ next }'
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
slash_command: false
|
|
3
|
+
name: youtube-summarize
|
|
4
|
+
description: Summarize YouTube videos using Google Gemini API with direct URL input. Extract key insights, transcripts, and content ideas from YouTube videos. Use when needing to analyze YouTube content for content creation, research, or information extraction.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# YouTube Summarize Skill
|
|
8
|
+
Summarize YouTube videos using Google's Gemini API with direct YouTube URL input. This skill extracts video content insights without needing transcript downloads.
|
|
9
|
+
|
|
10
|
+
## How It Works
|
|
11
|
+
The Gemini API accepts YouTube URLs directly in the `fileData.fileUri` field. Gemini fetches and processes the video content, including visual understanding and audio transcription.
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
- `GEMINI_API_KEY` environment variable set with your Google AI Studio API key
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
```bash
|
|
18
|
+
|
|
19
|
+
# Basic summary
|
|
20
|
+
./scripts/youtube-summarize.sh "https://youtu.be/VIDEO_ID"
|
|
21
|
+
|
|
22
|
+
# Extract content ideas
|
|
23
|
+
./scripts/youtube-summarize.sh "https://www.youtube.com/watch?v=VIDEO_ID" --mode ideas
|
|
24
|
+
|
|
25
|
+
# Full transcript with timestamps
|
|
26
|
+
./scripts/youtube-summarize.sh "https://youtu.be/VIDEO_ID" --mode transcript
|
|
27
|
+
|
|
28
|
+
# Custom prompt
|
|
29
|
+
./scripts/youtube-summarize.sh "https://youtu.be/VIDEO_ID" --prompt "What are the key points about X?"
|
|
30
|
+
|
|
31
|
+
# JSON output
|
|
32
|
+
./scripts/youtube-summarize.sh "https://youtu.be/VIDEO_ID" --json
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Output Modes
|
|
36
|
+
- `summary`: Concise overview (default)
|
|
37
|
+
- `ideas`: Content ideas and angles
|
|
38
|
+
- `transcript`: Full transcript with timestamps
|
|
39
|
+
- `key_points`: Numbered key takeaways
|
|
40
|
+
- `custom`: Use with --prompt for custom analysis
|
|
41
|
+
|
|
42
|
+
# Extract ideas for your content
|
|
43
|
+
./scripts/youtube-summarize.sh "https://youtu.be/..." --mode ideas --json > ideas.json
|
|
44
|
+
|
|
45
|
+
# Batch process multiple videos
|
|
46
|
+
for url in urls.txt; do
|
|
47
|
+
./scripts/youtube-summarize.sh "$url" --mode key_points
|
|
48
|
+
done
|
|
49
|
+
|
|
50
|
+
# Get transcript for analysis
|
|
51
|
+
./scripts/youtube-summarize.sh "https://youtu.be/..." --mode transcript > transcript.md
|
|
52
|
+
|
|
53
|
+
## Limitations
|
|
54
|
+
- Videos must be publicly accessible
|
|
55
|
+
- Some videos (music, restricted) may not work
|
|
56
|
+
- For blocked videos, use direct download + transcription instead
|
|
57
|
+
|
|
58
|
+
## Agent-Reach Alternative (Free Transcripts)
|
|
59
|
+
|
|
60
|
+
**Agent-Reach** (skill: `agent-reach`) provides free YouTube transcripts via yt-dlp:
|
|
61
|
+
```bash
|
|
62
|
+
agent-reach doctor --json # Check if YouTube backend is available
|
|
63
|
+
|
|
64
|
+
# Download transcripts (no API key needed)
|
|
65
|
+
yt-dlp --write-sub --write-auto-sub --sub-lang "zh-Hans,zh,en" --skip-download -o "/tmp/%(id)s" "URL"
|
|
66
|
+
cat /tmp/VIDEO_ID.*.vtt
|
|
67
|
+
|
|
68
|
+
# Or use Agent-Reach transcribe for Whisper fallback
|
|
69
|
+
agent-reach configure groq-key YOUR_KEY # Free at console.groq.com
|
|
70
|
+
agent-reach transcribe "https://www.youtube.com/watch?v=VIDEO_ID"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Use Agent-Reach for**: Free transcripts without API key, batch processing, when Gemini API fails.
|
|
74
|
+
**Use youtube-summarize for**: Gemini-powered analysis, visual understanding, custom prompts.
|
|
75
|
+
|
|
76
|
+
## Technical Reference
|
|
77
|
+
API endpoint: `https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent`
|
|
78
|
+
|
|
79
|
+
Request body includes:
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"contents": [{
|
|
83
|
+
"parts": [
|
|
84
|
+
{"text": "Summarize this video"},
|
|
85
|
+
{"fileData": {"fileUri": "https://www.youtube.com/watch?v=..."}}
|
|
86
|
+
]
|
|
87
|
+
}]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
See `/scripts/youtube-summarize.sh` for implementation details.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# youtube-summarize.sh - Summarize YouTube videos using Gemini API
|
|
3
|
+
# Usage: youtube-summarize.sh <youtube_url> [options]
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
# Configuration
|
|
8
|
+
API_KEY="${GEMINI_API_KEY:-${GOOGLE_API_KEY:-}}"
|
|
9
|
+
MODEL="gemini-3-flash-preview"
|
|
10
|
+
API_BASE="https://generativelanguage.googleapis.com/v1beta/models"
|
|
11
|
+
|
|
12
|
+
# Default settings
|
|
13
|
+
MODE="summary"
|
|
14
|
+
JSON_OUTPUT=false
|
|
15
|
+
CUSTOM_PROMPT=""
|
|
16
|
+
|
|
17
|
+
# Parse arguments
|
|
18
|
+
URL=""
|
|
19
|
+
while [[ $# -gt 0 ]]; do
|
|
20
|
+
case $1 in
|
|
21
|
+
--mode)
|
|
22
|
+
MODE="$2"
|
|
23
|
+
shift 2
|
|
24
|
+
;;
|
|
25
|
+
--prompt)
|
|
26
|
+
CUSTOM_PROMPT="$2"
|
|
27
|
+
shift 2
|
|
28
|
+
;;
|
|
29
|
+
--json)
|
|
30
|
+
JSON_OUTPUT=true
|
|
31
|
+
shift
|
|
32
|
+
;;
|
|
33
|
+
-*|--*)
|
|
34
|
+
echo "Unknown option: $1" >&2
|
|
35
|
+
echo "Usage: $0 <youtube_url> [--mode summary|ideas|transcript|key_points] [--prompt 'custom text'] [--json]" >&2
|
|
36
|
+
exit 1
|
|
37
|
+
;;
|
|
38
|
+
*)
|
|
39
|
+
URL="$1"
|
|
40
|
+
shift
|
|
41
|
+
;;
|
|
42
|
+
esac
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
# Validate
|
|
46
|
+
if [[ -z "$URL" ]]; then
|
|
47
|
+
echo "Error: YouTube URL is required" >&2
|
|
48
|
+
echo "Usage: $0 <youtube_url> [options]" >&2
|
|
49
|
+
exit 1
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
if [[ -z "$API_KEY" ]]; then
|
|
53
|
+
echo "Error: GEMINI_API_KEY or GOOGLE_API_KEY environment variable is required" >&2
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
# Normalize URL to full YouTube URL
|
|
58
|
+
if [[ "$URL" == "https://youtu.be/"* ]]; then
|
|
59
|
+
VIDEO_ID="${URL#https://youtu.be/}"
|
|
60
|
+
FULL_URL="https://www.youtube.com/watch?v=${VIDEO_ID%%\?*}"
|
|
61
|
+
elif [[ "$URL" == "https://www.youtube.com/shorts/"* ]]; then
|
|
62
|
+
VIDEO_ID="${URL#https://www.youtube.com/shorts/}"
|
|
63
|
+
FULL_URL="https://www.youtube.com/watch?v=${VIDEO_ID%%\?*}"
|
|
64
|
+
else
|
|
65
|
+
FULL_URL="$URL"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Build prompt based on mode
|
|
69
|
+
case "$MODE" in
|
|
70
|
+
summary)
|
|
71
|
+
PROMPT="${CUSTOM_PROMPT:-Provide a concise summary of this YouTube video in 3-5 sentences. Include the main topic, key insights, and any actionable takeaways.}"
|
|
72
|
+
;;
|
|
73
|
+
ideas)
|
|
74
|
+
PROMPT="${CUSTOM_PROMPT:-Extract 5-10 content ideas from this video that could be turned into blog posts, social media threads, or newsletter content. For each idea, include a title and a brief description.}"
|
|
75
|
+
;;
|
|
76
|
+
transcript)
|
|
77
|
+
PROMPT="${CUSTOM_PROMPT:-Provide a full transcript of this video with timestamps. Format as: [MM:SS] text}"
|
|
78
|
+
;;
|
|
79
|
+
key_points)
|
|
80
|
+
PROMPT="${CUSTOM_PROMPT:-Extract the 5-7 most important key points from this video as a numbered list. Each point should be 1-2 sentences.}"
|
|
81
|
+
;;
|
|
82
|
+
custom)
|
|
83
|
+
PROMPT="${CUSTOM_PROMPT:-Analyze this video}"
|
|
84
|
+
;;
|
|
85
|
+
*)
|
|
86
|
+
PROMPT="${CUSTOM_PROMPT:-Summarize this video}"
|
|
87
|
+
;;
|
|
88
|
+
esac
|
|
89
|
+
|
|
90
|
+
# Build request JSON
|
|
91
|
+
REQUEST_BODY=$(cat <<EOF
|
|
92
|
+
{
|
|
93
|
+
"contents": [{
|
|
94
|
+
"parts": [
|
|
95
|
+
{"text": "${PROMPT}"},
|
|
96
|
+
{"fileData": {"fileUri": "${FULL_URL}"}}
|
|
97
|
+
]
|
|
98
|
+
}],
|
|
99
|
+
"generationConfig": {
|
|
100
|
+
"maxOutputTokens": 8192,
|
|
101
|
+
"temperature": 0.4
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
EOF
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
# Make API call
|
|
108
|
+
URL_ENCODED=$(echo "$FULL_URL" | sed 's/&/\&/g')
|
|
109
|
+
RESPONSE=$(curl -s -X POST "${API_BASE}/${MODEL}:generateContent" \
|
|
110
|
+
-H "x-goog-api-key: ${API_KEY}" \
|
|
111
|
+
-H "Content-Type: application/json" \
|
|
112
|
+
-d "$REQUEST_BODY" 2>&1) || {
|
|
113
|
+
echo "Error: Failed to connect to Gemini API" >&2
|
|
114
|
+
exit 1
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# Check for API errors
|
|
118
|
+
if echo "$RESPONSE" | grep -q '"error":'; then
|
|
119
|
+
ERROR=$(echo "$RESPONSE" | grep -o '"message": "[^"]*"' | head -1 | cut -d'"' -f4)
|
|
120
|
+
echo "API Error: ${ERROR:-$RESPONSE}" >&2
|
|
121
|
+
exit 1
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
# Extract content from response
|
|
125
|
+
SUMMARY=$(echo "$RESPONSE" | sed -n 's/.*"text": "\([^"]*\)".*/\1/p; s/\\n/\n/g' | head -1)
|
|
126
|
+
|
|
127
|
+
# If extraction failed, try jq or alternative parsing
|
|
128
|
+
if [[ -z "$SUMMARY" ]] && command -v jq >/dev/null 2>&1; then
|
|
129
|
+
SUMMARY=$(echo "$RESPONSE" | jq -r '.candidates[0].content.parts[0].text' 2>/dev/null)
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
# Output
|
|
133
|
+
if [[ "$JSON_OUTPUT" == true ]]; then
|
|
134
|
+
echo "$RESPONSE"
|
|
135
|
+
else
|
|
136
|
+
if [[ -n "$SUMMARY" ]]; then
|
|
137
|
+
printf '%b\n' "$SUMMARY"
|
|
138
|
+
else
|
|
139
|
+
# Fallback: output raw response if parsing failed
|
|
140
|
+
echo "Note: Summary extraction failed, showing raw response:"
|
|
141
|
+
echo "$RESPONSE"
|
|
142
|
+
fi
|
|
143
|
+
fi
|