boost-skill-cli 1.0.316__tar.gz → 1.0.317__tar.gz
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.
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/CLAUDE.md +10 -3
- {boost_skill_cli-1.0.316/boost_skill_cli.egg-info → boost_skill_cli-1.0.317}/PKG-INFO +28 -8
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/README.md +27 -7
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/discovery.py +37 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/quality.py +3 -19
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/dense.py +30 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/mcp.py +26 -1
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317/boost_skill_cli.egg-info}/PKG-INFO +28 -8
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/mcp-hub.html +8 -6
- boost_skill_cli-1.0.317/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +49 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap.html +24 -16
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_discovery.py +65 -1
- boost_skill_cli-1.0.317/tests/unit/test_dense_fix_hint.py +131 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dense_status.py +31 -3
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_embed.py +26 -1
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcp.py +53 -1
- boost_skill_cli-1.0.316/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -41
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.gitattributes +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.gitignore +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/.vale.ini +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/LICENSE +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/Makefile +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/codecov.yml +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/index.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/README.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/examples/README.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/index.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/noxfile.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/setup.cfg +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/README.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/boost.css +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/boost.js +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/style/demo.html +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.316 → boost_skill_cli-1.0.317}/tests/visual/visual_check.mjs +0 -0
|
@@ -228,9 +228,16 @@ each agent's skills dir, and updating the lock file.
|
|
|
228
228
|
**Search has two engines**, both in `core/`: `rag.py` is the always-on,
|
|
229
229
|
zero-dependency BM25 engine (full-content index, auto-builds on first
|
|
230
230
|
search — this is what the required `eval` gate floors at recall@k ≥ 0.85).
|
|
231
|
-
`dense.py` is optional dense/vector retrieval behind the `[rag]` extra
|
|
232
|
-
|
|
233
|
-
|
|
231
|
+
`dense.py` is optional dense/vector retrieval behind the `[rag]` extra —
|
|
232
|
+
**no API key required**: `embed.py` tries Voyage, then OpenAI, then a local
|
|
233
|
+
`BAAI/bge-small-en-v1.5` that ships with the extra, so a key is a quality
|
|
234
|
+
upgrade rather than the entry fee. When both engines are built, `retrieve_any`
|
|
235
|
+
fuses them with reciprocal rank fusion (`rag.rrf_fuse`, `RRF_K = 60`) and
|
|
236
|
+
reports `hybrid RRF`; it degrades to whichever single engine is ready, and to
|
|
237
|
+
BM25 alone otherwise. `dense.status()` names which of the three links (extra,
|
|
238
|
+
backend, built store) is missing, and `dense.fix_hint()` maps that to the one
|
|
239
|
+
next action — both `boost doctor` and `boost search` read that same table, so
|
|
240
|
+
they can't give contradictory advice. `core/ai.py` wraps the
|
|
234
241
|
opt-in LLM-assisted paths (`search --smart`, `explain`, `distill`, `infer`,
|
|
235
242
|
`absorb`, `evolve`, `simulate`, …), shelling out to the `claude` CLI or
|
|
236
243
|
`ANTHROPIC_API_KEY` when available and degrading to heuristics when not.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.317
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -786,17 +786,37 @@ pipx upgrade boost-skill-cli # or: pip install --upgrade boost-skill-cli
|
|
|
786
786
|
The default install is **zero-dependency** (pure stdlib). `boost search` and the
|
|
787
787
|
`boost_search` MCP tool rank results with a built-in full-content BM25 engine —
|
|
788
788
|
the index builds automatically on your first search, so BM25 is the default with
|
|
789
|
-
no setup (`boost reindex` just forces a rebuild).
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
789
|
+
no setup (`boost reindex` just forces a rebuild).
|
|
790
|
+
|
|
791
|
+
### Configuring semantic search
|
|
792
|
+
|
|
793
|
+
BM25 matches words. It is very good when your query shares vocabulary with the
|
|
794
|
+
docs and poor when it doesn't — ask it *"my app is slow"* and it has nothing to
|
|
795
|
+
match on. Semantic search ranks by meaning instead, and boost fuses the two so
|
|
796
|
+
each covers the other's blind spot.
|
|
797
|
+
|
|
798
|
+
**No API key is required.** Two steps:
|
|
793
799
|
|
|
794
800
|
```bash
|
|
795
|
-
pip install "boost-skill-cli[rag]"
|
|
796
|
-
|
|
797
|
-
boost reindex --dense # embed chunks into the vector store
|
|
801
|
+
pip install "boost-skill-cli[rag]" # vector store + local embedding model
|
|
802
|
+
boost reindex --dense # embed your tapped registries
|
|
798
803
|
```
|
|
799
804
|
|
|
805
|
+
The first search after that downloads a small embedding model once (~133 MB,
|
|
806
|
+
sha256-pinned, cached under `~/.boost/cache/models`) and runs it on CPU. Nothing
|
|
807
|
+
is sent anywhere.
|
|
808
|
+
|
|
809
|
+
| | required | what you get |
|
|
810
|
+
|---|---|---|
|
|
811
|
+
| BM25 | nothing — it is the default | keyword matching, always on |
|
|
812
|
+
| `[rag]` extra + `reindex --dense` | no account, no key | meaning-based search, fused with BM25 |
|
|
813
|
+
| `VOYAGE_API_KEY` or `OPENAI_API_KEY` | an account | a larger embedding model; same behaviour otherwise |
|
|
814
|
+
|
|
815
|
+
A key is a **quality upgrade, not an entry fee** — set one and boost prefers it
|
|
816
|
+
automatically, re-embedding on the next `reindex --dense`. Every layer degrades
|
|
817
|
+
rather than failing: no extra, no key, or no built store each fall back to BM25,
|
|
818
|
+
and `boost doctor` reports which engine is actually serving and why.
|
|
819
|
+
|
|
800
820
|
Want the whole ecosystem instead of the starter set? boost ships a **curated
|
|
801
821
|
registry catalog** — 460+ classified GitHub registries of skills, Cursor/Windsurf
|
|
802
822
|
**rules**, and Claude Code **workflows** (slash commands & subagents),
|
|
@@ -68,17 +68,37 @@ pipx upgrade boost-skill-cli # or: pip install --upgrade boost-skill-cli
|
|
|
68
68
|
The default install is **zero-dependency** (pure stdlib). `boost search` and the
|
|
69
69
|
`boost_search` MCP tool rank results with a built-in full-content BM25 engine —
|
|
70
70
|
the index builds automatically on your first search, so BM25 is the default with
|
|
71
|
-
no setup (`boost reindex` just forces a rebuild).
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
no setup (`boost reindex` just forces a rebuild).
|
|
72
|
+
|
|
73
|
+
### Configuring semantic search
|
|
74
|
+
|
|
75
|
+
BM25 matches words. It is very good when your query shares vocabulary with the
|
|
76
|
+
docs and poor when it doesn't — ask it *"my app is slow"* and it has nothing to
|
|
77
|
+
match on. Semantic search ranks by meaning instead, and boost fuses the two so
|
|
78
|
+
each covers the other's blind spot.
|
|
79
|
+
|
|
80
|
+
**No API key is required.** Two steps:
|
|
75
81
|
|
|
76
82
|
```bash
|
|
77
|
-
pip install "boost-skill-cli[rag]"
|
|
78
|
-
|
|
79
|
-
boost reindex --dense # embed chunks into the vector store
|
|
83
|
+
pip install "boost-skill-cli[rag]" # vector store + local embedding model
|
|
84
|
+
boost reindex --dense # embed your tapped registries
|
|
80
85
|
```
|
|
81
86
|
|
|
87
|
+
The first search after that downloads a small embedding model once (~133 MB,
|
|
88
|
+
sha256-pinned, cached under `~/.boost/cache/models`) and runs it on CPU. Nothing
|
|
89
|
+
is sent anywhere.
|
|
90
|
+
|
|
91
|
+
| | required | what you get |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| BM25 | nothing — it is the default | keyword matching, always on |
|
|
94
|
+
| `[rag]` extra + `reindex --dense` | no account, no key | meaning-based search, fused with BM25 |
|
|
95
|
+
| `VOYAGE_API_KEY` or `OPENAI_API_KEY` | an account | a larger embedding model; same behaviour otherwise |
|
|
96
|
+
|
|
97
|
+
A key is a **quality upgrade, not an entry fee** — set one and boost prefers it
|
|
98
|
+
automatically, re-embedding on the next `reindex --dense`. Every layer degrades
|
|
99
|
+
rather than failing: no extra, no key, or no built store each fall back to BM25,
|
|
100
|
+
and `boost doctor` reports which engine is actually serving and why.
|
|
101
|
+
|
|
82
102
|
Want the whole ecosystem instead of the starter set? boost ships a **curated
|
|
83
103
|
registry catalog** — 460+ classified GitHub registries of skills, Cursor/Windsurf
|
|
84
104
|
**rules**, and Claude Code **workflows** (slash commands & subagents),
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.317'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 317)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -12,6 +12,7 @@ import re
|
|
|
12
12
|
import shutil
|
|
13
13
|
import subprocess
|
|
14
14
|
import sys
|
|
15
|
+
import textwrap
|
|
15
16
|
import threading
|
|
16
17
|
import time
|
|
17
18
|
import urllib.parse
|
|
@@ -122,6 +123,7 @@ def cmd_search(argv):
|
|
|
122
123
|
if not scored:
|
|
123
124
|
out.info("no matches for %r" % query)
|
|
124
125
|
out.info(out.role("try `boost discover %s` to search all of GitHub" % query, "muted"))
|
|
126
|
+
_hint_semantic_search(engine)
|
|
125
127
|
return 0
|
|
126
128
|
# The CLI's long-standing wording for the BM25 engine differs from the label
|
|
127
129
|
# rag/eval use ("BM25 full-content"), and both are load-bearing: the latter
|
|
@@ -154,9 +156,44 @@ def cmd_search(argv):
|
|
|
154
156
|
+ out.truncate(e["description"] or "", desc_w) + tag)
|
|
155
157
|
out.info(out.role("%d match%s · ranked by %s"
|
|
156
158
|
% (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
|
|
159
|
+
_hint_semantic_search(engine)
|
|
157
160
|
return 0
|
|
158
161
|
|
|
159
162
|
|
|
163
|
+
def _hint_semantic_search(engine: str) -> None:
|
|
164
|
+
"""Say that a better engine exists, when BM25 answered alone.
|
|
165
|
+
|
|
166
|
+
`boost search` reported which engine *ran* and never that a better one was
|
|
167
|
+
available, so a user who installed the extra but never reindexed had no way
|
|
168
|
+
to learn the semantic search they think they enabled has never once run.
|
|
169
|
+
That is the silent half of the three-things-must-line-up problem, and
|
|
170
|
+
`boost doctor` was the only surface that said anything about it.
|
|
171
|
+
|
|
172
|
+
Deliberately quiet: one muted line, only when dense contributed nothing, and
|
|
173
|
+
naming the ONE next action rather than the whole setup. The remedy comes
|
|
174
|
+
from core.dense.fix_hint — the same table doctor reads — so the two surfaces
|
|
175
|
+
can never disagree about whether an API key is needed.
|
|
176
|
+
"""
|
|
177
|
+
if engine != "BM25 full-content":
|
|
178
|
+
# Anything else either already used vectors ("dense vectors", "hybrid
|
|
179
|
+
# RRF") or is the frontmatter fallback, where the BM25 index failed to
|
|
180
|
+
# build — a louder problem that this hint would only paper over.
|
|
181
|
+
return
|
|
182
|
+
from ..core import dense
|
|
183
|
+
st = dense.status()
|
|
184
|
+
if st.get("ready"):
|
|
185
|
+
return
|
|
186
|
+
# Wrap to the pane like every other row here: at COLUMNS=60 the longest
|
|
187
|
+
# remedy is 82 characters and would be the one line in this output that
|
|
188
|
+
# blows the terminal width. `break_long_words=False` keeps the shell command
|
|
189
|
+
# runnable — a copy-pasteable `pip install ...` matters more than a hard
|
|
190
|
+
# clamp, and _FIX is tested to hold no token long enough to overflow.
|
|
191
|
+
msg = "semantic search is off — %s" % dense.fix_hint(st.get("reason", ""))
|
|
192
|
+
for line in textwrap.wrap(msg, max(out.term_width(), 20),
|
|
193
|
+
break_long_words=False, break_on_hyphens=False):
|
|
194
|
+
out.info(out.role(line, "muted"))
|
|
195
|
+
|
|
196
|
+
|
|
160
197
|
def cmd_reindex(argv):
|
|
161
198
|
"""Build/refresh the full-content (RAG) search index over tapped items."""
|
|
162
199
|
p = cliparse.parser(
|
|
@@ -407,24 +407,8 @@ def cmd_doctor(argv):
|
|
|
407
407
|
return 1 if issues else 0
|
|
408
408
|
|
|
409
409
|
|
|
410
|
-
#
|
|
411
|
-
#
|
|
412
|
-
# first missing link is ever reported, so these never chain.
|
|
413
|
-
_DENSE_FIX = {
|
|
414
|
-
"no-backend": "install the extra: `pip install 'boost-skill-cli[rag]'`",
|
|
415
|
-
# Names the keyless remedy first: since the [rag] extra carries a local
|
|
416
|
-
# embedding model, an API key is the quality ceiling, not the entry fee.
|
|
417
|
-
# This reason now means "no key AND no local backend", which in practice is
|
|
418
|
-
# a partial install or BOOST_NO_EMBED.
|
|
419
|
-
"no-key": ("reinstall the extra: `pip install 'boost-skill-cli[rag]'` "
|
|
420
|
-
"(or set VOYAGE_API_KEY / OPENAI_API_KEY for a larger model)"),
|
|
421
|
-
"no-store": "build it: `boost reindex --dense`",
|
|
422
|
-
"version-changed": "rebuild it: `boost reindex --dense --force`",
|
|
423
|
-
"provider-changed": "rebuild it: `boost reindex --dense --force`",
|
|
424
|
-
"model-changed": "rebuild it: `boost reindex --dense --force`",
|
|
425
|
-
"dim-changed": "rebuild it: `boost reindex --dense --force`",
|
|
426
|
-
"empty": "rebuild it: `boost reindex --dense --force`",
|
|
427
|
-
}
|
|
410
|
+
# The remedy table moved to core.dense.fix_hint so `boost search` reports the
|
|
411
|
+
# same next action as `boost doctor` — see that function for why.
|
|
428
412
|
|
|
429
413
|
|
|
430
414
|
def _report_search_engine(bad) -> None:
|
|
@@ -445,7 +429,7 @@ def _report_search_engine(bad) -> None:
|
|
|
445
429
|
st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
|
|
446
430
|
return
|
|
447
431
|
|
|
448
|
-
fix =
|
|
432
|
+
fix = dense.fix_hint(st["reason"])
|
|
449
433
|
if st["degraded"]:
|
|
450
434
|
# The store was built and is now dead weight: say what it holds, what
|
|
451
435
|
# changed, and that search has silently been on BM25 the whole time.
|
|
@@ -134,6 +134,36 @@ def _recorded_meta() -> dict:
|
|
|
134
134
|
con.close()
|
|
135
135
|
|
|
136
136
|
|
|
137
|
+
# Why dense retrieval isn't serving, keyed by the `reason` status() returns.
|
|
138
|
+
# Each names the ONE next action; the reason order in status() guarantees only
|
|
139
|
+
# the first missing link is ever reported, so these never chain.
|
|
140
|
+
#
|
|
141
|
+
# Lives here rather than in a command module because two surfaces need the same
|
|
142
|
+
# answer — `boost doctor` and `boost search` — and two copies would drift, which
|
|
143
|
+
# is how a surface ends up telling a user to set an API key that the [rag]
|
|
144
|
+
# extra's local model already made unnecessary.
|
|
145
|
+
_FIX = {
|
|
146
|
+
"no-backend": "install the extra: `pip install 'boost-skill-cli[rag]'`",
|
|
147
|
+
# Names the keyless remedy first: since the [rag] extra carries a local
|
|
148
|
+
# embedding model, an API key is the quality ceiling, not the entry fee.
|
|
149
|
+
# This reason means "no key AND no local backend", which in practice is a
|
|
150
|
+
# partial install or BOOST_NO_EMBED.
|
|
151
|
+
"no-key": ("reinstall the extra: `pip install 'boost-skill-cli[rag]'` "
|
|
152
|
+
"(or set VOYAGE_API_KEY / OPENAI_API_KEY for a larger model)"),
|
|
153
|
+
"no-store": "build it: `boost reindex --dense`",
|
|
154
|
+
"version-changed": "rebuild it: `boost reindex --dense --force`",
|
|
155
|
+
"provider-changed": "rebuild it: `boost reindex --dense --force`",
|
|
156
|
+
"model-changed": "rebuild it: `boost reindex --dense --force`",
|
|
157
|
+
"dim-changed": "rebuild it: `boost reindex --dense --force`",
|
|
158
|
+
"empty": "rebuild it: `boost reindex --dense --force`",
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def fix_hint(reason: str) -> str:
|
|
163
|
+
"""The single next action for a `status()` reason, or a safe default."""
|
|
164
|
+
return _FIX.get(reason, "see `boost reindex --dense`")
|
|
165
|
+
|
|
166
|
+
|
|
137
167
|
def status() -> dict:
|
|
138
168
|
"""Why dense retrieval is, or is not, serving queries.
|
|
139
169
|
|
|
@@ -132,6 +132,31 @@ INSTRUCTIONS = (
|
|
|
132
132
|
)
|
|
133
133
|
|
|
134
134
|
|
|
135
|
+
def engine_note() -> str:
|
|
136
|
+
"""One line telling the agent which retrieval engine `boost_search` will use.
|
|
137
|
+
|
|
138
|
+
MCP hosts load `instructions` into the agent's context, and an agent that
|
|
139
|
+
cannot tell a keyword index from a semantic one will phrase queries for a
|
|
140
|
+
vector search that is not running — asking "my containers keep restarting"
|
|
141
|
+
of a BM25 index that needs the word "docker". Naming the engine, and the one
|
|
142
|
+
command that upgrades it, costs a line and removes the guess.
|
|
143
|
+
|
|
144
|
+
Appended at `initialize` rather than baked into INSTRUCTIONS because the
|
|
145
|
+
answer depends on machine state at connect time, not on the build.
|
|
146
|
+
"""
|
|
147
|
+
from . import dense
|
|
148
|
+
st = dense.status()
|
|
149
|
+
if st.get("ready"):
|
|
150
|
+
return ("\n\nSEARCH ENGINE: hybrid — BM25 keywords fused with dense "
|
|
151
|
+
"vectors (%s). Natural-language problem descriptions retrieve "
|
|
152
|
+
"well; you do not need to guess the skill's vocabulary."
|
|
153
|
+
% st.get("model"))
|
|
154
|
+
return ("\n\nSEARCH ENGINE: BM25 keyword matching only — dense vectors are "
|
|
155
|
+
"not configured, so queries are matched on shared words rather than "
|
|
156
|
+
"meaning. Prefer concrete terms over paraphrase. To enable semantic "
|
|
157
|
+
"search, %s." % dense.fix_hint(st.get("reason", "")))
|
|
158
|
+
|
|
159
|
+
|
|
135
160
|
def handle_request(req: dict, *, version: str,
|
|
136
161
|
registry: Registry) -> Optional[dict]:
|
|
137
162
|
"""Map one parsed JSON-RPC request to its response dict.
|
|
@@ -149,7 +174,7 @@ def handle_request(req: dict, *, version: str,
|
|
|
149
174
|
resp["result"] = {"protocolVersion": PROTOCOL_VERSION,
|
|
150
175
|
"capabilities": {"tools": {}},
|
|
151
176
|
"serverInfo": {"name": "boost", "version": version},
|
|
152
|
-
"instructions": INSTRUCTIONS}
|
|
177
|
+
"instructions": INSTRUCTIONS + engine_note()}
|
|
153
178
|
elif method == "ping":
|
|
154
179
|
resp["result"] = {}
|
|
155
180
|
elif method == "tools/list":
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.317
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -786,17 +786,37 @@ pipx upgrade boost-skill-cli # or: pip install --upgrade boost-skill-cli
|
|
|
786
786
|
The default install is **zero-dependency** (pure stdlib). `boost search` and the
|
|
787
787
|
`boost_search` MCP tool rank results with a built-in full-content BM25 engine —
|
|
788
788
|
the index builds automatically on your first search, so BM25 is the default with
|
|
789
|
-
no setup (`boost reindex` just forces a rebuild).
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
789
|
+
no setup (`boost reindex` just forces a rebuild).
|
|
790
|
+
|
|
791
|
+
### Configuring semantic search
|
|
792
|
+
|
|
793
|
+
BM25 matches words. It is very good when your query shares vocabulary with the
|
|
794
|
+
docs and poor when it doesn't — ask it *"my app is slow"* and it has nothing to
|
|
795
|
+
match on. Semantic search ranks by meaning instead, and boost fuses the two so
|
|
796
|
+
each covers the other's blind spot.
|
|
797
|
+
|
|
798
|
+
**No API key is required.** Two steps:
|
|
793
799
|
|
|
794
800
|
```bash
|
|
795
|
-
pip install "boost-skill-cli[rag]"
|
|
796
|
-
|
|
797
|
-
boost reindex --dense # embed chunks into the vector store
|
|
801
|
+
pip install "boost-skill-cli[rag]" # vector store + local embedding model
|
|
802
|
+
boost reindex --dense # embed your tapped registries
|
|
798
803
|
```
|
|
799
804
|
|
|
805
|
+
The first search after that downloads a small embedding model once (~133 MB,
|
|
806
|
+
sha256-pinned, cached under `~/.boost/cache/models`) and runs it on CPU. Nothing
|
|
807
|
+
is sent anywhere.
|
|
808
|
+
|
|
809
|
+
| | required | what you get |
|
|
810
|
+
|---|---|---|
|
|
811
|
+
| BM25 | nothing — it is the default | keyword matching, always on |
|
|
812
|
+
| `[rag]` extra + `reindex --dense` | no account, no key | meaning-based search, fused with BM25 |
|
|
813
|
+
| `VOYAGE_API_KEY` or `OPENAI_API_KEY` | an account | a larger embedding model; same behaviour otherwise |
|
|
814
|
+
|
|
815
|
+
A key is a **quality upgrade, not an entry fee** — set one and boost prefers it
|
|
816
|
+
automatically, re-embedding on the next `reindex --dense`. Every layer degrades
|
|
817
|
+
rather than failing: no extra, no key, or no built store each fall back to BM25,
|
|
818
|
+
and `boost doctor` reports which engine is actually serving and why.
|
|
819
|
+
|
|
800
820
|
Want the whole ecosystem instead of the starter set? boost ships a **curated
|
|
801
821
|
registry catalog** — 460+ classified GitHub registries of skills, Cursor/Windsurf
|
|
802
822
|
**rules**, and Claude Code **workflows** (slash commands & subagents),
|
|
@@ -485,6 +485,7 @@ tests/unit/test_community_health_files.py
|
|
|
485
485
|
tests/unit/test_config.py
|
|
486
486
|
tests/unit/test_dense.py
|
|
487
487
|
tests/unit/test_dense_fallback.py
|
|
488
|
+
tests/unit/test_dense_fix_hint.py
|
|
488
489
|
tests/unit/test_dense_status.py
|
|
489
490
|
tests/unit/test_dependabot_config.py
|
|
490
491
|
tests/unit/test_docs_pages_linked.py
|
|
@@ -222,9 +222,9 @@
|
|
|
222
222
|
<!-- embed -->
|
|
223
223
|
<rect x="480" y="200" width="180" height="86" rx="12" fill="rgba(244,114,208,.07)" stroke="#f472d0" stroke-width="1.2"/>
|
|
224
224
|
<text x="570" y="228" text-anchor="middle" class="head">embed (urllib)</text>
|
|
225
|
-
<text x="570" y="248" text-anchor="middle" class="lbl-s">Voyage · OpenAI</text>
|
|
226
|
-
<text x="570" y="265" text-anchor="middle" class="lbl-t" textLength="164" lengthAdjust="spacingAndGlyphs">voyage-
|
|
227
|
-
<text x="570" y="280" text-anchor="middle" class="note">opt-in ·
|
|
225
|
+
<text x="570" y="248" text-anchor="middle" class="lbl-s">Voyage · OpenAI · local</text>
|
|
226
|
+
<text x="570" y="265" text-anchor="middle" class="lbl-t" textLength="164" lengthAdjust="spacingAndGlyphs">voyage-4 1024 / bge-small 384</text>
|
|
227
|
+
<text x="570" y="280" text-anchor="middle" class="note">opt-in · no key needed</text>
|
|
228
228
|
<line x1="420" y1="170" x2="480" y2="235" stroke="#f472d0" stroke-width="1.4" marker-end="url(#iap)"/>
|
|
229
229
|
|
|
230
230
|
<!-- dense store -->
|
|
@@ -590,13 +590,15 @@ _MCP_TOOLS = REGISTRY.specs() <span class="cm"># list stays in sync</span>
|
|
|
590
590
|
<summary>Search by meaning, not words <span class="topic-tag">dense</span></summary>
|
|
591
591
|
<div class="body"><p>An optional upgrade turns every skill into a point in "meaning space,"
|
|
592
592
|
so "test my React app" can find a <code>jest</code> skill even with no shared words —
|
|
593
|
-
it just finds the nearest points. It's optional because it needs an extra install
|
|
593
|
+
it just finds the nearest points. It's optional because it needs an extra install — but not a key.</p></div>
|
|
594
594
|
</details>
|
|
595
595
|
<details class="card tech">
|
|
596
596
|
<summary>Dense embeddings + sqlite-vec <span class="topic-tag">Phase 2 · [rag]</span></summary>
|
|
597
597
|
<div class="body"><p>Chunks are embedded via <code>embed</code> over urllib — preferring
|
|
598
|
-
<code>VOYAGE_API_KEY</code> (<code>voyage-
|
|
599
|
-
(<code>text-embedding-3-small</code>, 1536-d)
|
|
598
|
+
<code>VOYAGE_API_KEY</code> (<code>voyage-4</code>, 1024-d), then <code>OPENAI_API_KEY</code>
|
|
599
|
+
(<code>text-embedding-3-small</code>, 1536-d), and falling back to a local
|
|
600
|
+
<code>BAAI/bge-small-en-v1.5</code> (384-d) that ships with the extra and needs no
|
|
601
|
+
key at all — and stored in a <code>sqlite-vec</code>
|
|
600
602
|
<code>vec0(… distance_metric=cosine)</code> table. Retrieval does a KNN over-fetch
|
|
601
603
|
(<code>max(k×8, 200)</code>) then reduces per-entry. A provider/dimension change
|
|
602
604
|
invalidates the store so stale vectors are never served.</p></div>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: prerequisites-and-semantic-search-setup
|
|
3
|
+
board: code
|
|
4
|
+
section: docsite
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Docs · Setup
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 3
|
|
10
|
+
note: silent BM25-only is the default outcome
|
|
11
|
+
order: 58
|
|
12
|
+
owner: loop/semantic-search-setup
|
|
13
|
+
pr: 364
|
|
14
|
+
title: Nothing tells a user semantic search is off — not the README, not <code>search</code>, not <code>/mcp</code>
|
|
15
|
+
---
|
|
16
|
+
<b>Shipped.</b> Dense retrieval needs things to line up — the <code>[rag]</code>
|
|
17
|
+
extra (<code>sqlite-vec</code> plus a bundled local model, so an embeddings key
|
|
18
|
+
is now a quality upgrade rather than the entry fee) <em>and</em> a built vector
|
|
19
|
+
store (<code>boost reindex --dense</code>) — and every one of them failed
|
|
20
|
+
<em>silently</em>: <code>rag.retrieve_any</code> floors to BM25 and returns, so a
|
|
21
|
+
user who installed the extra but never set a key, or set a key but never
|
|
22
|
+
reindexed, has no way to learn that the semantic search they think they enabled
|
|
23
|
+
had never once run. Three gaps, all closed:
|
|
24
|
+
<b>(1) README.</b> Prerequisites live in half a sentence (“Needs Python 3.9+
|
|
25
|
+
and <code>git</code>”) and the optional stack is buried in Install prose.
|
|
26
|
+
Give required vs. optional prerequisites a dedicated
|
|
27
|
+
<b>Configuring semantic search</b> section, and automate the optional install the
|
|
28
|
+
way <code>requirements/*.txt</code> already does for the toolchain, so it is one
|
|
29
|
+
command rather than three remembered ones.
|
|
30
|
+
<b>(2) Surfacing.</b> <code>cmd_search</code> printed which engine <em>ran</em> but
|
|
31
|
+
never that a better one was available — <code>embed.fallback_note()</code> exists
|
|
32
|
+
and is only wired into <code>reindex --dense</code>. Now said on search — including the
|
|
33
|
+
zero-results path, where a keyword engine finding nothing is exactly what a
|
|
34
|
+
semantic one is for — and silent when vectors already served or output is
|
|
35
|
+
<code>--json</code>. The remedy table moved out of <code>commands/quality.py</code>
|
|
36
|
+
into <code>core.dense.fix_hint</code>, so <code>doctor</code> and
|
|
37
|
+
<code>search</code> cannot give contradictory advice; it had no tests at all,
|
|
38
|
+
which is how its “set an API key” entry went stale. Engine state also
|
|
39
|
+
lands in the MCP <code>initialize</code> <code>instructions</code>, appended at
|
|
40
|
+
connect time, so an agent reading <code>/mcp</code> sees
|
|
41
|
+
“BM25 keyword matching only” instead of assuming vector search.
|
|
42
|
+
<b>(3) Stale docs.</b> <code>mcp-hub.html</code> advertised
|
|
43
|
+
<code>voyage-3</code> (1024-d) in the pipeline diagram and the Phase 2
|
|
44
|
+
details block; <code>core/embed.py</code> has pinned <code>voyage-4</code> since
|
|
45
|
+
the complimentary-token change; the sweep also caught the diagram and prose
|
|
46
|
+
still calling a key mandatory, and the same claim in <code>CLAUDE.md</code>.
|
|
47
|
+
Three environment-dependent tests were fixed on the way: they asserted answers
|
|
48
|
+
that were only correct where the <code>[rag]</code> extra was <em>absent</em>,
|
|
49
|
+
so they were green on CI and red on any machine that had installed it.
|
|
@@ -4571,34 +4571,42 @@ pip/pipx installs and telling a PyPI user to clone the repo — is separate and
|
|
|
4571
4571
|
</article>
|
|
4572
4572
|
|
|
4573
4573
|
<article class="cap rcard" id="prerequisites-and-semantic-search-setup">
|
|
4574
|
-
<div class="head"><span class="pill
|
|
4574
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Docs · Setup</span></div>
|
|
4575
4575
|
<h3>Nothing tells a user semantic search is off — not the README, not <code>search</code>, not <code>/mcp</code></h3>
|
|
4576
|
-
<p>Dense retrieval needs
|
|
4577
|
-
extra (<code>sqlite-vec</code>
|
|
4578
|
-
|
|
4579
|
-
(<code>boost reindex --dense</code>) — and every one of them
|
|
4576
|
+
<p><b>Shipped.</b> Dense retrieval needs things to line up — the <code>[rag]</code>
|
|
4577
|
+
extra (<code>sqlite-vec</code> plus a bundled local model, so an embeddings key
|
|
4578
|
+
is now a quality upgrade rather than the entry fee) <em>and</em> a built vector
|
|
4579
|
+
store (<code>boost reindex --dense</code>) — and every one of them failed
|
|
4580
4580
|
<em>silently</em>: <code>rag.retrieve_any</code> floors to BM25 and returns, so a
|
|
4581
4581
|
user who installed the extra but never set a key, or set a key but never
|
|
4582
4582
|
reindexed, has no way to learn that the semantic search they think they enabled
|
|
4583
|
-
|
|
4583
|
+
had never once run. Three gaps, all closed:
|
|
4584
4584
|
<b>(1) README.</b> Prerequisites live in half a sentence (“Needs Python 3.9+
|
|
4585
4585
|
and <code>git</code>”) and the optional stack is buried in Install prose.
|
|
4586
4586
|
Give required vs. optional prerequisites a dedicated
|
|
4587
4587
|
<b>Configuring semantic search</b> section, and automate the optional install the
|
|
4588
4588
|
way <code>requirements/*.txt</code> already does for the toolchain, so it is one
|
|
4589
4589
|
command rather than three remembered ones.
|
|
4590
|
-
<b>(2) Surfacing.</b> <code>cmd_search</code>
|
|
4591
|
-
never that a better one
|
|
4592
|
-
and is only wired into <code>reindex --dense</code>.
|
|
4593
|
-
|
|
4594
|
-
|
|
4595
|
-
<code
|
|
4596
|
-
|
|
4597
|
-
<
|
|
4590
|
+
<b>(2) Surfacing.</b> <code>cmd_search</code> printed which engine <em>ran</em> but
|
|
4591
|
+
never that a better one was available — <code>embed.fallback_note()</code> exists
|
|
4592
|
+
and is only wired into <code>reindex --dense</code>. Now said on search — including the
|
|
4593
|
+
zero-results path, where a keyword engine finding nothing is exactly what a
|
|
4594
|
+
semantic one is for — and silent when vectors already served or output is
|
|
4595
|
+
<code>--json</code>. The remedy table moved out of <code>commands/quality.py</code>
|
|
4596
|
+
into <code>core.dense.fix_hint</code>, so <code>doctor</code> and
|
|
4597
|
+
<code>search</code> cannot give contradictory advice; it had no tests at all,
|
|
4598
|
+
which is how its “set an API key” entry went stale. Engine state also
|
|
4599
|
+
lands in the MCP <code>initialize</code> <code>instructions</code>, appended at
|
|
4600
|
+
connect time, so an agent reading <code>/mcp</code> sees
|
|
4601
|
+
“BM25 keyword matching only” instead of assuming vector search.
|
|
4602
|
+
<b>(3) Stale docs.</b> <code>mcp-hub.html</code> advertised
|
|
4598
4603
|
<code>voyage-3</code> (1024-d) in the pipeline diagram and the Phase 2
|
|
4599
4604
|
details block; <code>core/embed.py</code> has pinned <code>voyage-4</code> since
|
|
4600
|
-
the complimentary-token change
|
|
4601
|
-
|
|
4605
|
+
the complimentary-token change; the sweep also caught the diagram and prose
|
|
4606
|
+
still calling a key mandatory, and the same claim in <code>CLAUDE.md</code>.
|
|
4607
|
+
Three environment-dependent tests were fixed on the way: they asserted answers
|
|
4608
|
+
that were only correct where the <code>[rag]</code> extra was <em>absent</em>,
|
|
4609
|
+
so they were green on CI and red on any machine that had installed it.</p>
|
|
4602
4610
|
<div class="meta">
|
|
4603
4611
|
<span class="m">Complexity <b>M</b></span>
|
|
4604
4612
|
<span class="m hi">Impact <b>High</b></span>
|
|
@@ -1084,7 +1084,15 @@ class TestReindex:
|
|
|
1084
1084
|
r = boost("search", "brainstorming")
|
|
1085
1085
|
assert "ranked by full-content BM25" in r.out
|
|
1086
1086
|
|
|
1087
|
-
def
|
|
1087
|
+
def test_dense_skipped_when_no_backend_at_all(self, boost, tapped, monkeypatch):
|
|
1088
|
+
"""No key and no local model: BM25 still builds, dense says why it didn't.
|
|
1089
|
+
|
|
1090
|
+
`local_available` is forced off because the [rag] extra now ships a
|
|
1091
|
+
model — without this the command really does build a dense index here,
|
|
1092
|
+
and the assertion below was passing only where the extra was absent.
|
|
1093
|
+
"""
|
|
1094
|
+
from boost_cli.core import embed
|
|
1095
|
+
monkeypatch.setattr(embed, "local_available", lambda: False)
|
|
1088
1096
|
r = boost("reindex", "--dense")
|
|
1089
1097
|
assert "indexed" in r.out # BM25 still builds
|
|
1090
1098
|
assert "dense index skipped" in r.out
|
|
@@ -1162,3 +1170,59 @@ class TestReindex:
|
|
|
1162
1170
|
assert "dense vector store is empty" in r.out
|
|
1163
1171
|
assert "--force" in r.out
|
|
1164
1172
|
assert dense.ready() is False
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
class TestSearchSemanticHint:
|
|
1176
|
+
"""`boost search` must say a better engine exists, not just which one ran.
|
|
1177
|
+
|
|
1178
|
+
The gap this closes: search reported "ranked by full-content BM25" and
|
|
1179
|
+
stopped. A user who installed the [rag] extra but never ran `boost reindex
|
|
1180
|
+
--dense` saw nothing to suggest the semantic search they think they enabled
|
|
1181
|
+
has never once run — `boost doctor` was the only surface that said so, and
|
|
1182
|
+
nobody runs doctor after a search that merely felt mediocre.
|
|
1183
|
+
|
|
1184
|
+
The hint is deliberately quiet, so these tests pin the *silences* as hard as
|
|
1185
|
+
the message: no hint when vectors already served, and none in --json.
|
|
1186
|
+
"""
|
|
1187
|
+
|
|
1188
|
+
def test_bm25_only_search_says_semantic_is_off(self, boost, tapped):
|
|
1189
|
+
boost("reindex")
|
|
1190
|
+
r = boost("search", "brainstorming")
|
|
1191
|
+
assert "ranked by full-content BM25" in r.out # unchanged
|
|
1192
|
+
assert "semantic search is off" in r.out
|
|
1193
|
+
|
|
1194
|
+
def test_hint_names_the_one_next_action(self, boost, tapped):
|
|
1195
|
+
# Without the extra the remedy is the install; with it, the reindex.
|
|
1196
|
+
# Either way exactly one command is named, never the whole setup.
|
|
1197
|
+
#
|
|
1198
|
+
# Matched against the whole output with whitespace collapsed, because
|
|
1199
|
+
# the hint legitimately wraps across lines in a narrow pane — asserting
|
|
1200
|
+
# on a single line made this test fail at COLUMNS=40 for a layout the
|
|
1201
|
+
# code was getting right.
|
|
1202
|
+
boost("reindex")
|
|
1203
|
+
r = boost("search", "brainstorming")
|
|
1204
|
+
flat = " ".join(r.out.split())
|
|
1205
|
+
assert "semantic search is off" in flat
|
|
1206
|
+
assert "pip install" in flat or "boost reindex --dense" in flat
|
|
1207
|
+
|
|
1208
|
+
def test_zero_results_still_hints(self, boost, tapped):
|
|
1209
|
+
# The strongest case for the hint: a keyword engine finding nothing is
|
|
1210
|
+
# exactly the shape of query a semantic one exists to answer.
|
|
1211
|
+
r = boost("search", "zzzznotathinginanycatalog")
|
|
1212
|
+
assert "no matches" in r.out
|
|
1213
|
+
assert "semantic search is off" in r.out
|
|
1214
|
+
|
|
1215
|
+
def test_json_output_carries_no_hint(self, boost, tapped):
|
|
1216
|
+
# --json is parsed by other programs; a stray human line corrupts it.
|
|
1217
|
+
boost("reindex")
|
|
1218
|
+
r = boost("search", "brainstorming", "--json")
|
|
1219
|
+
assert "semantic search is off" not in r.out
|
|
1220
|
+
json.loads(r.out) # still valid JSON
|
|
1221
|
+
|
|
1222
|
+
def test_no_hint_once_dense_is_ready(self, boost, tapped, monkeypatch):
|
|
1223
|
+
# The inverse: a user who finished the setup must never be nagged.
|
|
1224
|
+
from boost_cli.core import dense
|
|
1225
|
+
monkeypatch.setattr(dense, "status", lambda: {"ready": True, "reason": None})
|
|
1226
|
+
boost("reindex")
|
|
1227
|
+
r = boost("search", "brainstorming")
|
|
1228
|
+
assert "semantic search is off" not in r.out
|