@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,175 @@
|
|
|
1
|
+
"""Tests for tokenizer-aware format optimization."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
|
|
9
|
+
from lib.tokenizer_optimizer import (
|
|
10
|
+
normalize_punctuation, strip_bold_italic, strip_trivial_backticks,
|
|
11
|
+
minimize_whitespace, compact_bullets, compress_table_to_kv,
|
|
12
|
+
optimize_tokens, estimate_savings,
|
|
13
|
+
)
|
|
14
|
+
from lib.tokens import estimate_tokens
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TestNormalizePunctuation:
|
|
18
|
+
def test_chinese_punctuation(self):
|
|
19
|
+
text = "你好,世界。这是:测试!"
|
|
20
|
+
result = normalize_punctuation(text)
|
|
21
|
+
assert "," not in result
|
|
22
|
+
assert "。" not in result
|
|
23
|
+
assert ":" not in result
|
|
24
|
+
assert "!" not in result
|
|
25
|
+
assert "," in result
|
|
26
|
+
assert "." in result
|
|
27
|
+
|
|
28
|
+
def test_brackets(self):
|
|
29
|
+
result = normalize_punctuation("(测试)")
|
|
30
|
+
assert "(" in result
|
|
31
|
+
assert ")" in result
|
|
32
|
+
|
|
33
|
+
def test_no_change_ascii(self):
|
|
34
|
+
text = "hello, world!"
|
|
35
|
+
assert normalize_punctuation(text) == text
|
|
36
|
+
|
|
37
|
+
def test_mixed(self):
|
|
38
|
+
text = "IP:192.168.1.1,端口:8080"
|
|
39
|
+
result = normalize_punctuation(text)
|
|
40
|
+
assert result == "IP:192.168.1.1,端口:8080"
|
|
41
|
+
|
|
42
|
+
def test_token_savings(self):
|
|
43
|
+
text = "这是一个测试,包含很多中文标点。还有冒号:分号;感叹号!"
|
|
44
|
+
before = estimate_tokens(text)
|
|
45
|
+
after = estimate_tokens(normalize_punctuation(text))
|
|
46
|
+
assert after <= before
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TestStripBoldItalic:
|
|
50
|
+
def test_bold(self):
|
|
51
|
+
assert strip_bold_italic("**hello**") == "hello"
|
|
52
|
+
|
|
53
|
+
def test_italic(self):
|
|
54
|
+
assert strip_bold_italic("*hello*") == "hello"
|
|
55
|
+
|
|
56
|
+
def test_mixed(self):
|
|
57
|
+
text = "This is **bold** and *italic* text"
|
|
58
|
+
result = strip_bold_italic(text)
|
|
59
|
+
assert result == "This is bold and italic text"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class TestStripTrivialBackticks:
|
|
63
|
+
def test_simple_word(self):
|
|
64
|
+
assert strip_trivial_backticks("`hello`") == "hello"
|
|
65
|
+
|
|
66
|
+
def test_keeps_complex(self):
|
|
67
|
+
# Backticks with spaces should be kept (actual code)
|
|
68
|
+
text = "`hello world`"
|
|
69
|
+
assert strip_trivial_backticks(text) == text
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class TestMinimizeWhitespace:
|
|
73
|
+
def test_multiple_spaces(self):
|
|
74
|
+
text = "hello world"
|
|
75
|
+
result = minimize_whitespace(text)
|
|
76
|
+
assert " " not in result
|
|
77
|
+
|
|
78
|
+
def test_deep_indentation(self):
|
|
79
|
+
text = " deep indent"
|
|
80
|
+
result = minimize_whitespace(text)
|
|
81
|
+
assert len(result) - len(result.lstrip()) <= 4
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class TestCompressTableToKv:
|
|
85
|
+
def test_simple_table(self):
|
|
86
|
+
text = "| Key | Value |\n|-----|-------|\n| Name | Duke |\n| Role | CEO |"
|
|
87
|
+
result = compress_table_to_kv(text)
|
|
88
|
+
assert "Name: Duke" in result
|
|
89
|
+
assert "Role: CEO" in result
|
|
90
|
+
|
|
91
|
+
def test_multi_column(self):
|
|
92
|
+
text = "| A | B | C |\n|---|---|---|\n| 1 | 2 | 3 |"
|
|
93
|
+
result = compress_table_to_kv(text)
|
|
94
|
+
# Should convert to compact format
|
|
95
|
+
assert len(result) < len(text)
|
|
96
|
+
|
|
97
|
+
def test_no_table(self):
|
|
98
|
+
text = "Just normal text without tables"
|
|
99
|
+
assert compress_table_to_kv(text) == text
|
|
100
|
+
|
|
101
|
+
def test_token_savings(self):
|
|
102
|
+
table = (
|
|
103
|
+
"| Server | IP | Status |\n"
|
|
104
|
+
"|--------|-----|--------|\n"
|
|
105
|
+
"| Gateway | 192.168.1.1 | Online |\n"
|
|
106
|
+
"| Node1 | 192.168.1.2 | Online |\n"
|
|
107
|
+
"| Node2 | 192.168.1.3 | Offline |"
|
|
108
|
+
)
|
|
109
|
+
before = estimate_tokens(table)
|
|
110
|
+
after = estimate_tokens(compress_table_to_kv(table))
|
|
111
|
+
assert after < before
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class TestCompactBullets:
|
|
115
|
+
def test_long_bullet_list(self):
|
|
116
|
+
text = "- item1\n- item2\n- item3\n- item4"
|
|
117
|
+
result = compact_bullets(text)
|
|
118
|
+
# Should remove bullet prefixes for 3+ consecutive
|
|
119
|
+
assert "- " not in result or result.count("- ") < text.count("- ")
|
|
120
|
+
|
|
121
|
+
def test_short_list_kept(self):
|
|
122
|
+
text = "- item1\n- item2"
|
|
123
|
+
result = compact_bullets(text)
|
|
124
|
+
assert "- " in result # Only 2 items, keep bullets
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class TestOptimizeTokens:
|
|
128
|
+
def test_basic(self):
|
|
129
|
+
text = (
|
|
130
|
+
"**Server Config**\n\n"
|
|
131
|
+
"| Key | Value |\n|-----|-------|\n| IP | 192.168.1.1 |\n"
|
|
132
|
+
"状态:正常,端口:8080\n"
|
|
133
|
+
)
|
|
134
|
+
result = optimize_tokens(text)
|
|
135
|
+
assert estimate_tokens(result) <= estimate_tokens(text)
|
|
136
|
+
|
|
137
|
+
def test_aggressive(self):
|
|
138
|
+
text = "**Bold** and *italic* with `backticks`\n- item1\n- item2\n- item3\n- item4"
|
|
139
|
+
normal = optimize_tokens(text, aggressive=False)
|
|
140
|
+
aggressive = optimize_tokens(text, aggressive=True)
|
|
141
|
+
assert len(aggressive) <= len(normal)
|
|
142
|
+
|
|
143
|
+
def test_empty(self):
|
|
144
|
+
assert optimize_tokens("") == ""
|
|
145
|
+
|
|
146
|
+
def test_unicode_preserved(self):
|
|
147
|
+
text = "中文内容 English content 日本語"
|
|
148
|
+
result = optimize_tokens(text)
|
|
149
|
+
assert "中文" in result
|
|
150
|
+
assert "English" in result
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TestEstimateSavings:
|
|
154
|
+
def test_basic(self):
|
|
155
|
+
original = "**Bold** text,with中文标点。\n| K | V |\n|--|--|\n| a | b |"
|
|
156
|
+
optimized = optimize_tokens(original, aggressive=True)
|
|
157
|
+
stats = estimate_savings(original, optimized)
|
|
158
|
+
assert stats["original_tokens"] > 0
|
|
159
|
+
assert stats["optimized_tokens"] > 0
|
|
160
|
+
assert stats["token_reduction_pct"] >= 0
|
|
161
|
+
|
|
162
|
+
def test_real_workspace_text(self):
|
|
163
|
+
text = """## SSH 密钥 (在 ~/.ssh/)
|
|
164
|
+
| 密钥 | 可访问 |
|
|
165
|
+
|------|--------|
|
|
166
|
+
| `id_ed25519_mykey` | remote server, local Linux, worker-1, worker-2 |
|
|
167
|
+
| `server_key.pem` | remote server, local Linux, worker-1, worker-2 |
|
|
168
|
+
| `admin_key.pem` | worker-1.lan, worker-2.lan (user: admin) |
|
|
169
|
+
|
|
170
|
+
**任意密钥**可登任意节点。
|
|
171
|
+
"""
|
|
172
|
+
optimized = optimize_tokens(text, aggressive=True)
|
|
173
|
+
stats = estimate_savings(text, optimized)
|
|
174
|
+
assert stats["token_reduction_pct"] > 0
|
|
175
|
+
assert "密钥" in optimized
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""Comprehensive tests for lib/tokenizer_optimizer.py."""
|
|
2
|
+
import sys
|
|
3
|
+
import pytest
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "scripts"))
|
|
7
|
+
from lib.tokenizer_optimizer import (
|
|
8
|
+
strip_bold_italic, strip_trivial_backticks, normalize_punctuation,
|
|
9
|
+
compress_table_to_kv, compact_bullets, minimize_whitespace,
|
|
10
|
+
optimize_tokens, estimate_savings,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestStripBoldItalic:
|
|
15
|
+
def test_strips_bold(self):
|
|
16
|
+
assert "hello" in strip_bold_italic("**hello**")
|
|
17
|
+
assert "**" not in strip_bold_italic("**hello**")
|
|
18
|
+
|
|
19
|
+
def test_strips_italic(self):
|
|
20
|
+
result = strip_bold_italic("*hello*")
|
|
21
|
+
assert "hello" in result
|
|
22
|
+
|
|
23
|
+
def test_mixed(self):
|
|
24
|
+
result = strip_bold_italic("**bold** and *italic* text")
|
|
25
|
+
assert "bold" in result
|
|
26
|
+
assert "italic" in result
|
|
27
|
+
|
|
28
|
+
def test_no_markers(self):
|
|
29
|
+
assert strip_bold_italic("plain text") == "plain text"
|
|
30
|
+
|
|
31
|
+
def test_empty(self):
|
|
32
|
+
assert strip_bold_italic("") == ""
|
|
33
|
+
|
|
34
|
+
def test_nested(self):
|
|
35
|
+
result = strip_bold_italic("***bold italic***")
|
|
36
|
+
assert isinstance(result, str)
|
|
37
|
+
|
|
38
|
+
def test_preserves_asterisks_in_code(self):
|
|
39
|
+
# Backtick-wrapped asterisks should ideally be preserved
|
|
40
|
+
result = strip_bold_italic("use `**kwargs` in Python")
|
|
41
|
+
assert isinstance(result, str)
|
|
42
|
+
|
|
43
|
+
def test_multiline(self):
|
|
44
|
+
text = "**line1**\n**line2**\n*line3*"
|
|
45
|
+
result = strip_bold_italic(text)
|
|
46
|
+
assert "line1" in result
|
|
47
|
+
assert "line2" in result
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class TestStripTrivialBackticks:
|
|
51
|
+
def test_strips_simple_word(self):
|
|
52
|
+
result = strip_trivial_backticks("`hello`")
|
|
53
|
+
assert "hello" in result
|
|
54
|
+
|
|
55
|
+
def test_keeps_code_content(self):
|
|
56
|
+
# Content with spaces or special chars should be kept
|
|
57
|
+
result = strip_trivial_backticks("`ls -la`")
|
|
58
|
+
assert "ls" in result
|
|
59
|
+
|
|
60
|
+
def test_empty(self):
|
|
61
|
+
assert strip_trivial_backticks("") == ""
|
|
62
|
+
|
|
63
|
+
def test_no_backticks(self):
|
|
64
|
+
assert strip_trivial_backticks("plain") == "plain"
|
|
65
|
+
|
|
66
|
+
def test_code_block_preserved(self):
|
|
67
|
+
text = "```python\ncode here\n```"
|
|
68
|
+
result = strip_trivial_backticks(text)
|
|
69
|
+
assert "code here" in result
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class TestNormalizePunctuation:
|
|
73
|
+
def test_chinese_comma(self):
|
|
74
|
+
assert "," not in normalize_punctuation("你好,世界")
|
|
75
|
+
|
|
76
|
+
def test_chinese_period(self):
|
|
77
|
+
assert "。" not in normalize_punctuation("完成。")
|
|
78
|
+
|
|
79
|
+
def test_no_change_english(self):
|
|
80
|
+
text = "Hello, world."
|
|
81
|
+
assert normalize_punctuation(text) == text
|
|
82
|
+
|
|
83
|
+
def test_empty(self):
|
|
84
|
+
assert normalize_punctuation("") == ""
|
|
85
|
+
|
|
86
|
+
def test_all_chinese_punct(self):
|
|
87
|
+
text = "测试,内容。问题?回答!"
|
|
88
|
+
result = normalize_punctuation(text)
|
|
89
|
+
assert "," not in result
|
|
90
|
+
assert "。" not in result
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TestCompressTableToKv:
|
|
94
|
+
def test_basic_table(self):
|
|
95
|
+
text = "| Key | Value |\n|-----|-------|\n| name | Alice |\n| age | 30 |"
|
|
96
|
+
result = compress_table_to_kv(text)
|
|
97
|
+
assert "Alice" in result
|
|
98
|
+
assert "30" in result
|
|
99
|
+
assert len(result) <= len(text)
|
|
100
|
+
|
|
101
|
+
def test_no_table(self):
|
|
102
|
+
text = "just text"
|
|
103
|
+
assert compress_table_to_kv(text) == text
|
|
104
|
+
|
|
105
|
+
def test_empty(self):
|
|
106
|
+
assert compress_table_to_kv("") == ""
|
|
107
|
+
|
|
108
|
+
def test_three_columns(self):
|
|
109
|
+
text = "| A | B | C |\n|---|---|---|\n| 1 | 2 | 3 |"
|
|
110
|
+
result = compress_table_to_kv(text)
|
|
111
|
+
assert "1" in result
|
|
112
|
+
|
|
113
|
+
def test_table_with_text_around(self):
|
|
114
|
+
text = "Header:\n| K | V |\n|---|---|\n| x | y |\nFooter"
|
|
115
|
+
result = compress_table_to_kv(text)
|
|
116
|
+
assert "Header" in result
|
|
117
|
+
assert "Footer" in result
|
|
118
|
+
|
|
119
|
+
def test_savings_on_real_table(self):
|
|
120
|
+
text = (
|
|
121
|
+
"| Setting | Value | Description |\n"
|
|
122
|
+
"|---------|-------|-------------|\n"
|
|
123
|
+
"| timeout | 30s | Request timeout |\n"
|
|
124
|
+
"| retries | 3 | Maximum retry count |\n"
|
|
125
|
+
"| workers | 8 | Number of workers |\n"
|
|
126
|
+
"| buffer | 4096 | Buffer size bytes |\n"
|
|
127
|
+
)
|
|
128
|
+
result = compress_table_to_kv(text)
|
|
129
|
+
assert len(result) < len(text)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class TestCompactBullets:
|
|
133
|
+
def test_removes_prefixes(self):
|
|
134
|
+
text = "- item 1\n- item 2\n- item 3"
|
|
135
|
+
result = compact_bullets(text)
|
|
136
|
+
assert isinstance(result, str)
|
|
137
|
+
|
|
138
|
+
def test_empty(self):
|
|
139
|
+
assert compact_bullets("") == ""
|
|
140
|
+
|
|
141
|
+
def test_no_bullets(self):
|
|
142
|
+
text = "paragraph text"
|
|
143
|
+
assert compact_bullets(text) == text
|
|
144
|
+
|
|
145
|
+
def test_nested_bullets(self):
|
|
146
|
+
text = "- outer\n - inner\n - inner2\n- outer2"
|
|
147
|
+
result = compact_bullets(text)
|
|
148
|
+
assert isinstance(result, str)
|
|
149
|
+
|
|
150
|
+
def test_numbered_list(self):
|
|
151
|
+
text = "1. first\n2. second\n3. third"
|
|
152
|
+
result = compact_bullets(text)
|
|
153
|
+
assert isinstance(result, str)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class TestMinimizeWhitespace:
|
|
157
|
+
def test_collapses_blanks(self):
|
|
158
|
+
text = "a\n\n\n\nb"
|
|
159
|
+
result = minimize_whitespace(text)
|
|
160
|
+
assert "\n\n\n" not in result
|
|
161
|
+
assert "a" in result and "b" in result
|
|
162
|
+
|
|
163
|
+
def test_strips_trailing(self):
|
|
164
|
+
text = "hello \nworld "
|
|
165
|
+
result = minimize_whitespace(text)
|
|
166
|
+
assert " " not in result or result.strip() == result.strip()
|
|
167
|
+
|
|
168
|
+
def test_empty(self):
|
|
169
|
+
assert minimize_whitespace("") == ""
|
|
170
|
+
|
|
171
|
+
def test_single_line(self):
|
|
172
|
+
assert minimize_whitespace("hello") == "hello"
|
|
173
|
+
|
|
174
|
+
def test_tabs(self):
|
|
175
|
+
text = "\thello\t\tworld"
|
|
176
|
+
result = minimize_whitespace(text)
|
|
177
|
+
assert isinstance(result, str)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class TestOptimizeTokens:
|
|
181
|
+
def test_basic(self):
|
|
182
|
+
text = "**Bold** text,中文。And `simple` backticks"
|
|
183
|
+
result = optimize_tokens(text)
|
|
184
|
+
assert isinstance(result, str)
|
|
185
|
+
|
|
186
|
+
def test_aggressive(self):
|
|
187
|
+
text = "**Bold** text with | table | data |\n|---|---|\n| a | b |"
|
|
188
|
+
result = optimize_tokens(text, aggressive=True)
|
|
189
|
+
assert isinstance(result, str)
|
|
190
|
+
|
|
191
|
+
def test_empty(self):
|
|
192
|
+
assert optimize_tokens("") == ""
|
|
193
|
+
|
|
194
|
+
def test_idempotent(self):
|
|
195
|
+
"""Running twice should give same result."""
|
|
196
|
+
text = "**Some** text,with `stuff`"
|
|
197
|
+
first = optimize_tokens(text)
|
|
198
|
+
second = optimize_tokens(first)
|
|
199
|
+
assert first == second
|
|
200
|
+
|
|
201
|
+
def test_never_increases_tokens(self):
|
|
202
|
+
"""Optimization should never make text use more tokens."""
|
|
203
|
+
from lib.tokens import estimate_tokens
|
|
204
|
+
texts = [
|
|
205
|
+
"**Bold** and *italic* markers",
|
|
206
|
+
"| Table | Here |\n|-------|------|\n| a | b |",
|
|
207
|
+
"中文,标点。测试!",
|
|
208
|
+
"- item1\n- item2\n- item3",
|
|
209
|
+
" lots of spaces ",
|
|
210
|
+
]
|
|
211
|
+
for text in texts:
|
|
212
|
+
optimized = optimize_tokens(text)
|
|
213
|
+
# Token count should not increase (or increase minimally)
|
|
214
|
+
orig_tokens = estimate_tokens(text)
|
|
215
|
+
opt_tokens = estimate_tokens(optimized)
|
|
216
|
+
assert opt_tokens <= orig_tokens + 2, f"Increased tokens for: {text[:50]}"
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class TestEstimateSavings:
|
|
220
|
+
def test_basic(self):
|
|
221
|
+
original = "**Bold** text with redundancy"
|
|
222
|
+
optimized = "Bold text with redundancy"
|
|
223
|
+
stats = estimate_savings(original, optimized)
|
|
224
|
+
assert "original_tokens" in stats
|
|
225
|
+
assert "optimized_tokens" in stats
|
|
226
|
+
assert stats["optimized_tokens"] <= stats["original_tokens"]
|
|
227
|
+
|
|
228
|
+
def test_no_change(self):
|
|
229
|
+
text = "plain text"
|
|
230
|
+
stats = estimate_savings(text, text)
|
|
231
|
+
assert stats["original_tokens"] == stats["optimized_tokens"]
|
|
232
|
+
|
|
233
|
+
def test_empty(self):
|
|
234
|
+
stats = estimate_savings("", "")
|
|
235
|
+
assert stats["original_tokens"] == 0
|
|
236
|
+
|
|
237
|
+
def test_significant_savings(self):
|
|
238
|
+
original = " - item one: the first value \n - item two: the second value \n" * 20
|
|
239
|
+
optimized = "item one:first value\nitem two:second value\n" * 20
|
|
240
|
+
stats = estimate_savings(original, optimized)
|
|
241
|
+
assert stats["optimized_tokens"] < stats["original_tokens"]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Tests for lib.tokens module."""
|
|
2
|
+
|
|
3
|
+
from lib.tokens import estimate_tokens, using_tiktoken
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestEstimateTokens:
|
|
7
|
+
def test_empty(self) -> None:
|
|
8
|
+
assert estimate_tokens("") == 0
|
|
9
|
+
|
|
10
|
+
def test_short(self) -> None:
|
|
11
|
+
assert estimate_tokens("abc") >= 1
|
|
12
|
+
|
|
13
|
+
def test_known_length(self) -> None:
|
|
14
|
+
result = estimate_tokens("a" * 400)
|
|
15
|
+
assert 50 <= result <= 200
|
|
16
|
+
|
|
17
|
+
def test_large(self) -> None:
|
|
18
|
+
assert estimate_tokens("x" * 400_000) >= 50_000
|
|
19
|
+
|
|
20
|
+
def test_unicode_chinese(self) -> None:
|
|
21
|
+
assert estimate_tokens("你好世界测试" * 100) > 0
|
|
22
|
+
|
|
23
|
+
def test_mixed(self) -> None:
|
|
24
|
+
assert estimate_tokens("Hello 你好 `code` **bold**") > 0
|
|
25
|
+
|
|
26
|
+
def test_using_tiktoken_bool(self) -> None:
|
|
27
|
+
assert isinstance(using_tiktoken(), bool)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# /cmo skill changelog
|
|
2
|
+
|
|
3
|
+
## 2026-04-21 — D1: Studio-era upgrade
|
|
4
|
+
|
|
5
|
+
Full audit + upgrade of the /cmo skill surface. Shipped as three passes to keep each commit reviewable.
|
|
6
|
+
|
|
7
|
+
### Pass 1 — Additive scope (`a6a2a86`, `9af7a2f`, `722cf8d`)
|
|
8
|
+
|
|
9
|
+
New rule files:
|
|
10
|
+
- `rules/studio-integration.md` — the five studio verbs (schema-fetch, activity, navigate, toast, brand-refresh), mirror-vs-hide decision tree, order-of-operations for combined writes, fire-and-forget failure handling, schema introspection via `/api/schema`.
|
|
11
|
+
- `rules/monorepo.md` — sibling project guidance for marketing-cli, mktg-studio, the marketing site, and optional private notes, pointer to `ORCHESTRATOR.md` as authoritative file-ownership map, cross-sibling `--cwd` protocol, red flags.
|
|
12
|
+
|
|
13
|
+
New playbooks in `rules/playbooks.md`:
|
|
14
|
+
- #11 Studio Launch Playbook — `mktg init` → `mktg studio` → foundation research → tabs light up → dashboard live.
|
|
15
|
+
- #12 Agent Team Coordination Playbook — parallel sub-agent spawn in a single message, synthesis, learnings compounding.
|
|
16
|
+
|
|
17
|
+
New command reference rows in `rules/command-reference.md`:
|
|
18
|
+
- `mktg studio`, `mktg studio --open`, `mktg studio --dry-run --json`.
|
|
19
|
+
|
|
20
|
+
Top-level `SKILL.md` references the two new rule files.
|
|
21
|
+
|
|
22
|
+
Corrections shipped as separate commits:
|
|
23
|
+
- `9af7a2f` — fixed monorepo sibling names and added `ORCHESTRATOR.md` pointer per team broadcast.
|
|
24
|
+
- `722cf8d` — added schema-fetch as the 5th studio verb (previous draft had 4 POSTs; the read-only GET `/api/schema` is the boot-time handshake).
|
|
25
|
+
|
|
26
|
+
### Pass 2 — Routing table cross-reference (`6437435`)
|
|
27
|
+
|
|
28
|
+
Methodology: parsed `skills-manifest.json` programmatically, grep-verified each of the 50 skill names against `skills/cmo/SKILL.md` + `rules/*.md`.
|
|
29
|
+
|
|
30
|
+
Findings:
|
|
31
|
+
- All 50 manifest skills have surface in cmo rules. No orphans.
|
|
32
|
+
- All playbook skill references resolve (only unknown token was `mktg-studio`, which is the binary name referenced from the new Studio Launch playbook).
|
|
33
|
+
- postiz, brand-kit-playground, content-atomizer triggers all match the manifest.
|
|
34
|
+
|
|
35
|
+
One gap fixed: `firecrawl` had no positive routing row — only appeared as NOT-THIS in disambiguation. Added a routing row + three disambiguation rows clarifying the `firecrawl` / Exa MCP / `/last30days` decision tree.
|
|
36
|
+
|
|
37
|
+
### Pass 3 — Error recovery, ecosystem axis, quality gate verification (`e34bfe6`, `95b67e1`, this commit)
|
|
38
|
+
|
|
39
|
+
`rules/error-recovery.md`: four new rows.
|
|
40
|
+
- Studio offline: revert to standalone mode, skip all studio POSTs, no backfill on reconnect.
|
|
41
|
+
- SSE drop: hashed activity POSTs vs rendered UI lag detection, 60-second backoff, tied to the studio reconnect fix.
|
|
42
|
+
- Postiz rate limit (30/hour): three-tier fallback chain (typefully for the platforms it covers, then file adapter for the rest, then pause + persist + resume). Never silently wait the hour.
|
|
43
|
+
- Postiz instance unreachable (non-rate-limit): degrade with honesty, name the failing base URL.
|
|
44
|
+
|
|
45
|
+
`rules/progressive-enhancement.md`: added the E0-E4 ecosystem axis as a complement (not replacement) to the existing L0-L4 brand axis.
|
|
46
|
+
- E0 CLI only, E1 +brand, E2 +studio, E3 +postiz, E4 +full ecosystem.
|
|
47
|
+
- Two-axis routing section: L4/E0 ships polished copy to files, L1/E3 distributes thin content loudly, sweet spot is L3+/E2+.
|
|
48
|
+
|
|
49
|
+
`rules/quality-gate.md`: verified against current skill surface. The 4-gate chain (editorial-first-pass → ai-check → mktg-content-reviewer → mktg-seo-analyst) is current. No new review skills have landed since the rule was written. No edit required.
|
|
50
|
+
|
|
51
|
+
### Summary by the numbers
|
|
52
|
+
|
|
53
|
+
- 2 new rule files (studio-integration, monorepo)
|
|
54
|
+
- 2 new playbooks (Studio Launch, Agent Team Coordination)
|
|
55
|
+
- 1 new routing row + 3 disambiguation rows (firecrawl)
|
|
56
|
+
- 4 new error-recovery rows (studio offline, SSE drop, postiz rate limit, postiz unreachable)
|
|
57
|
+
- 1 new progressive-enhancement axis (E0-E4)
|
|
58
|
+
- ~450 lines added across 7 commits
|
|
59
|
+
- 0 destructive rebases, 0 stale skill references, 0 orphan manifest entries
|
|
60
|
+
|
|
61
|
+
Next: F2 (#20) — cross-check marketing-cli + new studio command against `/agent-dx-cli-scale`.
|