@jairodri/huckleberry-cli 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +85 -0
- package/agents/cos.json +2 -5
- package/agents/hermes/AGENTS.md +25 -49
- package/agents/hermes/fix-kimaki/SKILL.md +19 -92
- package/agents/hermes/hermes-fixer.md +44 -74
- package/agents/hermes.json +6 -18
- package/kanban/SKILL.md +18 -18
- package/kanban/package.json +1 -1
- package/kanban/src/dispatcher.mjs +1 -1
- package/kanban/templates/blog-social-campaign.yaml +6 -2
- package/kanban/templates/social-campaign.yaml +9 -4
- package/mcp/jev-calibration.mjs +335 -0
- package/mcp/jev-client.mjs +119 -0
- package/mcp/jev-thresholds.json +27 -0
- package/package.json +13 -9
- package/scripts/doctor-watchdog.sh +73 -0
- package/scripts/install-services.sh +34 -27
- package/scripts/self-improve-weekly.sh +34 -0
- package/scripts/sync-skills.mjs +121 -0
- package/skills/ab-test-setup/SKILL.md +266 -0
- package/skills/ab-test-setup/evals/evals.json +105 -0
- package/skills/ab-test-setup/references/sample-size-guide.md +263 -0
- package/skills/ab-test-setup/references/test-templates.md +277 -0
- package/skills/agent-reach/SKILL.md +132 -0
- package/skills/agent-reach/references/career.md +29 -0
- package/skills/agent-reach/references/dev.md +62 -0
- package/skills/agent-reach/references/search.md +33 -0
- package/skills/agent-reach/references/social.md +232 -0
- package/skills/agent-reach/references/video.md +130 -0
- package/skills/agent-reach/references/web.md +50 -0
- package/skills/ai-agent-seo/SKILL.md +450 -0
- package/skills/ai-cold-email-intelligence/SKILL.md +54 -0
- package/skills/ai-cold-email-intelligence/references/prompts.md +21 -0
- package/skills/ai-consensus-builder/SKILL.md +324 -0
- package/skills/ai-seo/SKILL.md +399 -0
- package/skills/ai-seo/evals/evals.json +90 -0
- package/skills/ai-seo/references/content-patterns.md +284 -0
- package/skills/ai-seo/references/platform-ranking-factors.md +152 -0
- package/skills/ai-visibility-audit/SKILL.md +322 -0
- package/skills/analytics-tracking/SKILL.md +309 -0
- package/skills/analytics-tracking/evals/evals.json +90 -0
- package/skills/analytics-tracking/references/event-library.md +260 -0
- package/skills/analytics-tracking/references/ga4-implementation.md +300 -0
- package/skills/analytics-tracking/references/gtm-implementation.md +390 -0
- package/skills/article-generator/SKILL.md +216 -0
- package/skills/auto-indexing/SKILL.md +179 -0
- package/skills/auto-indexing/scripts/auto-indexing.js +257 -0
- package/skills/auto-skill/SKILL.md +151 -0
- package/skills/auto-skill/correction-queue.js +102 -0
- package/skills/auto-skill/dedup.js +97 -0
- package/skills/auto-skill/skill-router.js +224 -0
- package/skills/autoresearch/SKILL.md +334 -0
- package/skills/autoresearch/autoresearch-autoresearch/SKILL.md.baseline +329 -0
- package/skills/autoresearch/autoresearch-autoresearch/changelog.md +34 -0
- package/skills/autoresearch/autoresearch-autoresearch/dashboard.html +116 -0
- package/skills/autoresearch/autoresearch-autoresearch/evals.md +39 -0
- package/skills/autoresearch/autoresearch-autoresearch/results.json +44 -0
- package/skills/autoresearch/autoresearch-autoresearch/results.tsv +3 -0
- package/skills/autoresearch/eval-guide.md +121 -0
- package/skills/b2b-cold-outreach/SKILL.md +322 -0
- package/skills/birdclaw/SKILL.md +82 -0
- package/skills/brainstorm/SKILL.md +168 -0
- package/skills/brand-kit-playground/SKILL.md +312 -0
- package/skills/brand-kit-playground/references/html-architecture.md +316 -0
- package/skills/brand-kit-playground/references/steal-patterns.md +88 -0
- package/skills/brand-voice/SKILL.md +223 -0
- package/skills/brand-voice/references/honesty-as-positioning.md +60 -0
- package/skills/brand-voice/references/voice-modes.md +1158 -0
- package/skills/business-advisory-council/README.md +136 -0
- package/skills/business-advisory-council/SKILL.md +94 -0
- package/skills/business-advisory-council/business-advisory-council.py +492 -0
- package/skills/business-advisory-council/discord-components-decision.json +8 -0
- package/skills/business-advisory-council/examples/steve-conley-partnership.json +6 -0
- package/skills/business-advisory-council/steve-conley-call-brief.json +6 -0
- package/skills/churn-prevention/SKILL.md +305 -0
- package/skills/churn-prevention/evals/evals.json +93 -0
- package/skills/churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/skills/churn-prevention/references/dunning-playbook.md +408 -0
- package/skills/claw-compactor/LICENSE +21 -0
- package/skills/claw-compactor/README.md +459 -0
- package/skills/claw-compactor/SKILL.md +329 -0
- package/skills/claw-compactor/benchmark/RESULTS.md +104 -0
- package/skills/claw-compactor/benchmark/__init__.py +1 -0
- package/skills/claw-compactor/benchmark/compressors.py +520 -0
- package/skills/claw-compactor/benchmark/data/sample_01_devops.json +82 -0
- package/skills/claw-compactor/benchmark/data/sample_02_trading.json +54 -0
- package/skills/claw-compactor/benchmark/data/sample_03_ml_short.json +38 -0
- package/skills/claw-compactor/benchmark/data/sample_04_mixed_long.json +318 -0
- package/skills/claw-compactor/benchmark/data/sample_05_sysadmin.json +56 -0
- package/skills/claw-compactor/benchmark/evaluate.py +278 -0
- package/skills/claw-compactor/benchmark/report.py +241 -0
- package/skills/claw-compactor/benchmark/results/benchmark_results.json +405 -0
- package/skills/claw-compactor/benchmark/run_benchmark.py +238 -0
- package/skills/claw-compactor/engram.yaml +49 -0
- package/skills/claw-compactor/proxy/README.md +87 -0
- package/skills/claw-compactor/proxy/dashboard.html +804 -0
- package/skills/claw-compactor/proxy/event-log.mjs +213 -0
- package/skills/claw-compactor/proxy/fair-queue.mjs +288 -0
- package/skills/claw-compactor/proxy/metrics-store.mjs +425 -0
- package/skills/claw-compactor/proxy/package-lock.json +125 -0
- package/skills/claw-compactor/proxy/package.json +15 -0
- package/skills/claw-compactor/proxy/portal.html +360 -0
- package/skills/claw-compactor/proxy/process-registry.mjs +447 -0
- package/skills/claw-compactor/proxy/rate-limiter.mjs +117 -0
- package/skills/claw-compactor/proxy/redis-client.mjs +75 -0
- package/skills/claw-compactor/proxy/retry.mjs +182 -0
- package/skills/claw-compactor/proxy/server.mjs +2100 -0
- package/skills/claw-compactor/proxy/session-affinity.mjs +177 -0
- package/skills/claw-compactor/proxy/start.sh +23 -0
- package/skills/claw-compactor/proxy/test/event-log.test.mjs +237 -0
- package/skills/claw-compactor/proxy/test/helpers.mjs +103 -0
- package/skills/claw-compactor/proxy/test/integration.test.mjs +297 -0
- package/skills/claw-compactor/proxy/test/metrics-store.test.mjs +243 -0
- package/skills/claw-compactor/proxy/test/process-registry.test.mjs +390 -0
- package/skills/claw-compactor/proxy/test/rate-limiter.test.mjs +121 -0
- package/skills/claw-compactor/proxy/test/redis-client.test.mjs +62 -0
- package/skills/claw-compactor/proxy/test/token-tracker.test.mjs +200 -0
- package/skills/claw-compactor/proxy/token-tracker.mjs +482 -0
- package/skills/claw-compactor/pyproject.toml +26 -0
- package/skills/claw-compactor/references/README.md +44 -0
- package/skills/claw-compactor/references/architecture.md +197 -0
- package/skills/claw-compactor/references/benchmarks.md +94 -0
- package/skills/claw-compactor/references/compression-prompts.md +39 -0
- package/skills/claw-compactor/references/compression-techniques.md +219 -0
- package/skills/claw-compactor/references/testing.md +160 -0
- package/skills/claw-compactor/scripts/audit_memory.py +216 -0
- package/skills/claw-compactor/scripts/compress_memory.py +236 -0
- package/skills/claw-compactor/scripts/compressed_context.py +280 -0
- package/skills/claw-compactor/scripts/dedup_memory.py +147 -0
- package/skills/claw-compactor/scripts/dictionary_compress.py +170 -0
- package/skills/claw-compactor/scripts/engram-auto.sh +152 -0
- package/skills/claw-compactor/scripts/engram_auto.py +695 -0
- package/skills/claw-compactor/scripts/engram_cli.py +474 -0
- package/skills/claw-compactor/scripts/estimate_tokens.py +131 -0
- package/skills/claw-compactor/scripts/generate_summary_tiers.py +292 -0
- package/skills/claw-compactor/scripts/lib/__init__.py +34 -0
- package/skills/claw-compactor/scripts/lib/config.py +289 -0
- package/skills/claw-compactor/scripts/lib/dedup.py +119 -0
- package/skills/claw-compactor/scripts/lib/dictionary.py +281 -0
- package/skills/claw-compactor/scripts/lib/engram.py +793 -0
- package/skills/claw-compactor/scripts/lib/engram_prompts.py +175 -0
- package/skills/claw-compactor/scripts/lib/engram_storage.py +254 -0
- package/skills/claw-compactor/scripts/lib/exceptions.py +24 -0
- package/skills/claw-compactor/scripts/lib/markdown.py +312 -0
- package/skills/claw-compactor/scripts/lib/rle.py +165 -0
- package/skills/claw-compactor/scripts/lib/tokenizer_optimizer.py +188 -0
- package/skills/claw-compactor/scripts/lib/tokens.py +68 -0
- package/skills/claw-compactor/scripts/mem_compress.py +788 -0
- package/skills/claw-compactor/scripts/observation_compressor.py +346 -0
- package/skills/claw-compactor/tests/__init__.py +0 -0
- package/skills/claw-compactor/tests/conftest.py +94 -0
- package/skills/claw-compactor/tests/test_audit_comprehensive.py +123 -0
- package/skills/claw-compactor/tests/test_audit_memory.py +67 -0
- package/skills/claw-compactor/tests/test_benchmark.py +122 -0
- package/skills/claw-compactor/tests/test_cli_commands.py +228 -0
- package/skills/claw-compactor/tests/test_compress_memory.py +109 -0
- package/skills/claw-compactor/tests/test_compress_memory_comprehensive.py +191 -0
- package/skills/claw-compactor/tests/test_compressed_context.py +145 -0
- package/skills/claw-compactor/tests/test_config.py +54 -0
- package/skills/claw-compactor/tests/test_dedup_memory.py +124 -0
- package/skills/claw-compactor/tests/test_dictionary.py +327 -0
- package/skills/claw-compactor/tests/test_dictionary_comprehensive.py +241 -0
- package/skills/claw-compactor/tests/test_engram.py +1091 -0
- package/skills/claw-compactor/tests/test_engram_auto.py +529 -0
- package/skills/claw-compactor/tests/test_error_handling.py +194 -0
- package/skills/claw-compactor/tests/test_estimate_tokens.py +99 -0
- package/skills/claw-compactor/tests/test_generate_summary_tiers.py +105 -0
- package/skills/claw-compactor/tests/test_integration.py +249 -0
- package/skills/claw-compactor/tests/test_lib_dedup.py +135 -0
- package/skills/claw-compactor/tests/test_lib_markdown.py +388 -0
- package/skills/claw-compactor/tests/test_lib_tokens.py +82 -0
- package/skills/claw-compactor/tests/test_main_entry.py +176 -0
- package/skills/claw-compactor/tests/test_markdown_advanced.py +284 -0
- package/skills/claw-compactor/tests/test_new_features.py +77 -0
- package/skills/claw-compactor/tests/test_observation_comprehensive.py +261 -0
- package/skills/claw-compactor/tests/test_observation_compressor.py +128 -0
- package/skills/claw-compactor/tests/test_performance.py +172 -0
- package/skills/claw-compactor/tests/test_pipeline.py +109 -0
- package/skills/claw-compactor/tests/test_real_workspace.py +161 -0
- package/skills/claw-compactor/tests/test_rle.py +114 -0
- package/skills/claw-compactor/tests/test_rle_comprehensive.py +151 -0
- package/skills/claw-compactor/tests/test_roundtrip.py +253 -0
- package/skills/claw-compactor/tests/test_roundtrip_comprehensive.py +192 -0
- package/skills/claw-compactor/tests/test_tiers_comprehensive.py +171 -0
- package/skills/claw-compactor/tests/test_token_economics.py +237 -0
- package/skills/claw-compactor/tests/test_tokenizer_optimizer.py +175 -0
- package/skills/claw-compactor/tests/test_tokenizer_optimizer_comprehensive.py +241 -0
- package/skills/claw-compactor/tests/test_tokens.py +27 -0
- package/skills/cmo/CHANGELOG.md +61 -0
- package/skills/cmo/SKILL.md +500 -0
- package/skills/cmo/references/ai-slop-patterns.md +56 -0
- package/skills/cmo/references/analytics-guide.md +152 -0
- package/skills/cmo/references/ideas-library.md +197 -0
- package/skills/cmo/rules/brand-file-map.md +198 -0
- package/skills/cmo/rules/brand-memory.md +158 -0
- package/skills/cmo/rules/cli-runtime-index.md +95 -0
- package/skills/cmo/rules/command-reference.md +167 -0
- package/skills/cmo/rules/communication.md +15 -0
- package/skills/cmo/rules/context-switch.md +101 -0
- package/skills/cmo/rules/ecosystem.md +125 -0
- package/skills/cmo/rules/error-recovery.md +98 -0
- package/skills/cmo/rules/learning-loop.md +170 -0
- package/skills/cmo/rules/monorepo.md +78 -0
- package/skills/cmo/rules/output-format.md +124 -0
- package/skills/cmo/rules/persona.md +15 -0
- package/skills/cmo/rules/playbooks.md +327 -0
- package/skills/cmo/rules/progressive-enhancement.md +231 -0
- package/skills/cmo/rules/publish-index.md +106 -0
- package/skills/cmo/rules/quality-gate.md +90 -0
- package/skills/cmo/rules/recency-grounding.md +124 -0
- package/skills/cmo/rules/safety.md +80 -0
- package/skills/cmo/rules/studio-api-index.md +138 -0
- package/skills/cmo/rules/studio-integration.md +147 -0
- package/skills/cmo/rules/sub-agents.md +167 -0
- package/skills/cold-email/SKILL.md +240 -0
- package/skills/cold-email/evals/evals.json +94 -0
- package/skills/cold-email/references/benchmarks.md +83 -0
- package/skills/cold-email/references/follow-up-sequences.md +81 -0
- package/skills/cold-email/references/frameworks.md +90 -0
- package/skills/cold-email/references/personalization.md +79 -0
- package/skills/cold-email/references/subject-lines.md +53 -0
- package/skills/competitive-intel/SKILL.md +433 -0
- package/skills/competitive-intel/references/competitive-frameworks.md +145 -0
- package/skills/competitor-alternatives/SKILL.md +362 -0
- package/skills/competitor-alternatives/evals/evals.json +93 -0
- package/skills/competitor-alternatives/references/content-architecture.md +271 -0
- package/skills/competitor-alternatives/references/templates.md +223 -0
- package/skills/concreteness-fixer/SKILL.md +483 -0
- package/skills/concreteness-fixer/scripts/validation/concreteness-validator.js +221 -0
- package/skills/concreteness-fixer/utils/execFileNoThrow.js +16 -0
- package/skills/content-atomizer/SKILL.md +424 -0
- package/skills/content-atomizer/references/hook-strategies.md +56 -0
- package/skills/content-atomizer/references/platform-specs.md +118 -0
- package/skills/content-atomizer/references/platforms/bluesky.md +64 -0
- package/skills/content-atomizer/references/platforms/instagram.md +77 -0
- package/skills/content-atomizer/references/platforms/linkedin.md +120 -0
- package/skills/content-atomizer/references/platforms/reddit.md +73 -0
- package/skills/content-atomizer/references/platforms/threads.md +64 -0
- package/skills/content-atomizer/references/platforms/tiktok.md +55 -0
- package/skills/content-atomizer/references/platforms/twitter.md +123 -0
- package/skills/content-atomizer/references/platforms/youtube.md +56 -0
- package/skills/content-atomizer/references/tweet-patterns.md +40 -0
- package/skills/content-repost-manager/SKILL.md +245 -0
- package/skills/content-repost-manager/scripts/content-repost-scan.py +133 -0
- package/skills/context-recovery/.clawdhub/origin.json +7 -0
- package/skills/context-recovery/SKILL.md +198 -0
- package/skills/context-recovery/_meta.json +6 -0
- package/skills/conversion-flow-cro/SKILL.md +248 -0
- package/skills/conversion-flow-cro/references/flow-benchmarks.md +158 -0
- package/skills/copy-editing/SKILL.md +474 -0
- package/skills/copy-editing/evals/evals.json +89 -0
- package/skills/copy-editing/references/plain-english-alternatives.md +394 -0
- package/skills/copywriting/SKILL.md +349 -0
- package/skills/copywriting/evals/evals.json +111 -0
- package/skills/copywriting/references/awareness-level-guide.md +227 -0
- package/skills/copywriting/references/copy-frameworks.md +389 -0
- package/skills/copywriting/references/natural-transitions.md +272 -0
- package/skills/creative/SKILL.md +365 -0
- package/skills/creative/modes/ad-creative.md +1748 -0
- package/skills/creative/modes/product-photo.md +1520 -0
- package/skills/creative/modes/product-video.md +1657 -0
- package/skills/creative/modes/social-graphics.md +1511 -0
- package/skills/creative/modes/talking-head.md +2208 -0
- package/skills/creative/references/VISUAL_INTELLIGENCE.md +1233 -0
- package/skills/deep-serp-article/SKILL.md +677 -0
- package/skills/deep-serp-article/SKILL.md.bak +530 -0
- package/skills/earned-media/SKILL.md +260 -0
- package/skills/email-sequences/SKILL.md +446 -0
- package/skills/email-sequences/references/sequence-templates.md +1217 -0
- package/skills/firecrawl/.skill-meta.json +13 -0
- package/skills/firecrawl/SKILL.md +154 -0
- package/skills/firecrawl/rules/install.md +63 -0
- package/skills/firecrawl/rules/security.md +26 -0
- package/skills/form-cro/SKILL.md +429 -0
- package/skills/form-cro/evals/evals.json +90 -0
- package/skills/free-tool-strategy/SKILL.md +325 -0
- package/skills/free-tool-strategy/evals/evals.json +90 -0
- package/skills/free-tool-strategy/references/tool-types.md +253 -0
- package/skills/frontend-slides/SKILL.md +248 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +347 -0
- package/skills/frontend-slides/animation-patterns.md +110 -0
- package/skills/frontend-slides/html-template.md +347 -0
- package/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/skills/frontend-slides/viewport-base.css +153 -0
- package/skills/guardrail-framework/SKILL.md +319 -0
- package/skills/hook-generator/SKILL.md +438 -0
- package/skills/hook-generator/database/2026-PLATFORM-RESEARCH.md +211 -0
- package/skills/hook-generator/database/instagram-hooks.json +591 -0
- package/skills/hook-generator/database/linkedin-hooks.json +502 -0
- package/skills/hook-generator/database/medium-hooks.json +181 -0
- package/skills/hook-generator/database/tiktok-hooks.json +337 -0
- package/skills/hook-generator/database/twitter-hooks.json +567 -0
- package/skills/hook-generator/database/youtube-hooks.json +275 -0
- package/skills/hook-generator/package-lock.json +24 -0
- package/skills/hook-generator/package.json +5 -0
- package/skills/hook-generator/references/hook-generation-system.md +257 -0
- package/skills/hook-generator/references/hook-performance-analysis.json +153 -0
- package/skills/hook-generator/references/hooks-library.md +128 -0
- package/skills/hook-generator/references/platform-hook-frameworks.md +275 -0
- package/skills/hook-generator/scripts/generate-hooks-unified.js +722 -0
- package/skills/hook-generator/scripts/generate-hooks.js +225 -0
- package/skills/hook-generator/scripts/generate.sh +36 -0
- package/skills/hook-generator/scripts/ralph-hook-enhancer.js +864 -0
- package/skills/hook-generator/scripts/test-gemini-output.js +51 -0
- package/skills/humanizer/README.md +120 -0
- package/skills/humanizer/SKILL.md +699 -0
- package/skills/image-gen/SKILL.md +277 -0
- package/skills/image-gen/references/prompt-patterns.md +114 -0
- package/skills/image-gen/references/visual-metaphors.md +51 -0
- package/skills/impeccable/SKILL.md +86 -0
- package/skills/impeccable/reference/adapt.md +312 -0
- package/skills/impeccable/reference/adapt.native.md +58 -0
- package/skills/impeccable/reference/android.md +40 -0
- package/skills/impeccable/reference/animate.md +86 -0
- package/skills/impeccable/reference/audit.md +136 -0
- package/skills/impeccable/reference/audit.native.md +139 -0
- package/skills/impeccable/reference/bolder.md +31 -0
- package/skills/impeccable/reference/clarify.md +94 -0
- package/skills/impeccable/reference/colorize.md +86 -0
- package/skills/impeccable/reference/craft-floor.md +42 -0
- package/skills/impeccable/reference/craft.md +5 -0
- package/skills/impeccable/reference/critique.md +788 -0
- package/skills/impeccable/reference/degraded/asset-producer.md +90 -0
- package/skills/impeccable/reference/degraded/documenter.md +24 -0
- package/skills/impeccable/reference/degraded/finish-reviewer.md +37 -0
- package/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/skills/impeccable/reference/delight.md +70 -0
- package/skills/impeccable/reference/distill.md +111 -0
- package/skills/impeccable/reference/doctor.md +53 -0
- package/skills/impeccable/reference/document.md +416 -0
- package/skills/impeccable/reference/extract.md +69 -0
- package/skills/impeccable/reference/harden.md +336 -0
- package/skills/impeccable/reference/hooks.md +105 -0
- package/skills/impeccable/reference/init.md +125 -0
- package/skills/impeccable/reference/ios.md +45 -0
- package/skills/impeccable/reference/layout.md +84 -0
- package/skills/impeccable/reference/live-setup.md +102 -0
- package/skills/impeccable/reference/live.md +323 -0
- package/skills/impeccable/reference/new-work.md +110 -0
- package/skills/impeccable/reference/onboard.md +234 -0
- package/skills/impeccable/reference/operate.md +61 -0
- package/skills/impeccable/reference/optimize.md +258 -0
- package/skills/impeccable/reference/overdrive.md +127 -0
- package/skills/impeccable/reference/polish.md +97 -0
- package/skills/impeccable/reference/quieter.md +99 -0
- package/skills/impeccable/reference/routing.md +18 -0
- package/skills/impeccable/reference/shape.md +59 -0
- package/skills/impeccable/reference/typeset.md +80 -0
- package/skills/impeccable/reference/visualize.md +49 -0
- package/skills/impeccable/scripts/command-metadata.json +94 -0
- package/skills/impeccable/scripts/concept-seed.mjs +558 -0
- package/skills/impeccable/scripts/context-signals.mjs +334 -0
- package/skills/impeccable/scripts/context.mjs +1467 -0
- package/skills/impeccable/scripts/critique-storage.mjs +213 -0
- package/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/skills/impeccable/scripts/detect.mjs +21 -0
- package/skills/impeccable/scripts/detector/browser/injected/index.mjs +2023 -0
- package/skills/impeccable/scripts/detector/cli/main.mjs +438 -0
- package/skills/impeccable/scripts/detector/design-system.mjs +1046 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +8283 -0
- package/skills/impeccable/scripts/detector/detect-antipatterns.mjs +50 -0
- package/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +372 -0
- package/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +1168 -0
- package/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +1186 -0
- package/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +264 -0
- package/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/skills/impeccable/scripts/detector/findings.mjs +18 -0
- package/skills/impeccable/scripts/detector/node/file-system.mjs +203 -0
- package/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/skills/impeccable/scripts/detector/registry/antipatterns.mjs +617 -0
- package/skills/impeccable/scripts/detector/rules/checks.mjs +5580 -0
- package/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/skills/impeccable/scripts/detector/shared/constants.mjs +112 -0
- package/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
- package/skills/impeccable/scripts/detector/shared/inline-ignores.mjs +148 -0
- package/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/skills/impeccable/scripts/doctor.mjs +336 -0
- package/skills/impeccable/scripts/embed-prompt.mjs +133 -0
- package/skills/impeccable/scripts/generate-image.mjs +240 -0
- package/skills/impeccable/scripts/hook-admin.mjs +801 -0
- package/skills/impeccable/scripts/hook-before-edit.mjs +508 -0
- package/skills/impeccable/scripts/hook-lib.mjs +2153 -0
- package/skills/impeccable/scripts/hook.mjs +78 -0
- package/skills/impeccable/scripts/lib/artifact-schema.mjs +93 -0
- package/skills/impeccable/scripts/lib/composition-catalog.mjs +200 -0
- package/skills/impeccable/scripts/lib/concept-catalog.mjs +384 -0
- package/skills/impeccable/scripts/lib/design-parser.mjs +925 -0
- package/skills/impeccable/scripts/lib/impeccable-config.mjs +658 -0
- package/skills/impeccable/scripts/lib/impeccable-paths.mjs +137 -0
- package/skills/impeccable/scripts/lib/is-generated.mjs +69 -0
- package/skills/impeccable/scripts/lib/provider.mjs +5 -0
- package/skills/impeccable/scripts/lib/roll-selection.mjs +362 -0
- package/skills/impeccable/scripts/lib/staleness-deep.mjs +478 -0
- package/skills/impeccable/scripts/lib/staleness-notice.mjs +169 -0
- package/skills/impeccable/scripts/lib/staleness.mjs +457 -0
- package/skills/impeccable/scripts/lib/surface-briefs.mjs +151 -0
- package/skills/impeccable/scripts/lib/target-args.mjs +42 -0
- package/skills/impeccable/scripts/lib/target-slug.mjs +33 -0
- package/skills/impeccable/scripts/lib/template-extensions.mjs +146 -0
- package/skills/impeccable/scripts/live/accept-css.mjs +617 -0
- package/skills/impeccable/scripts/live/accept-verify.mjs +60 -0
- package/skills/impeccable/scripts/live/browser-script-parts.mjs +55 -0
- package/skills/impeccable/scripts/live/completion.mjs +28 -0
- package/skills/impeccable/scripts/live/event-validation.mjs +199 -0
- package/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
- package/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +73 -0
- package/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
- package/skills/impeccable/scripts/live/frameworks/journal.mjs +197 -0
- package/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
- package/skills/impeccable/scripts/live/frameworks/nuxt.mjs +161 -0
- package/skills/impeccable/scripts/live/frameworks/script-src.mjs +17 -0
- package/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
- package/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
- package/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
- package/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
- package/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
- package/skills/impeccable/scripts/live/generation-preflight.mjs +149 -0
- package/skills/impeccable/scripts/live/insert-ui.mjs +458 -0
- package/skills/impeccable/scripts/live/instructions.mjs +142 -0
- package/skills/impeccable/scripts/live/manual-apply.mjs +939 -0
- package/skills/impeccable/scripts/live/manual-edit-routes.mjs +357 -0
- package/skills/impeccable/scripts/live/manual-edits-buffer.mjs +152 -0
- package/skills/impeccable/scripts/live/poll-lanes.mjs +14 -0
- package/skills/impeccable/scripts/live/roots.mjs +508 -0
- package/skills/impeccable/scripts/live/session-store.mjs +563 -0
- package/skills/impeccable/scripts/live/source-lock.mjs +105 -0
- package/skills/impeccable/scripts/live/source-search.mjs +105 -0
- package/skills/impeccable/scripts/live/svelte-ast.mjs +961 -0
- package/skills/impeccable/scripts/live/svelte-component.mjs +1342 -0
- package/skills/impeccable/scripts/live/sveltekit-adapter.mjs +316 -0
- package/skills/impeccable/scripts/live/tanstack-adapter.mjs +280 -0
- package/skills/impeccable/scripts/live/ui-core.mjs +180 -0
- package/skills/impeccable/scripts/live/vocabulary.mjs +171 -0
- package/skills/impeccable/scripts/live-accept.mjs +954 -0
- package/skills/impeccable/scripts/live-browser-dom.js +146 -0
- package/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/skills/impeccable/scripts/live-browser.js +12520 -0
- package/skills/impeccable/scripts/live-commit-manual-edits.mjs +1244 -0
- package/skills/impeccable/scripts/live-complete.mjs +107 -0
- package/skills/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/skills/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/skills/impeccable/scripts/live-inject.mjs +503 -0
- package/skills/impeccable/scripts/live-insert.mjs +292 -0
- package/skills/impeccable/scripts/live-manual-edit-evidence.mjs +368 -0
- package/skills/impeccable/scripts/live-poll.mjs +429 -0
- package/skills/impeccable/scripts/live-resume.mjs +123 -0
- package/skills/impeccable/scripts/live-server.mjs +1669 -0
- package/skills/impeccable/scripts/live-status.mjs +71 -0
- package/skills/impeccable/scripts/live-target.mjs +30 -0
- package/skills/impeccable/scripts/live-wrap.mjs +927 -0
- package/skills/impeccable/scripts/live.mjs +359 -0
- package/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/impeccable/scripts/palette.mjs +628 -0
- package/skills/impeccable/scripts/pin.mjs +221 -0
- package/skills/impeccable/scripts/serve-question.mjs +932 -0
- package/skills/impeccable/scripts/surface-brief.mjs +74 -0
- package/skills/inkstone-admin/SKILL.md +66 -0
- package/skills/jev-hook-gate/SKILL.md +111 -0
- package/skills/keyword-research/SKILL.md +503 -0
- package/skills/keyword-research/references/dr-cap-and-confidence.md +62 -0
- package/skills/keyword-research/references/keyword-examples.md +769 -0
- package/skills/landing-page-architect/SKILL.md +585 -0
- package/skills/landing-page-architect/references/architecture-reference.md +32 -0
- package/skills/launch-strategy/SKILL.md +384 -0
- package/skills/launch-strategy/evals/evals.json +91 -0
- package/skills/launch-strategy/references/launch-checklist.md +209 -0
- package/skills/launch-strategy/references/launch-timeline.md +159 -0
- package/skills/lead-email-craft/SKILL.md +522 -0
- package/skills/lead-magnets/SKILL.md +310 -0
- package/skills/lead-magnets/references/benchmarks.md +129 -0
- package/skills/lead-magnets/references/format-guide.md +196 -0
- package/skills/link-building-seo/SKILL.md +210 -0
- package/skills/lint-report.txt +1 -0
- package/skills/manifest.json +129 -0
- package/skills/marketing-demo/SKILL.md +249 -0
- package/skills/marketing-demo/references/remotion-examples.md +281 -0
- package/skills/marketing-ideas/SKILL.md +167 -0
- package/skills/marketing-ideas/evals/evals.json +90 -0
- package/skills/marketing-ideas/references/ideas-by-category.md +366 -0
- package/skills/marketing-psychology/SKILL.md +374 -0
- package/skills/marketing-psychology/evals/evals.json +88 -0
- package/skills/marketing-psychology/references/case-studies.md +148 -0
- package/skills/narrative-research-article/SKILL.md +469 -0
- package/skills/narrative-research-article/references/lanusse-patterns.md +166 -0
- package/skills/notebooklm/SKILL.md +674 -0
- package/skills/off-page-seo/SKILL.md +219 -0
- package/skills/onboarding-cro/SKILL.md +220 -0
- package/skills/onboarding-cro/evals/evals.json +92 -0
- package/skills/onboarding-cro/references/experiments.md +258 -0
- package/skills/original-research/SKILL.md +388 -0
- package/skills/page-cro/SKILL.md +269 -0
- package/skills/page-cro/references/cro-benchmarks.md +140 -0
- package/skills/paper-marketing/SKILL.md +448 -0
- package/skills/paper-marketing/references/agent-quality-rubric.md +68 -0
- package/skills/paper-marketing/references/brand-system-template.md +120 -0
- package/skills/paper-marketing/references/paper-mcp-rules.md +71 -0
- package/skills/paper-marketing/references/platform-conventions.md +43 -0
- package/skills/paywall-upgrade-cro/SKILL.md +227 -0
- package/skills/paywall-upgrade-cro/evals/evals.json +93 -0
- package/skills/paywall-upgrade-cro/references/experiments.md +164 -0
- package/skills/platform-formatting/SKILL.md +51 -0
- package/skills/popup-cro/SKILL.md +454 -0
- package/skills/popup-cro/evals/evals.json +94 -0
- package/skills/positioning-angles/SKILL.md +524 -0
- package/skills/positioning-angles/references/ad-matrix-and-examples.md +176 -0
- package/skills/positioning-angles/references/angle-frameworks.md +187 -0
- package/skills/positioning-angles/references/dunford-positioning.md +135 -0
- package/skills/positioning-angles/references/hormozi-offer.md +247 -0
- package/skills/positioning-angles/references/schwartz-sophistication.md +166 -0
- package/skills/positioning-angles/references/unique-mechanism.md +162 -0
- package/skills/pricing-strategy/SKILL.md +346 -0
- package/skills/pricing-strategy/evals/evals.json +90 -0
- package/skills/pricing-strategy/references/research-methods.md +152 -0
- package/skills/pricing-strategy/references/tier-structure.md +307 -0
- package/skills/programmatic-seo/SKILL.md +238 -0
- package/skills/programmatic-seo/evals/evals.json +94 -0
- package/skills/programmatic-seo/references/playbooks.md +308 -0
- package/skills/project-rag/SKILL.md +127 -0
- package/skills/quality-gate/SKILL.md +519 -0
- package/skills/quality-gate/judge-personas/buyer.md +47 -0
- package/skills/quality-gate/judge-personas/expert.md +47 -0
- package/skills/quality-gate/judge-personas/outsider.md +47 -0
- package/skills/quality-gate/judge-personas/scanner.md +41 -0
- package/skills/quality-gate/judge-personas/skeptic.md +40 -0
- package/skills/referral-program/SKILL.md +290 -0
- package/skills/referral-program/evals/evals.json +89 -0
- package/skills/referral-program/references/affiliate-programs.md +163 -0
- package/skills/referral-program/references/program-examples.md +143 -0
- package/skills/review-sites/SKILL.md +279 -0
- package/skills/revops/SKILL.md +343 -0
- package/skills/revops/evals/evals.json +91 -0
- package/skills/revops/references/automation-playbooks.md +290 -0
- package/skills/revops/references/lifecycle-definitions.md +278 -0
- package/skills/revops/references/routing-rules.md +203 -0
- package/skills/revops/references/scoring-models.md +247 -0
- package/skills/saas-product-seo/SKILL.md +324 -0
- package/skills/sales-enablement/SKILL.md +349 -0
- package/skills/sales-enablement/evals/evals.json +91 -0
- package/skills/sales-enablement/references/deck-frameworks.md +263 -0
- package/skills/sales-enablement/references/demo-scripts.md +355 -0
- package/skills/sales-enablement/references/objection-library.md +270 -0
- package/skills/sales-enablement/references/one-pager-templates.md +208 -0
- package/skills/schema-markup/SKILL.md +179 -0
- package/skills/schema-markup/evals/evals.json +87 -0
- package/skills/schema-markup/references/schema-examples.md +398 -0
- package/skills/self-improve/SKILL.md +166 -0
- package/skills/self-improving-agent/README.md +243 -0
- package/skills/self-improving-agent/SKILL.md +437 -0
- package/skills/self-improving-agent/scripts/__init__.py +16 -0
- package/skills/self-improving-agent/scripts/__pycache__/auto_detect.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/__pycache__/nlm_curation.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/__pycache__/self_improving_agent.cpython-314.pyc +0 -0
- package/skills/self-improving-agent/scripts/auto_detect.py +270 -0
- package/skills/self-improving-agent/scripts/init_expertise_registry.py +89 -0
- package/skills/self-improving-agent/scripts/nlm_curation.py +259 -0
- package/skills/self-improving-agent/scripts/self-improving-agent +113 -0
- package/skills/self-improving-agent/scripts/self_improving_agent.py +603 -0
- package/skills/self-improving-agent/scripts/test_curation_scorer.py +20 -0
- package/skills/self-improving-agent/scripts/test_self_improving.py +184 -0
- package/skills/send-email/SKILL.md +426 -0
- package/skills/send-email/references/batch-email-examples.md +807 -0
- package/skills/send-email/references/best-practices.md +453 -0
- package/skills/send-email/references/installation.md +123 -0
- package/skills/send-email/references/single-email-examples.md +470 -0
- package/skills/send-email/references/webhooks.md +221 -0
- package/skills/seo-audit/SKILL.md +362 -0
- package/skills/seo-audit/references/ai-writing-detection.md +200 -0
- package/skills/seo-audit/references/architecture-patterns.md +271 -0
- package/skills/seo-audit/references/schema-templates.md +427 -0
- package/skills/seo-content/SKILL.md +510 -0
- package/skills/seo-content/references/anti-ai-detection.md +184 -0
- package/skills/seo-content/references/content-structures.md +148 -0
- package/skills/seo-content/references/eeat-examples.md +235 -0
- package/skills/seo-content/references/on-page-seo.md +261 -0
- package/skills/seo-content/references/pseo-playbooks.md +226 -0
- package/skills/seo-content/references/schema-templates.md +104 -0
- package/skills/seo-content/references/serp-analysis-format.md +151 -0
- package/skills/seo-machine/SKILL.md +331 -0
- package/skills/seo-machine/assets/brand-template.md +73 -0
- package/skills/seo-machine/assets/link-inventory-template.md +74 -0
- package/skills/seo-machine/assets/roadmap-template.md +184 -0
- package/skills/seo-machine/references/api-stack-recipes.md +230 -0
- package/skills/seo-machine/references/exa-recipes.md +260 -0
- package/skills/seo-machine/references/manual-research.md +73 -0
- package/skills/seo-machine/references/methodology.md +87 -0
- package/skills/seo-machine/references/off-page.md +123 -0
- package/skills/seo-machine/references/patterns/alternatives.md +176 -0
- package/skills/seo-machine/references/patterns/compare.md +105 -0
- package/skills/seo-machine/references/patterns/playbooks.md +106 -0
- package/skills/seo-machine/references/patterns/use-case.md +109 -0
- package/skills/seo-machine/references/quality-bars.md +99 -0
- package/skills/seo-machine/references/stacks/astro.md +156 -0
- package/skills/seo-machine/references/stacks/detection.md +61 -0
- package/skills/seo-machine/references/stacks/markdown-fallback.md +181 -0
- package/skills/seo-machine/references/stacks/nextjs.md +108 -0
- package/skills/seo-machine/references/stacks/rails-inertia.md +99 -0
- package/skills/seo-machine/references/striking-distance.md +116 -0
- package/skills/seo-machine/references/technical-audit.md +153 -0
- package/skills/seo-machine/scripts/link_audit.py +265 -0
- package/skills/seo-machine/scripts/tech_audit.py +221 -0
- package/skills/seo-machine/scripts/word_count.py +154 -0
- package/skills/sharp-thesis-validator/SKILL.md +393 -0
- package/skills/sharp-thesis-validator/examples.md +186 -0
- package/skills/signup-flow-cro/SKILL.md +359 -0
- package/skills/signup-flow-cro/evals/evals.json +88 -0
- package/skills/site-architecture/SKILL.md +357 -0
- package/skills/site-architecture/evals/evals.json +88 -0
- package/skills/site-architecture/references/mermaid-templates.md +216 -0
- package/skills/site-architecture/references/navigation-patterns.md +305 -0
- package/skills/site-architecture/references/site-type-templates.md +293 -0
- package/skills/skill-self-improvement/SKILL.md +151 -0
- package/skills/slideshow-script/SKILL.md +274 -0
- package/skills/slideshow-script/references/content-spec-schema.md +77 -0
- package/skills/slideshow-script/references/frameworks.md +84 -0
- package/skills/slideshow-script/references/paips-framework.md +37 -0
- package/skills/social-campaign/SKILL.md +419 -0
- package/skills/social-campaign/references/paper-mcp-workflow.md +48 -0
- package/skills/social-content/SKILL.md +359 -0
- package/skills/social-content/evals/evals.json +92 -0
- package/skills/social-content/references/platforms.md +170 -0
- package/skills/social-content/references/post-templates.md +177 -0
- package/skills/social-content/references/reverse-engineering.md +195 -0
- package/skills/social-worker/SKILL.md +204 -0
- package/skills/startup-launcher/SKILL.md +252 -0
- package/skills/startup-launcher/references/file-router.md +64 -0
- package/skills/startup-launcher/references/platform-matrix.md +65 -0
- package/skills/startup-launcher/references/platforms/alternativeto.md +283 -0
- package/skills/startup-launcher/references/platforms/appsumo.md +495 -0
- package/skills/startup-launcher/references/platforms/auraplusplus.md +736 -0
- package/skills/startup-launcher/references/platforms/betalist.md +98 -0
- package/skills/startup-launcher/references/platforms/capterra.md +276 -0
- package/skills/startup-launcher/references/platforms/crunchbase.md +514 -0
- package/skills/startup-launcher/references/platforms/dealify.md +291 -0
- package/skills/startup-launcher/references/platforms/dealmirror.md +313 -0
- package/skills/startup-launcher/references/platforms/desifounder.md +490 -0
- package/skills/startup-launcher/references/platforms/devhunt.md +210 -0
- package/skills/startup-launcher/references/platforms/devpost.md +448 -0
- package/skills/startup-launcher/references/platforms/fazier.md +56 -0
- package/skills/startup-launcher/references/platforms/firsto.md +489 -0
- package/skills/startup-launcher/references/platforms/g2.md +226 -0
- package/skills/startup-launcher/references/platforms/hackernews.md +99 -0
- package/skills/startup-launcher/references/platforms/hackernoon.md +385 -0
- package/skills/startup-launcher/references/platforms/indiedeals.md +367 -0
- package/skills/startup-launcher/references/platforms/indiehackers.md +80 -0
- package/skills/startup-launcher/references/platforms/kenmoo.md +231 -0
- package/skills/startup-launcher/references/platforms/labstartups.md +618 -0
- package/skills/startup-launcher/references/platforms/launchboard.md +307 -0
- package/skills/startup-launcher/references/platforms/launchfast.md +560 -0
- package/skills/startup-launcher/references/platforms/launchigniter.md +56 -0
- package/skills/startup-launcher/references/platforms/launchingnext.md +674 -0
- package/skills/startup-launcher/references/platforms/launchit.md +574 -0
- package/skills/startup-launcher/references/platforms/launchyourapp.md +677 -0
- package/skills/startup-launcher/references/platforms/libhunt.md +220 -0
- package/skills/startup-launcher/references/platforms/ltdhunt.md +221 -0
- package/skills/startup-launcher/references/platforms/microlaunch.md +45 -0
- package/skills/startup-launcher/references/platforms/openalternative.md +195 -0
- package/skills/startup-launcher/references/platforms/peerlist.md +56 -0
- package/skills/startup-launcher/references/platforms/peerpush.md +64 -0
- package/skills/startup-launcher/references/platforms/primeclub.md +282 -0
- package/skills/startup-launcher/references/platforms/productcanyon.md +190 -0
- package/skills/startup-launcher/references/platforms/producthunt.md +98 -0
- package/skills/startup-launcher/references/platforms/rankinpublic.md +315 -0
- package/skills/startup-launcher/references/platforms/rockethub.md +374 -0
- package/skills/startup-launcher/references/platforms/saasgenius.md +175 -0
- package/skills/startup-launcher/references/platforms/saashub.md +205 -0
- package/skills/startup-launcher/references/platforms/saasmantra.md +221 -0
- package/skills/startup-launcher/references/platforms/saaspirate.md +287 -0
- package/skills/startup-launcher/references/platforms/saaswarrior.md +190 -0
- package/skills/startup-launcher/references/platforms/saaszilla.md +194 -0
- package/skills/startup-launcher/references/platforms/selected.md +925 -0
- package/skills/startup-launcher/references/platforms/sideprojectors.md +86 -0
- package/skills/startup-launcher/references/platforms/softonic.md +240 -0
- package/skills/startup-launcher/references/platforms/sourceforge.md +251 -0
- package/skills/startup-launcher/references/platforms/stacksocial.md +244 -0
- package/skills/startup-launcher/references/platforms/startupstash.md +326 -0
- package/skills/startup-launcher/references/platforms/theresanaiforthat.md +253 -0
- package/skills/startup-launcher/references/platforms/tinylaunch.md +70 -0
- package/skills/startup-launcher/references/platforms/tinystartups.md +72 -0
- package/skills/startup-launcher/references/platforms/toolfolio.md +291 -0
- package/skills/startup-launcher/references/platforms/trustmrr.md +194 -0
- package/skills/startup-launcher/references/platforms/trylaunch.md +531 -0
- package/skills/startup-launcher/references/platforms/uneed.md +57 -0
- package/skills/startup-launcher/references/templates/asset-checklist.md +218 -0
- package/skills/startup-launcher/references/templates/launch-tracker.md +195 -0
- package/skills/startup-launcher/references/templates/product-brief.md +98 -0
- package/skills/summarize/.skill-meta.json +13 -0
- package/skills/summarize/SKILL.md +170 -0
- package/skills/summarize/rules/install.md +157 -0
- package/skills/summarize/rules/usage.md +207 -0
- package/skills/topical-authority/SKILL.md +307 -0
- package/skills/topical-authority/references/jake-ward-framework.md +201 -0
- package/skills/topical-authority/references/serp-clustering-algorithm.md +325 -0
- package/skills/topical-authority/scripts/orchestrator.js +367 -0
- package/skills/topical-authority/scripts/seo/analyze-competitor-coverage.js +3 -0
- package/skills/topical-authority/scripts/seo/audit-internal-links.js +3 -0
- package/skills/topical-authority/scripts/seo/build-clusters-from-serp.js +3 -0
- package/skills/topical-authority/scripts/seo/extract-keywords-from-forums.js +3 -0
- package/skills/topical-authority/scripts/seo/extract-paa-questions.js +3 -0
- package/skills/topical-authority/scripts/seo/fetch-serp-urls.js +3 -0
- package/skills/topical-authority/scripts/seo/gemini-serp-clustering.js +3 -0
- package/skills/topical-authority/scripts/seo/identify-content-gaps.js +3 -0
- package/skills/topical-authority/scripts/seo/identify-research-gaps.js +3 -0
- package/skills/topical-authority/scripts/seo/scrape-quora-questions.js +3 -0
- package/skills/topical-authority/scripts/seo/scrape-reddit-pain-points.js +3 -0
- package/skills/topical-authority/scripts/seo/weave-internal-links.js +3 -0
- package/skills/visual-style/SKILL.md +199 -0
- package/skills/voice-brand-alignment/SKILL.md +70 -0
- package/skills/voice-brand-alignment/references/ai-slop-patterns.md +405 -0
- package/skills/voice-brand-alignment/scripts/validation/gemini-voice-validator.js +96 -0
- package/skills/voice-extraction/SKILL.md +234 -0
- package/skills/voice-extraction/references/extraction-prompt.md +155 -0
- package/skills/voice-extraction/references/voice-dna-template.md +168 -0
- package/skills/voice-extraction/references/voice-elements.md +259 -0
- package/skills/voice-extraction/scripts/build-corpus.js +120 -0
- package/skills/voice-extraction/scripts/collect-sources.sh +168 -0
- package/skills/warm-outbound/SKILL.md +299 -0
- package/skills/warm-outbound/templates/warm-message.md +39 -0
- package/skills/weekly-newsletter-digest/SKILL.md +78 -0
- package/skills/x-playwriter/SKILL.md +428 -0
- package/skills/x-playwriter/scripts/x-browser.js +185 -0
- package/skills/x-post-generator-openclaw/SKILL.md +138 -0
- package/skills/x-post-generator-openclaw/scripts/generate-x-post.js +537 -0
- package/skills/x-posting-playwriter/SKILL.md +203 -0
- package/skills/x-research/SKILL.md +129 -0
- package/skills/x-research/x-research.sh +85 -0
- package/skills/youtube-summarize/SKILL.md +90 -0
- package/skills/youtube-summarize/scripts/youtube-summarize.sh +143 -0
- package/src/cli.js +349 -172
- package/src/harness/deepseek-adapter.js +102 -0
- package/src/harness/deepseek.js +225 -0
- package/src/harness/opencode-adapter.js +174 -0
- package/src/harness/pi-adapter.js +172 -0
- package/src/harness/registry.js +121 -0
- package/src/harness/telemetry.js +102 -0
- package/src/harness/types.js +165 -0
- package/src/interview.js +36 -4
- package/src/postinstall.js +10 -12
- package/templates/AGENTS.md +17 -17
- package/templates/ORG.md +1 -1
- package/templates/TOOLS.md +7 -2
- package/templates/opencode.json +26 -29
- package/wiki/doctor.md +54 -0
- package/wiki/inkstone.md +4 -4
- package/wiki/opencode.md +3 -3
- package/skills/curated.txt +0 -68
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* registry — adapter registry + selection policy.
|
|
3
|
+
*
|
|
4
|
+
* Selection policy (Phase 1):
|
|
5
|
+
* 1. Explicit `task.preferred` wins if that adapter is ready.
|
|
6
|
+
* 2. Capability-matched: tasks requiring tools/files go to tool-capable adapters.
|
|
7
|
+
* 3. Cost-optimized: among ready adapters that satisfy capabilities, pick the
|
|
8
|
+
* lowest blended cost per task (local opencode = $0 API cost, so it usually
|
|
9
|
+
* wins on cost; DeepSeek wins when opencode is unavailable or policy pins it).
|
|
10
|
+
*
|
|
11
|
+
* The persisted default lives in ~/.huckleberry/harness.json ("default": "<id>").
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
|
|
14
|
+
import { join, dirname } from "node:path";
|
|
15
|
+
import { OpenCodeAdapter } from "./opencode-adapter.js";
|
|
16
|
+
import { DeepSeekAdapter } from "./deepseek-adapter.js";
|
|
17
|
+
import { PiAdapter } from "./pi-adapter.js";
|
|
18
|
+
|
|
19
|
+
/** @type {Map<string, import("./types.js").HarnessAdapter>} */
|
|
20
|
+
const adapters = new Map();
|
|
21
|
+
|
|
22
|
+
export function register(adapter) {
|
|
23
|
+
adapters.set(adapter.id, adapter);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Built-in adapters, registered once at import. */
|
|
27
|
+
register(new OpenCodeAdapter());
|
|
28
|
+
register(new DeepSeekAdapter());
|
|
29
|
+
register(new PiAdapter());
|
|
30
|
+
|
|
31
|
+
/** @returns {string[]} registered adapter ids in registration order */
|
|
32
|
+
export function listIds() {
|
|
33
|
+
return [...adapters.keys()];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function get(id) {
|
|
37
|
+
return adapters.get(id) || null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Read the persisted default adapter id.
|
|
42
|
+
* @param {string} [home] state root (defaults to process HOME / sandbox HOME via caller)
|
|
43
|
+
* @returns {string|null}
|
|
44
|
+
*/
|
|
45
|
+
export function loadDefault(home) {
|
|
46
|
+
const p = harnessConfigPath(home);
|
|
47
|
+
if (!existsSync(p)) return null;
|
|
48
|
+
try {
|
|
49
|
+
const j = JSON.parse(readFileSync(p, "utf8"));
|
|
50
|
+
return j.default || null;
|
|
51
|
+
} catch { return null; }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Persist the default adapter id.
|
|
56
|
+
* @param {string} id
|
|
57
|
+
* @param {string} [home]
|
|
58
|
+
*/
|
|
59
|
+
export function saveDefault(id, home) {
|
|
60
|
+
if (!adapters.has(id)) throw new Error(`unknown adapter: ${id} (available: ${listIds().join(", ")})`);
|
|
61
|
+
const p = harnessConfigPath(home);
|
|
62
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
63
|
+
writeFileSync(p, JSON.stringify({ default: id, updatedAt: new Date().toISOString() }, null, 2));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function harnessConfigPath(home) {
|
|
67
|
+
const h = home || process.env.HUCKLEBERRY_HOME || process.env.HOME || "";
|
|
68
|
+
return join(h, ".huckleberry", "harness.json");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Selection policy. See module doc for the ordering.
|
|
73
|
+
* @param {import("./types.js").TaskRequest & {preferred?:string}} task
|
|
74
|
+
* @param {string|null} [defaultId] persisted default (harness.json)
|
|
75
|
+
* @returns {Promise<{adapter: import("./types.js").HarnessAdapter, why: string}>}
|
|
76
|
+
*/
|
|
77
|
+
export async function selectAdapter(task = {}, defaultId = null) {
|
|
78
|
+
const candidates = [];
|
|
79
|
+
// 1. explicit preference
|
|
80
|
+
if (task.preferred && adapters.has(task.preferred)) candidates.push([task.preferred, "explicit task preference"]);
|
|
81
|
+
if (defaultId && adapters.has(defaultId)) candidates.push([defaultId, "persisted default (harness set)"]);
|
|
82
|
+
// fallback order: cost-optimized (deepseek), then lean local agent (pi), then local default
|
|
83
|
+
candidates.push(["deepseek", "cost-optimized fallback"]);
|
|
84
|
+
candidates.push(["pi", "lean cold-start fallback"]);
|
|
85
|
+
candidates.push(["opencode", "local default fallback"]);
|
|
86
|
+
|
|
87
|
+
const needTools = task.requireTools === true;
|
|
88
|
+
for (const [id, why] of candidates) {
|
|
89
|
+
const a = adapters.get(id);
|
|
90
|
+
if (!a) continue;
|
|
91
|
+
const caps = a.capabilities();
|
|
92
|
+
if (needTools && !caps.tools) continue; // capability-matched gate
|
|
93
|
+
const st = await a.status();
|
|
94
|
+
if (st.ready) return { adapter: a, why };
|
|
95
|
+
}
|
|
96
|
+
throw new Error("no ready adapter — install opencode or set DEEPSEEK_API_KEY");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Table row data for `huckleberry harness list`.
|
|
101
|
+
* @param {string} [home]
|
|
102
|
+
*/
|
|
103
|
+
export async function describeAdapters(home) {
|
|
104
|
+
const defaultId = loadDefault(home);
|
|
105
|
+
const rows = [];
|
|
106
|
+
for (const id of listIds()) {
|
|
107
|
+
const a = adapters.get(id);
|
|
108
|
+
const st = await a.status();
|
|
109
|
+
const caps = a.capabilities();
|
|
110
|
+
rows.push({
|
|
111
|
+
id,
|
|
112
|
+
label: a.label,
|
|
113
|
+
ready: st.ready,
|
|
114
|
+
reason: st.reason || null,
|
|
115
|
+
detail: st.detail || null,
|
|
116
|
+
caps,
|
|
117
|
+
isDefault: id === defaultId,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return { rows, defaultId };
|
|
121
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry — per-task token + cost recording as JSON lines.
|
|
3
|
+
*
|
|
4
|
+
* One JSONL file per harness run: tests/baseline/telemetry-<runId>.jsonl
|
|
5
|
+
* Each line: { ts, runId, taskId, adapterId, model, status, usage, costUsd, durationMs }
|
|
6
|
+
* Append-only; a run summary is written next to it on close (see writeSummary).
|
|
7
|
+
*/
|
|
8
|
+
import { appendFileSync, writeFileSync, mkdirSync, readFileSync, existsSync } from "node:fs";
|
|
9
|
+
import { join, dirname } from "node:path";
|
|
10
|
+
|
|
11
|
+
export class Telemetry {
|
|
12
|
+
/**
|
|
13
|
+
* @param {string} filePath absolute path of the JSONL output
|
|
14
|
+
* @param {string} runId
|
|
15
|
+
*/
|
|
16
|
+
constructor(filePath, runId) {
|
|
17
|
+
this.filePath = filePath;
|
|
18
|
+
this.runId = runId;
|
|
19
|
+
this.records = [];
|
|
20
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
21
|
+
// header line makes each file self-describing
|
|
22
|
+
appendFileSync(filePath, JSON.stringify({
|
|
23
|
+
ts: new Date().toISOString(),
|
|
24
|
+
runId,
|
|
25
|
+
event: "run-start",
|
|
26
|
+
}) + "\n");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Record one task result.
|
|
31
|
+
* @param {{taskId:string, adapterId:string, model?:string, status:string,
|
|
32
|
+
* usage:{input:number, output:number, cacheHit?:number, cacheMiss?:number},
|
|
33
|
+
* costUsd:number, durationMs:number, error?:string}} r
|
|
34
|
+
*/
|
|
35
|
+
record(r) {
|
|
36
|
+
const line = {
|
|
37
|
+
ts: new Date().toISOString(),
|
|
38
|
+
runId: this.runId,
|
|
39
|
+
taskId: r.taskId,
|
|
40
|
+
adapterId: r.adapterId,
|
|
41
|
+
model: r.model || null,
|
|
42
|
+
status: r.status,
|
|
43
|
+
usage: {
|
|
44
|
+
input: r.usage?.input || 0,
|
|
45
|
+
output: r.usage?.output || 0,
|
|
46
|
+
cacheHit: r.usage?.cacheHit ?? null,
|
|
47
|
+
cacheMiss: r.usage?.cacheMiss ?? null,
|
|
48
|
+
},
|
|
49
|
+
costUsd: Math.round((r.costUsd || 0) * 1e6) / 1e6,
|
|
50
|
+
durationMs: r.durationMs || 0,
|
|
51
|
+
};
|
|
52
|
+
if (r.error) line.error = r.error;
|
|
53
|
+
this.records.push(line);
|
|
54
|
+
appendFileSync(this.filePath, JSON.stringify(line) + "\n");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Write a run summary JSON alongside the JSONL and return it.
|
|
59
|
+
* @returns {{runId:string, telemetryFile:string, tasks:number, ok:number, failed:number,
|
|
60
|
+
* tokensIn:number, tokensOut:number, costUsd:number, byAdapter:Object}}
|
|
61
|
+
*/
|
|
62
|
+
writeSummary() {
|
|
63
|
+
const byAdapter = {};
|
|
64
|
+
for (const r of this.records) {
|
|
65
|
+
const a = (byAdapter[r.adapterId] ||= { tasks: 0, ok: 0, failed: 0, tokensIn: 0, tokensOut: 0, costUsd: 0 });
|
|
66
|
+
a.tasks++;
|
|
67
|
+
if (r.status === "ok") a.ok++; else a.failed++;
|
|
68
|
+
a.tokensIn += r.usage.input;
|
|
69
|
+
a.tokensOut += r.usage.output;
|
|
70
|
+
a.costUsd = Math.round((a.costUsd + r.costUsd) * 1e6) / 1e6;
|
|
71
|
+
}
|
|
72
|
+
const summary = {
|
|
73
|
+
runId: this.runId,
|
|
74
|
+
finishedAt: new Date().toISOString(),
|
|
75
|
+
telemetryFile: this.filePath,
|
|
76
|
+
tasks: this.records.length,
|
|
77
|
+
ok: this.records.filter(r => r.status === "ok").length,
|
|
78
|
+
failed: this.records.filter(r => r.status !== "ok").length,
|
|
79
|
+
tokensIn: this.records.reduce((s, r) => s + r.usage.input, 0),
|
|
80
|
+
tokensOut: this.records.reduce((s, r) => s + r.usage.output, 0),
|
|
81
|
+
costUsd: Math.round(this.records.reduce((s, r) => s + r.costUsd, 0) * 1e6) / 1e6,
|
|
82
|
+
byAdapter,
|
|
83
|
+
};
|
|
84
|
+
const summaryPath = this.filePath.replace(/\.jsonl$/, "-summary.json");
|
|
85
|
+
writeFileSync(summaryPath, JSON.stringify(summary, null, 2));
|
|
86
|
+
return summary;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Read back a telemetry JSONL file (used by comparison tooling).
|
|
92
|
+
* @param {string} filePath
|
|
93
|
+
* @returns {Array<Object>}
|
|
94
|
+
*/
|
|
95
|
+
export function readTelemetry(filePath) {
|
|
96
|
+
if (!existsSync(filePath)) return [];
|
|
97
|
+
return readFileSync(filePath, "utf8")
|
|
98
|
+
.split("\n")
|
|
99
|
+
.filter(l => l.trim())
|
|
100
|
+
.map(l => { try { return JSON.parse(l); } catch { return null; } })
|
|
101
|
+
.filter(Boolean);
|
|
102
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HarnessAdapter — the contract every execution harness implements.
|
|
3
|
+
*
|
|
4
|
+
* A "harness" is the thing that actually runs an agent task: the default is the
|
|
5
|
+
* local `opencode` CLI (existing behavior); alternatives route the same task to a
|
|
6
|
+
* different engine (e.g. the DeepSeek API) so cost/capability can be traded off
|
|
7
|
+
* per task. The interface is deliberately plain JSDoc so the repo stays build-free.
|
|
8
|
+
*
|
|
9
|
+
* Implementations live alongside this file (`opencode-adapter.js`,
|
|
10
|
+
* `deepseek-adapter.js`) and are registered in `registry.js`.
|
|
11
|
+
*
|
|
12
|
+
* @typedef {Object} TaskRequest
|
|
13
|
+
* @property {string} id Stable task id (e.g. golden task id).
|
|
14
|
+
* @property {string} prompt The instruction to run.
|
|
15
|
+
* @property {string} [cwd] Working directory the task should operate in.
|
|
16
|
+
* @property {string} [agent] Named agent for engines that support it (opencode).
|
|
17
|
+
* @property {string} [model] Model id override.
|
|
18
|
+
* @property {number} [maxTokens] Output token cap.
|
|
19
|
+
* @property {string} [system] Optional system prompt.
|
|
20
|
+
* @property {Record<string,string>} [meta] Free-form task metadata (tenant, client…).
|
|
21
|
+
*
|
|
22
|
+
* @typedef {Object} TaskResult
|
|
23
|
+
* @property {string} taskId Which task ran.
|
|
24
|
+
* @property {string} adapterId Which harness produced it.
|
|
25
|
+
* @property {"ok"|"error"|"cancelled"} status
|
|
26
|
+
* @property {string} output Final text output.
|
|
27
|
+
* @property {string} [error] Error message when status!=="ok".
|
|
28
|
+
* @property {string} [stderr] Diagnostic stderr (non-fatal engine log noise).
|
|
29
|
+
* @property {TokenUsage} usage
|
|
30
|
+
* @property {number} costUsd Estimated cost in USD.
|
|
31
|
+
* @property {number} durationMs
|
|
32
|
+
* @property {string} startedAt ISO timestamp.
|
|
33
|
+
* @property {string} [checkpointId] Resume handle when supported.
|
|
34
|
+
* @property {string[]} [files] Files produced by the task.
|
|
35
|
+
*
|
|
36
|
+
* @typedef {Object} TokenUsage
|
|
37
|
+
* @property {number} input
|
|
38
|
+
* @property {number} output
|
|
39
|
+
* @property {number} [cacheHit] Input tokens served from cache.
|
|
40
|
+
* @property {number} [cacheMiss] Input tokens billed at full rate.
|
|
41
|
+
*
|
|
42
|
+
* @typedef {Object} Capabilities
|
|
43
|
+
* @property {boolean} streaming Yields incremental output.
|
|
44
|
+
* @property {boolean} checkpoint Can snapshot/resume a run.
|
|
45
|
+
* @property {boolean} cancel Can abort an in-flight run.
|
|
46
|
+
* @property {boolean} files Can return produced files.
|
|
47
|
+
* @property {boolean} tools Runs tools / filesystem access.
|
|
48
|
+
* @property {boolean} modelChoice Supports per-call model selection.
|
|
49
|
+
* @property {number} costPerMTokIn Rough blended input price (USD / 1M tok).
|
|
50
|
+
* @property {number} costPerMTokOut Rough blended output price (USD / 1M tok).
|
|
51
|
+
*
|
|
52
|
+
* @typedef {Object} AdapterStatus
|
|
53
|
+
* @property {boolean} ready
|
|
54
|
+
* @property {string} [reason] Why not ready (e.g. missing credential).
|
|
55
|
+
* @property {string} [detail]
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Marker base class. Adapters may extend it or merely satisfy the shape.
|
|
60
|
+
* Every method documented here is REQUIRED unless marked optional.
|
|
61
|
+
*/
|
|
62
|
+
export class HarnessAdapter {
|
|
63
|
+
/** @param {Object} [opts] */
|
|
64
|
+
constructor(opts = {}) {
|
|
65
|
+
this.id = opts.id || "unnamed";
|
|
66
|
+
this.label = opts.label || this.id;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** @returns {Capabilities} */
|
|
70
|
+
capabilities() {
|
|
71
|
+
throw new Error(`${this.id}: capabilities() not implemented`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** @returns {Promise<AdapterStatus>} readiness probe (creds, binaries, network) */
|
|
75
|
+
async status() {
|
|
76
|
+
throw new Error(`${this.id}: status() not implemented`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Run a task to completion. REQUIRED.
|
|
81
|
+
* @param {TaskRequest} task
|
|
82
|
+
* @returns {Promise<TaskResult>}
|
|
83
|
+
*/
|
|
84
|
+
async submit(_task) {
|
|
85
|
+
throw new Error(`${this.id}: submit() not implemented`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Incremental output. OPTIONAL — callers fall back to submit() output.
|
|
90
|
+
* @param {TaskRequest} task
|
|
91
|
+
* @returns {AsyncIterable<string>}
|
|
92
|
+
*/
|
|
93
|
+
async *stream(_task) {
|
|
94
|
+
throw new Error(`${this.id}: stream() not implemented`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Snapshot an in-flight task so it can resume later. OPTIONAL.
|
|
99
|
+
* @param {string} _taskId
|
|
100
|
+
* @returns {Promise<string|null>} checkpoint id, or null if unsupported
|
|
101
|
+
*/
|
|
102
|
+
async checkpoint(_taskId) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Resume from a checkpoint id. OPTIONAL.
|
|
108
|
+
* @param {string} _checkpointId
|
|
109
|
+
* @returns {Promise<TaskResult>}
|
|
110
|
+
*/
|
|
111
|
+
async resume(_checkpointId) {
|
|
112
|
+
throw new Error(`${this.id}: resume() not implemented`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Cancel an in-flight task. OPTIONAL.
|
|
117
|
+
* @param {string} _taskId
|
|
118
|
+
* @returns {Promise<boolean>} true if a run was cancelled
|
|
119
|
+
*/
|
|
120
|
+
async cancel(_taskId) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Return files produced by a task. OPTIONAL.
|
|
126
|
+
* @param {string} _taskId
|
|
127
|
+
* @returns {Promise<string[]>} absolute paths
|
|
128
|
+
*/
|
|
129
|
+
async downloadFiles(_taskId) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** @returns {string} ISO timestamp helper */
|
|
135
|
+
export function nowIso() {
|
|
136
|
+
return new Date().toISOString();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Round a USD cost to 6 decimal places (sub-cent precision, stable JSON output).
|
|
141
|
+
* @param {number} n
|
|
142
|
+
* @returns {number}
|
|
143
|
+
*/
|
|
144
|
+
export function roundCost(n) {
|
|
145
|
+
return Math.round((Number.isFinite(n) ? n : 0) * 1e6) / 1e6;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Build a zeroed TaskResult with sane defaults, so adapters only fill what differs.
|
|
150
|
+
* @param {TaskRequest & {adapterId: string}} t
|
|
151
|
+
* @returns {TaskResult}
|
|
152
|
+
*/
|
|
153
|
+
export function baseResult(t) {
|
|
154
|
+
return {
|
|
155
|
+
taskId: t.id,
|
|
156
|
+
adapterId: t.adapterId,
|
|
157
|
+
status: "ok",
|
|
158
|
+
output: "",
|
|
159
|
+
usage: { input: 0, output: 0 },
|
|
160
|
+
costUsd: 0,
|
|
161
|
+
durationMs: 0,
|
|
162
|
+
startedAt: nowIso(),
|
|
163
|
+
files: [],
|
|
164
|
+
};
|
|
165
|
+
}
|
package/src/interview.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import { createInterface } from "node:readline";
|
|
4
5
|
|
|
5
|
-
const
|
|
6
|
+
const HOME = homedir();
|
|
7
|
+
const HB_DIR = join(HOME, ".huckleberry");
|
|
6
8
|
|
|
7
9
|
function ask(rl, question) {
|
|
8
10
|
return new Promise((resolve) => {
|
|
@@ -11,9 +13,9 @@ function ask(rl, question) {
|
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
export async function runInterview() {
|
|
14
|
-
console.log(`\n
|
|
15
|
-
console.log(` ║ HUCKLEBERRY — First Run Setup
|
|
16
|
-
console.log(`
|
|
16
|
+
console.log(`\n ╔════════════════════════════════════════════════════════════╗`);
|
|
17
|
+
console.log(` ║ HUCKLEBERRY — First Run Setup ║`);
|
|
18
|
+
console.log(` ╚════════════════════════════════════════════════════════════╝`);
|
|
17
19
|
console.log(`\n I'll ask a few questions to set up your AI system.\n`);
|
|
18
20
|
|
|
19
21
|
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -32,6 +34,10 @@ export async function runInterview() {
|
|
|
32
34
|
|
|
33
35
|
console.log(`\n Help areas (comma-separated): outreach, content, research, social, seo, marketing, ops, all`);
|
|
34
36
|
answers.priorities = await ask(rl, ">");
|
|
37
|
+
|
|
38
|
+
console.log(`\n Optional keys (press Enter to skip — you can add them later in ~/.huckleberry/.env):`);
|
|
39
|
+
answers.typesafeKey = await ask(rl, "TypeSafe Jev API key (typesafe.ai)?");
|
|
40
|
+
answers.discordToken = await ask(rl, "Discord bot token?");
|
|
35
41
|
rl.close();
|
|
36
42
|
|
|
37
43
|
writeFileSync(join(HB_DIR, "USER.md"), [
|
|
@@ -73,6 +79,32 @@ export async function runInterview() {
|
|
|
73
79
|
}
|
|
74
80
|
}
|
|
75
81
|
|
|
82
|
+
// Write provided keys into ~/.huckleberry/.env (never overwrite existing values)
|
|
83
|
+
const envFile = join(HB_DIR, ".env");
|
|
84
|
+
let env = existsSync(envFile) ? readFileSync(envFile, "utf-8") : "DISCORD_BOT_TOKEN=\nTYPESAFE_API_KEY=\n";
|
|
85
|
+
const setIfEmpty = (key, val) => {
|
|
86
|
+
if (!val) return;
|
|
87
|
+
const re = new RegExp(`^${key}=.*$`, "m");
|
|
88
|
+
env = re.test(env) ? env.replace(re, `${key}=${val}`) : `${env}${key}=${val}\n`;
|
|
89
|
+
};
|
|
90
|
+
setIfEmpty("TYPESAFE_API_KEY", answers.typesafeKey);
|
|
91
|
+
setIfEmpty("DISCORD_BOT_TOKEN", answers.discordToken);
|
|
92
|
+
writeFileSync(envFile, env, "utf-8");
|
|
93
|
+
|
|
94
|
+
// Patch the Jev MCP env in ~/.opencode/opencode.json so judgment tools work out of the box
|
|
95
|
+
if (answers.typesafeKey) {
|
|
96
|
+
const ocFile = join(HOME, ".opencode", "opencode.json");
|
|
97
|
+
if (existsSync(ocFile)) {
|
|
98
|
+
try {
|
|
99
|
+
const cfg = JSON.parse(readFileSync(ocFile, "utf-8"));
|
|
100
|
+
if (cfg.mcp?.jev?.environment) cfg.mcp.jev.environment.TYPESAFE_API_KEY = answers.typesafeKey;
|
|
101
|
+
writeFileSync(ocFile, JSON.stringify(cfg, null, 2));
|
|
102
|
+
} catch { /* leave config untouched if invalid */ }
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
76
106
|
console.log(`\n ✓ USER.md, evergreen.md, SOUL.md, IDENTITY.md generated`);
|
|
107
|
+
if (answers.typesafeKey) console.log(` ✓ Jev judgment layer configured`);
|
|
108
|
+
if (answers.discordToken) console.log(` ✓ Discord token saved to ~/.huckleberry/.env (see ~/.huckleberry/wiki/discord.md to finish wiring)`);
|
|
77
109
|
console.log(` Next: type 'opencode' to start with your COS.\n`);
|
|
78
110
|
}
|
package/src/postinstall.js
CHANGED
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
// Post-install
|
|
2
|
-
// Prints next steps for the user
|
|
3
|
-
|
|
1
|
+
// Post-install banner — runs after npm install -g @jairodri/huckleberry-cli
|
|
4
2
|
console.log(`
|
|
5
|
-
|
|
6
|
-
║ HUCKLEBERRY AI SYSTEM INSTALLED
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
╔════════════════════════════════════════════════════════════╗
|
|
4
|
+
║ HUCKLEBERRY AI SYSTEM INSTALLED ║
|
|
5
|
+
╚════════════════════════════════════════════════════════════╝
|
|
9
6
|
Get started:
|
|
10
7
|
1. huckleberry install — set up the system
|
|
11
8
|
2. npm install -g opencode — install opencode
|
|
12
9
|
3. npm install -g kimaki — install kimaki
|
|
13
10
|
4. huckleberry interview — configure your agent
|
|
14
|
-
|
|
15
11
|
Commands:
|
|
16
12
|
huckleberry help — show all commands
|
|
13
|
+
huckleberry doctor — health check (run when anything feels off)
|
|
14
|
+
huckleberry packs — list skill packs
|
|
15
|
+
huckleberry install-pack all — deploy every skill pack
|
|
16
|
+
huckleberry cro <url> — CRO audit of a landing page
|
|
17
|
+
huckleberry review — weekly self-improvement review
|
|
17
18
|
huckleberry update — update to latest version
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Documentation:
|
|
21
|
-
https://huckleberry.ai/docs
|
|
19
|
+
Documentation: https://huckleberry.ai
|
|
22
20
|
`);
|
package/templates/AGENTS.md
CHANGED
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
# AGENTS.md — Workspace Rules & Protocols
|
|
2
2
|
|
|
3
3
|
## STARTUP RITUAL (MANDATORY)
|
|
4
|
+
**Bootstrap context files (VERIFY, do not assume injection):**
|
|
5
|
+
At session start, check whether your context already contains SOUL.md, USER.md, IDENTITY.md, COS_PROTOCOLS.md, TOOLS.md, and HEARTBEAT.md content (workspace root or your agent workspace). **If NOT present, read them yourself before doing any work.** These files define who you are, who the user is, your operating principles, and available tools. Operating without them = protocol breach. Never claim context you don't have, and never skip them because "bootstrap should have injected them."
|
|
6
|
+
|
|
4
7
|
BEFORE responding to any message:
|
|
5
|
-
1.
|
|
6
|
-
2. Read
|
|
7
|
-
3. Read
|
|
8
|
-
|
|
8
|
+
1. Read `memory/YYYY-MM-DD.md` for today
|
|
9
|
+
2. Read `.huckleberry/taskmaster/tasks/tasks.json` — what's active
|
|
10
|
+
3. Read memory/corrections.md — active corrections
|
|
11
|
+
|
|
12
|
+
## Inkstone Memory Tools
|
|
13
|
+
Inkstone holds 25K+ structured decisions, preferences, procedures, contacts, failures. Boot context is auto-injected by the plugin on startup.
|
|
9
14
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
Routing by task:
|
|
16
|
+
- Decision / preference / procedure → `inkstone_memory_search(query, namespace, limit=5)`
|
|
17
|
+
- Repeating a past mistake → `inkstone_memory_failures()`
|
|
18
|
+
- Broad archive / historical → `inkstone_memory_hybrid_answer` / `inkstone_memory_deep_query`
|
|
19
|
+
|
|
20
|
+
Soft dependency: if Inkstone MCP is down, skip and proceed. Do NOT block or loop.
|
|
14
21
|
|
|
15
22
|
## COS Operations
|
|
16
23
|
- You are the Chief of Staff — an orchestrator, not a worker
|
|
@@ -60,13 +67,6 @@ Before responding to business tasks, read `evergreen.md` to know the business.
|
|
|
60
67
|
- When blocked after 2 attempts, report: what tried, what failed, what's next
|
|
61
68
|
- Prefer finished work over status updates
|
|
62
69
|
|
|
63
|
-
## Huckleberry MCP (when available)
|
|
64
|
-
- `huckleberry_packs_list` — check available packs
|
|
65
|
-
- `huckleberry_pack_install` — download and configure
|
|
66
|
-
- `huckleberry_combos_check` — latest model combos
|
|
67
|
-
- `huckleberry_update_check` — check for updates
|
|
68
|
-
- `huckleberry_ideas_generate` — strategy suggestions
|
|
69
|
-
|
|
70
70
|
## Memory System
|
|
71
71
|
- Write immediately when insight happens — not at session end
|
|
72
72
|
- Source every claim: `(source: session X)` or `(source: user directive, YYYY-MM-DD)`
|
|
@@ -86,5 +86,5 @@ Before responding to business tasks, read `evergreen.md` to know the business.
|
|
|
86
86
|
|
|
87
87
|
## Kanban Workflows (optional)
|
|
88
88
|
- Templates in `.huckleberry/kanban/templates/`
|
|
89
|
-
- List: `bun src/cli.mjs templates` (if kanban sourcedir exists)
|
|
90
|
-
- Stamp: `bun src/cli.mjs stamp <template> --var key=val`
|
|
89
|
+
- List: `bun ~/.huckleberry/kanban/src/cli.mjs templates` (if kanban sourcedir exists)
|
|
90
|
+
- Stamp: `bun ~/.huckleberry/kanban/src/cli.mjs stamp <template> --var key=val`
|
package/templates/ORG.md
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
~/.opencode/
|
|
27
27
|
├── opencode.json # Main config
|
|
28
28
|
├── plugin/env-inject.ts # .env auto-loader
|
|
29
|
-
├── plugin/inkstone-
|
|
29
|
+
├── plugin/inkstone-priority.ts # Inkstone boot-context injection (no gate)
|
|
30
30
|
└── mcp/ # MCP server files
|
|
31
31
|
|
|
32
32
|
~/.claude/skills/ # Installed skills
|
package/templates/TOOLS.md
CHANGED
|
@@ -16,8 +16,13 @@
|
|
|
16
16
|
| Command | Purpose |
|
|
17
17
|
|---------|---------|
|
|
18
18
|
| `huckleberry install` | Install Huckleberry system |
|
|
19
|
+
| `huckleberry interview` | Personalize agents (name, business, keys) |
|
|
20
|
+
| `huckleberry doctor` | Health check — run when anything feels off |
|
|
21
|
+
| `huckleberry packs` | List available skill packs |
|
|
22
|
+
| `huckleberry install-pack <name>` | Deploy a skill pack (core, doctor, content, cro, web-design, research, outreach-sales, social, self-improvement, all) |
|
|
23
|
+
| `huckleberry cro <url>` | CRO audit of a landing page |
|
|
24
|
+
| `huckleberry review` | Weekly self-improvement review (proposals only) |
|
|
19
25
|
| `huckleberry update` | Update to latest version |
|
|
20
|
-
| `huckleberry install-pack <name>` | Install agent/skill pack |
|
|
21
26
|
| `huckleberry version` | Show version |
|
|
22
27
|
|
|
23
28
|
## Inkstone (Memory)
|
|
@@ -63,4 +68,4 @@
|
|
|
63
68
|
|--------|---------|
|
|
64
69
|
| Inkstone MCP | Memory search, write, dream cycle, graph |
|
|
65
70
|
| Context7 MCP | Documentation lookup for libraries/tools |
|
|
66
|
-
|
|
|
71
|
+
| Jev MCP | Fast judgment tools (classify, rerank, verify, gate) |
|
package/templates/opencode.json
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://opencode.ai/config.json",
|
|
3
|
+
"harness-policy": {
|
|
4
|
+
"default": "opencode",
|
|
5
|
+
"selection": "capability-matched, then cost-optimized",
|
|
6
|
+
"rules": {
|
|
7
|
+
"toolsRequired": "opencode",
|
|
8
|
+
"costOptimized": "deepseek",
|
|
9
|
+
"requireApprovalAboveCostUsd": 5,
|
|
10
|
+
"requireApprovalAboveTokens": 50000,
|
|
11
|
+
"escalateOnConsecutiveFailures": 2
|
|
12
|
+
}
|
|
13
|
+
},
|
|
3
14
|
"mcp": {
|
|
4
15
|
"inkstone": {
|
|
5
16
|
"type": "local",
|
|
@@ -14,27 +25,23 @@
|
|
|
14
25
|
},
|
|
15
26
|
"context7": {
|
|
16
27
|
"type": "local",
|
|
17
|
-
"command": [
|
|
28
|
+
"command": [
|
|
29
|
+
"npx",
|
|
30
|
+
"-y",
|
|
31
|
+
"@context7/server"
|
|
32
|
+
],
|
|
18
33
|
"enabled": true
|
|
19
34
|
},
|
|
20
|
-
"
|
|
35
|
+
"jev": {
|
|
21
36
|
"type": "local",
|
|
22
37
|
"command": [
|
|
23
38
|
"node",
|
|
24
|
-
"{{USERPROFILE}}/.
|
|
39
|
+
"{{USERPROFILE}}/.huckleberry/mcp/jev-mcp/node_modules/@jkudish/jev-mcp/dist/index.js"
|
|
25
40
|
],
|
|
26
41
|
"enabled": true,
|
|
27
42
|
"environment": {
|
|
28
|
-
"
|
|
43
|
+
"TYPESAFE_API_KEY": ""
|
|
29
44
|
}
|
|
30
|
-
},
|
|
31
|
-
"huckleberry": {
|
|
32
|
-
"type": "local",
|
|
33
|
-
"command": [
|
|
34
|
-
"huckleberry",
|
|
35
|
-
"mcp"
|
|
36
|
-
],
|
|
37
|
-
"enabled": true
|
|
38
45
|
}
|
|
39
46
|
},
|
|
40
47
|
"permission": {
|
|
@@ -42,8 +49,7 @@
|
|
|
42
49
|
},
|
|
43
50
|
"plugin": [
|
|
44
51
|
"./plugin/env-inject.ts",
|
|
45
|
-
"./plugin/inkstone-gate.ts"
|
|
46
|
-
"context-mode"
|
|
52
|
+
"./plugin/inkstone-gate.ts"
|
|
47
53
|
],
|
|
48
54
|
"compaction": {
|
|
49
55
|
"mode": "safeguard",
|
|
@@ -52,29 +58,20 @@
|
|
|
52
58
|
},
|
|
53
59
|
"agent": {
|
|
54
60
|
"build": {
|
|
55
|
-
"description": "Default executor. Runs tools, writes files, completes tasks."
|
|
56
|
-
"mode": "primary",
|
|
57
|
-
"model": "omniroute/combo/freellmapi smart models"
|
|
61
|
+
"description": "Default executor. Runs tools, writes files, completes tasks."
|
|
58
62
|
},
|
|
59
63
|
"plan": {
|
|
60
|
-
"description": "Read-only strategy and analysis. Research tasks only."
|
|
61
|
-
"mode": "primary",
|
|
62
|
-
"model": "omniroute/combo/freellmapi smart models"
|
|
64
|
+
"description": "Read-only strategy and analysis. Research tasks only."
|
|
63
65
|
},
|
|
64
66
|
"researcher": {
|
|
65
|
-
"description": "Web research, intelligence gathering, competitive analysis."
|
|
66
|
-
"mode": "primary",
|
|
67
|
-
"model": "omniroute/combo/freellmapi smart models"
|
|
67
|
+
"description": "Web research, intelligence gathering, competitive analysis."
|
|
68
68
|
},
|
|
69
69
|
"hermes": {
|
|
70
|
-
"description": "System administrator.
|
|
71
|
-
"
|
|
72
|
-
"instructions": [
|
|
73
|
-
"./instructions/hermes.md"
|
|
74
|
-
]
|
|
70
|
+
"description": "System administrator. Diagnoses and repairs the Huckleberry stack (kimaki, Discord, opencode, Inkstone, Jev).",
|
|
71
|
+
"prompt": "You are Hermes, the Huckleberry system administrator. At session start, BEFORE any work, read: ~/.huckleberry/agents/hermes/SOUL.md, ~/.huckleberry/agents/hermes/AGENTS.md, ~/.huckleberry/agents/hermes/hermes-fixer.md, and the wiki files in ~/.huckleberry/wiki/ (kimaki.md, discord.md, opencode.md, inkstone.md, doctor.md). When something breaks: diagnose first (or run `huckleberry doctor`), fix the root cause, verify every fix with a live test, and never print secret values. Escalate after 3 real failed attempts with what you tried, exact errors, and your recommended next step."
|
|
75
72
|
}
|
|
76
73
|
},
|
|
77
74
|
"instructions": [
|
|
78
|
-
"
|
|
75
|
+
"{{USERPROFILE}}/.huckleberry/business-context-gate.md"
|
|
79
76
|
]
|
|
80
77
|
}
|