boost-skill-cli 1.0.307__tar.gz → 1.0.309__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.307 → boost_skill_cli-1.0.309}/PKG-INFO +3 -1
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/quality.py +75 -1
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/dense.py +100 -0
- boost_skill_cli-1.0.309/boost_cli/core/embed.py +270 -0
- boost_skill_cli-1.0.309/boost_cli/core/localembed.py +245 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_skill_cli.egg-info/PKG-INFO +3 -1
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_skill_cli.egg-info/SOURCES.txt +10 -1
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_skill_cli.egg-info/requires.txt +2 -0
- boost_skill_cli-1.0.309/docs/roadmap/items/bm25-index-is-one-json-blob.md +45 -0
- boost_skill_cli-1.0.309/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +42 -0
- boost_skill_cli-1.0.309/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +67 -0
- boost_skill_cli-1.0.307/docs/roadmap/items/keyless-item.md → boost_skill_cli-1.0.309/docs/roadmap/items/keyless-semantic-search-for-everyone.md +52 -0
- boost_skill_cli-1.0.309/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +40 -0
- boost_skill_cli-1.0.309/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +41 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap.html +267 -2
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/pyproject.toml +23 -1
- boost_skill_cli-1.0.309/tests/unit/test_dense_status.py +314 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_embed.py +7 -2
- boost_skill_cli-1.0.309/tests/unit/test_embed_local.py +264 -0
- boost_skill_cli-1.0.309/tests/unit/test_localembed.py +491 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_roadmap_fresh.py +21 -0
- boost_skill_cli-1.0.307/boost_cli/core/embed.py +0 -135
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.gitattributes +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.gitignore +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/.vale.ini +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/LICENSE +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/Makefile +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/README.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/codecov.yml +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/index.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/README.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/examples/README.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/index.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/noxfile.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/setup.cfg +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/style/README.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/style/boost.css +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/style/boost.js +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/style/demo.html +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.307 → boost_skill_cli-1.0.309}/tests/visual/visual_check.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.309
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -702,6 +702,8 @@ Description-Content-Type: text/markdown
|
|
|
702
702
|
License-File: LICENSE
|
|
703
703
|
Provides-Extra: rag
|
|
704
704
|
Requires-Dist: sqlite-vec>=0.1.6; extra == "rag"
|
|
705
|
+
Requires-Dist: onnxruntime>=1.17; extra == "rag"
|
|
706
|
+
Requires-Dist: tokenizers>=0.15; extra == "rag"
|
|
705
707
|
Provides-Extra: eval
|
|
706
708
|
Requires-Dist: ranx>=0.3.20; extra == "eval"
|
|
707
709
|
Requires-Dist: ragas<0.3,>=0.2; extra == "eval"
|
|
@@ -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.309'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 309)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -365,9 +365,25 @@ def cmd_doctor(argv):
|
|
|
365
365
|
if not rotation:
|
|
366
366
|
bad("journal is overdue for rotation — run `boost heal`")
|
|
367
367
|
|
|
368
|
+
# Which search engine will actually answer a query. Dense retrieval needs
|
|
369
|
+
# three things to line up and every one of them fails silently, so doctor
|
|
370
|
+
# is where the answer belongs — `search` only ever reports the engine that
|
|
371
|
+
# already ran, never that a configured one never got the chance.
|
|
372
|
+
_report_search_engine(bad)
|
|
373
|
+
|
|
368
374
|
lp = logs.log_path()
|
|
369
375
|
if lp.exists():
|
|
370
|
-
|
|
376
|
+
# Existence is not health: a log the process cannot open makes every
|
|
377
|
+
# invocation print a PermissionError traceback from the logging module
|
|
378
|
+
# while this check happily reported a ✓ for the same file. Diagnostics
|
|
379
|
+
# are the first thing consulted when something else breaks, so a log
|
|
380
|
+
# that silently accepts nothing has to read as a fault.
|
|
381
|
+
if os.access(str(lp), os.W_OK):
|
|
382
|
+
out.ok("diagnostic log at %s" % _tilde(lp))
|
|
383
|
+
else:
|
|
384
|
+
bad("diagnostic log %s is not writable — every invocation is "
|
|
385
|
+
"failing to record; fix its permissions (chmod u+w)"
|
|
386
|
+
% _tilde(lp))
|
|
371
387
|
crashes = sorted(paths.logs_dir().glob("crash-*.log")) \
|
|
372
388
|
if paths.logs_dir().is_dir() else []
|
|
373
389
|
if crashes:
|
|
@@ -391,6 +407,64 @@ def cmd_doctor(argv):
|
|
|
391
407
|
return 1 if issues else 0
|
|
392
408
|
|
|
393
409
|
|
|
410
|
+
# Why dense retrieval isn't serving, keyed by `dense.status()["reason"]`. Each
|
|
411
|
+
# names the ONE next action; the reason order in `status()` guarantees only the
|
|
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
|
+
}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def _report_search_engine(bad) -> None:
|
|
431
|
+
"""Report the engine `boost search` will use, and why it isn't the best one.
|
|
432
|
+
|
|
433
|
+
Only a *degraded* dense tier counts against doctor's exit code: BM25 is the
|
|
434
|
+
documented default and most users never opt in, so an unconfigured tier is
|
|
435
|
+
healthy. Vectors already on disk that have stopped serving are not.
|
|
436
|
+
"""
|
|
437
|
+
# Local import: the dense/embedding engines are opt-in and stay out of
|
|
438
|
+
# startup for every other command (scripts/import_budget.py enforces it).
|
|
439
|
+
from ..core import dense
|
|
440
|
+
st = dense.status()
|
|
441
|
+
|
|
442
|
+
if st["ready"]:
|
|
443
|
+
out.ok("semantic search active — %s %s (%d-d), %d chunk%s across %d tap%s"
|
|
444
|
+
% (st["provider"], st["model"], st["dim"] or 0,
|
|
445
|
+
st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
|
|
446
|
+
return
|
|
447
|
+
|
|
448
|
+
fix = _DENSE_FIX.get(str(st["reason"]), "see `boost reindex --dense`")
|
|
449
|
+
if st["degraded"]:
|
|
450
|
+
# The store was built and is now dead weight: say what it holds, what
|
|
451
|
+
# changed, and that search has silently been on BM25 the whole time.
|
|
452
|
+
built = st["built_model"] or st["built_provider"] or "an older build"
|
|
453
|
+
detail = "built with %s" % built
|
|
454
|
+
if st["reason"] == "model-changed":
|
|
455
|
+
detail += ", live key is %s" % st["model"]
|
|
456
|
+
elif st["reason"] == "provider-changed":
|
|
457
|
+
detail += ", live key is %s" % st["provider"]
|
|
458
|
+
elif st["reason"] == "empty":
|
|
459
|
+
detail += " but holds no vectors"
|
|
460
|
+
bad("semantic search silently off — %d-chunk vector store %s; "
|
|
461
|
+
"searches are using BM25. %s" % (st["chunks"], detail, fix))
|
|
462
|
+
return
|
|
463
|
+
|
|
464
|
+
out.info("semantic search not configured — using the full-content BM25 "
|
|
465
|
+
"engine (%s)" % fix)
|
|
466
|
+
|
|
467
|
+
|
|
394
468
|
def _print_skipped(skipped: List[dict]) -> None:
|
|
395
469
|
"""Note the rule/workflow entries `lint` passed over (they have no SKILL.md)."""
|
|
396
470
|
if not skipped:
|
|
@@ -102,6 +102,106 @@ def _chunk_texts(entry: dict, tap_paths: Optional[Dict[str, Path]]
|
|
|
102
102
|
return chunk(body) or [body]
|
|
103
103
|
|
|
104
104
|
|
|
105
|
+
def _recorded_meta() -> dict:
|
|
106
|
+
"""What an existing store says it was built with, read WITHOUT sqlite-vec.
|
|
107
|
+
|
|
108
|
+
Deliberately not routed through :func:`_connect`, which loads the extension
|
|
109
|
+
and returns ``None`` without it: the most useful diagnostic line ("your
|
|
110
|
+
store was built with voyage-3") would then vanish in exactly the case that
|
|
111
|
+
needs it — a user who dropped the ``[rag]`` extra and wants to know why
|
|
112
|
+
dense went quiet. ``meta`` is a plain table, so plain sqlite3 can read it.
|
|
113
|
+
"""
|
|
114
|
+
p = db_path()
|
|
115
|
+
if not p.exists():
|
|
116
|
+
return {}
|
|
117
|
+
try:
|
|
118
|
+
con = sqlite3.connect(str(p))
|
|
119
|
+
except sqlite3.Error:
|
|
120
|
+
return {}
|
|
121
|
+
try:
|
|
122
|
+
meta = _read_meta(con)
|
|
123
|
+
try:
|
|
124
|
+
meta["_chunks"] = con.execute(
|
|
125
|
+
"SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
126
|
+
except sqlite3.DatabaseError:
|
|
127
|
+
meta["_chunks"] = 0
|
|
128
|
+
return meta
|
|
129
|
+
except sqlite3.DatabaseError:
|
|
130
|
+
# A truncated or non-sqlite file: report "no store", never raise into
|
|
131
|
+
# a health check whose whole job is to survive a broken install.
|
|
132
|
+
return {}
|
|
133
|
+
finally:
|
|
134
|
+
con.close()
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def status() -> dict:
|
|
138
|
+
"""Why dense retrieval is, or is not, serving queries.
|
|
139
|
+
|
|
140
|
+
Pure inspection — never builds, never embeds, never needs the extra. Three
|
|
141
|
+
independent things must line up (the ``[rag]`` extra, an embeddings key, a
|
|
142
|
+
built store whose space matches the live one) and every one of them fails
|
|
143
|
+
*silently* today, because :func:`rag.retrieve_any` floors to BM25 and
|
|
144
|
+
returns. ``reason`` names which link is missing so a caller can say so.
|
|
145
|
+
|
|
146
|
+
``degraded`` is the load-bearing distinction: a user who never configured
|
|
147
|
+
dense search is *healthy* (BM25 is the documented default), while a user
|
|
148
|
+
who did all three steps and is still on BM25 has a real problem no other
|
|
149
|
+
surface reports. Only the latter should move an exit code.
|
|
150
|
+
"""
|
|
151
|
+
have_be = have_backend()
|
|
152
|
+
prov, mdl, dim = embed.provider(), embed.model(), embed.dimension()
|
|
153
|
+
meta = _recorded_meta()
|
|
154
|
+
b_prov = meta.get("provider")
|
|
155
|
+
b_mdl = meta.get("model")
|
|
156
|
+
b_dim = meta.get("dim")
|
|
157
|
+
b_ver = meta.get("version")
|
|
158
|
+
commits = meta.get("commits")
|
|
159
|
+
chunks = int(meta.get("_chunks") or 0)
|
|
160
|
+
store_exists = bool(meta)
|
|
161
|
+
|
|
162
|
+
# Order matters: report the *first* missing link, so the message names the
|
|
163
|
+
# next action rather than a downstream symptom of the same gap.
|
|
164
|
+
if not have_be:
|
|
165
|
+
reason: Optional[str] = "no-backend"
|
|
166
|
+
elif prov is None:
|
|
167
|
+
reason = "no-key"
|
|
168
|
+
elif not store_exists:
|
|
169
|
+
reason = "no-store"
|
|
170
|
+
elif b_ver != INDEX_VERSION:
|
|
171
|
+
reason = "version-changed"
|
|
172
|
+
elif b_prov != prov:
|
|
173
|
+
reason = "provider-changed"
|
|
174
|
+
elif b_mdl != mdl:
|
|
175
|
+
reason = "model-changed"
|
|
176
|
+
elif b_dim != dim:
|
|
177
|
+
reason = "dim-changed"
|
|
178
|
+
elif chunks <= 0:
|
|
179
|
+
reason = "empty"
|
|
180
|
+
else:
|
|
181
|
+
reason = None
|
|
182
|
+
|
|
183
|
+
# Unconfigured is not degraded; a built-but-unusable store is. Vectors on
|
|
184
|
+
# disk are the proof of intent — the user paid to embed them, so anything
|
|
185
|
+
# that stops them serving (a dropped extra, an unset key, a changed model)
|
|
186
|
+
# is a real fault. Without a store there is nothing to have regressed:
|
|
187
|
+
# "no-store" is an unfinished setup, and it is the one reason that implies
|
|
188
|
+
# store_exists is False, so this single clause covers every case.
|
|
189
|
+
degraded = store_exists and reason is not None
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
"backend": have_be,
|
|
193
|
+
"provider": prov, "model": mdl, "dim": dim,
|
|
194
|
+
"store_exists": store_exists,
|
|
195
|
+
"built_provider": b_prov, "built_model": b_mdl,
|
|
196
|
+
"built_dim": b_dim, "built_version": b_ver,
|
|
197
|
+
"chunks": chunks,
|
|
198
|
+
"taps": len(commits) if isinstance(commits, dict) else 0,
|
|
199
|
+
"ready": reason is None,
|
|
200
|
+
"reason": reason,
|
|
201
|
+
"degraded": degraded,
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
105
205
|
def ready() -> bool:
|
|
106
206
|
"""True when a usable, provider-matched vector index exists on disk."""
|
|
107
207
|
if not have_backend() or not embed.available() or not db_path().exists():
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"""Optional dense-embedding bridge for RAG Phase 2.
|
|
2
|
+
|
|
3
|
+
Strategy mirrors ``core.ai``: prefer Voyage AI when ``VOYAGE_API_KEY`` is set,
|
|
4
|
+
else OpenAI when ``OPENAI_API_KEY`` is set, else a **local** ONNX model when the
|
|
5
|
+
``[rag]`` extra is installed, else return ``None`` so every caller degrades to
|
|
6
|
+
the always-on BM25 engine. The API embeddings come over ``urllib`` — pure
|
|
7
|
+
stdlib, no client library. Anthropic exposes no embeddings endpoint, hence
|
|
8
|
+
Voyage (its recommended partner) and OpenAI.
|
|
9
|
+
|
|
10
|
+
Why a local provider exists
|
|
11
|
+
---------------------------
|
|
12
|
+
Without one, dense search needed an account and a key, so in practice every
|
|
13
|
+
keyless user got BM25 — and BM25 answers "my app is slow" with bioinformatics
|
|
14
|
+
packages, because nothing in that query shares vocabulary with the docs. The
|
|
15
|
+
vector *store* was never the gated part: vectors already live on the user's own
|
|
16
|
+
machine in sqlite-vec, keyed on each tap's commit. The only API-bound step is
|
|
17
|
+
turning text into vectors.
|
|
18
|
+
|
|
19
|
+
That also rules out the obvious shortcut of shipping a prebuilt index instead:
|
|
20
|
+
answering a query means embedding *the query*, so a downloaded index is useless
|
|
21
|
+
without something local to embed with. A local model is the prerequisite, not
|
|
22
|
+
an alternative.
|
|
23
|
+
|
|
24
|
+
The chain order is load-bearing. Local is tried **last**, so a user who has
|
|
25
|
+
configured Voyage keeps voyage-4 rather than being silently downgraded to a
|
|
26
|
+
384-dim local model. And because ``dense.py`` rebuilds whenever ``model`` or
|
|
27
|
+
``dim`` changes, switching providers can never mix two embedding spaces in one
|
|
28
|
+
index.
|
|
29
|
+
|
|
30
|
+
``BOOST_NO_EMBED=1`` is a hard kill-switch for all three, matching
|
|
31
|
+
``BOOST_NO_AI``.
|
|
32
|
+
"""
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
import contextlib
|
|
36
|
+
import json
|
|
37
|
+
import os
|
|
38
|
+
import urllib.error
|
|
39
|
+
import urllib.request
|
|
40
|
+
from typing import Any, List, Optional
|
|
41
|
+
|
|
42
|
+
from . import nethttp
|
|
43
|
+
|
|
44
|
+
VOYAGE_URL = "https://api.voyageai.com/v1/embeddings"
|
|
45
|
+
OPENAI_URL = "https://api.openai.com/v1/embeddings"
|
|
46
|
+
|
|
47
|
+
# model -> output dimension. Stored in the vector index so a provider/model
|
|
48
|
+
# switch is detected and forces a clean rebuild instead of mixing spaces.
|
|
49
|
+
# voyage-4 over voyage-3: same 1024-d default and same $/token, but the
|
|
50
|
+
# voyage-4 generation carries a 200M-token complimentary allowance where
|
|
51
|
+
# voyage-3 has none — so a full index build of a large corpus is free.
|
|
52
|
+
VOYAGE_MODEL = "voyage-4"
|
|
53
|
+
OPENAI_MODEL = "text-embedding-3-small"
|
|
54
|
+
|
|
55
|
+
# The keyless path. Small on purpose: skill docs are short and keyword-dense, so
|
|
56
|
+
# a 384-dim model closes most of the gap to a paid API and runs on CPU. Named
|
|
57
|
+
# with its full hub id because that is what ends up recorded in the index
|
|
58
|
+
# metadata — a bare "bge-small-en-v1.5" would collide with any other vendor's
|
|
59
|
+
# rebuild of it, and a rebuild produces different vectors. See core.localembed
|
|
60
|
+
# for the pinned revision and the (133 MB, not 30 MB) download it implies.
|
|
61
|
+
LOCAL_MODEL = "BAAI/bge-small-en-v1.5"
|
|
62
|
+
LOCAL_DIM = 384
|
|
63
|
+
|
|
64
|
+
_DIMS = {VOYAGE_MODEL: 1024, OPENAI_MODEL: 1536, LOCAL_MODEL: LOCAL_DIM}
|
|
65
|
+
|
|
66
|
+
# Cached backend class and model instance. Loading an ONNX model is expensive
|
|
67
|
+
# enough that doing it per query would make the local path unusable, and the
|
|
68
|
+
# import itself is retried-on-miss rather than repeated: `provider()` runs on
|
|
69
|
+
# effectively every retrieval call.
|
|
70
|
+
_BACKEND_MISSING = object()
|
|
71
|
+
# Deliberately untyped: the backend is core.localembed, imported lazily, so
|
|
72
|
+
# naming its type here would defeat the point of the lazy import.
|
|
73
|
+
_backend_cache: Any = None
|
|
74
|
+
_model_instance: Any = None
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def enabled() -> bool:
|
|
78
|
+
"""True unless the ``BOOST_NO_EMBED`` kill-switch is set."""
|
|
79
|
+
return not os.environ.get("BOOST_NO_EMBED")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _load_backend():
|
|
83
|
+
"""The local embedding class, or None when the ``[rag]`` extra is absent.
|
|
84
|
+
|
|
85
|
+
``localembed`` keeps its own imports lazy for the import budget; this is the
|
|
86
|
+
seam the tests stub, so the unit suite passes with the extra uninstalled.
|
|
87
|
+
"""
|
|
88
|
+
from . import localembed
|
|
89
|
+
return localembed if localembed.available() else None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _backend() -> Any:
|
|
93
|
+
"""``_load_backend`` memoised, including the negative result."""
|
|
94
|
+
global _backend_cache
|
|
95
|
+
if _backend_cache is None:
|
|
96
|
+
_backend_cache = _load_backend() or _BACKEND_MISSING
|
|
97
|
+
return None if _backend_cache is _BACKEND_MISSING else _backend_cache
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def reset_local_cache() -> None:
|
|
101
|
+
"""Drop the cached backend and model. For tests, and for a provider switch."""
|
|
102
|
+
global _backend_cache, _model_instance
|
|
103
|
+
_backend_cache = None
|
|
104
|
+
_model_instance = None
|
|
105
|
+
# Nothing to reset when the extra is absent.
|
|
106
|
+
with contextlib.suppress(Exception):
|
|
107
|
+
from . import localembed
|
|
108
|
+
localembed.reset()
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def local_available() -> bool:
|
|
112
|
+
"""True when the local embedding backend can be imported."""
|
|
113
|
+
return _backend() is not None
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def provider() -> Optional[str]:
|
|
117
|
+
"""The active provider, preferring a configured key, or None when nothing works.
|
|
118
|
+
|
|
119
|
+
Order matters: local comes **last** so configuring Voyage keeps voyage-4.
|
|
120
|
+
A fallback that preempted a paid key would silently downgrade every existing
|
|
121
|
+
keyed install to a smaller model.
|
|
122
|
+
"""
|
|
123
|
+
if not enabled():
|
|
124
|
+
return None
|
|
125
|
+
if os.environ.get("VOYAGE_API_KEY"):
|
|
126
|
+
return "voyage"
|
|
127
|
+
if os.environ.get("OPENAI_API_KEY"):
|
|
128
|
+
return "openai"
|
|
129
|
+
if local_available():
|
|
130
|
+
return "local"
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def available() -> bool:
|
|
135
|
+
"""True when embeddings are enabled and a provider key is present."""
|
|
136
|
+
return provider() is not None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def model() -> Optional[str]:
|
|
140
|
+
"""The active provider's model name, or None when unconfigured."""
|
|
141
|
+
p = provider()
|
|
142
|
+
if p == "voyage":
|
|
143
|
+
return VOYAGE_MODEL
|
|
144
|
+
if p == "openai":
|
|
145
|
+
return OPENAI_MODEL
|
|
146
|
+
if p == "local":
|
|
147
|
+
return LOCAL_MODEL
|
|
148
|
+
return None
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def dimension() -> Optional[int]:
|
|
152
|
+
"""Output vector dimension of the active model, or None when
|
|
153
|
+
|
|
154
|
+
unconfigured. Stored in the index so a model switch forces a rebuild.
|
|
155
|
+
"""
|
|
156
|
+
m = model()
|
|
157
|
+
return _DIMS.get(m) if m is not None else None
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def fallback_note() -> str:
|
|
161
|
+
"""The one-line hint shown when dense search degrades to BM25.
|
|
162
|
+
|
|
163
|
+
No longer asks for a key: with a local model in the ``[rag]`` extra the
|
|
164
|
+
extra alone is enough, and telling a user they need an API account when
|
|
165
|
+
they do not is worse than saying nothing.
|
|
166
|
+
"""
|
|
167
|
+
if not enabled():
|
|
168
|
+
return "dense search is off (BOOST_NO_EMBED) — using the BM25 engine"
|
|
169
|
+
return ("dense search needs the `[rag]` extra — `pip install "
|
|
170
|
+
"boost-skill-cli[rag]`; using the BM25 full-content engine")
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def embed(texts: List[str], input_type: Optional[str] = None,
|
|
174
|
+
timeout: int = 60) -> Optional[List[List[float]]]:
|
|
175
|
+
"""Embed a batch of texts.
|
|
176
|
+
|
|
177
|
+
Returns one vector per input, ``[]`` for an empty batch, or ``None`` when no
|
|
178
|
+
provider is configured or the call fails (so callers degrade cleanly).
|
|
179
|
+
``input_type`` ("query"/"document") is honored by Voyage and ignored by
|
|
180
|
+
OpenAI.
|
|
181
|
+
"""
|
|
182
|
+
p = provider()
|
|
183
|
+
if p is None:
|
|
184
|
+
return None
|
|
185
|
+
if not texts:
|
|
186
|
+
return []
|
|
187
|
+
if p == "local":
|
|
188
|
+
return _embed_local(texts)
|
|
189
|
+
if p == "voyage":
|
|
190
|
+
body = {"input": texts.copy(), "model": VOYAGE_MODEL}
|
|
191
|
+
if input_type:
|
|
192
|
+
body["input_type"] = input_type
|
|
193
|
+
return _vectors(_post(VOYAGE_URL, os.environ["VOYAGE_API_KEY"],
|
|
194
|
+
body, timeout), len(texts))
|
|
195
|
+
body = {"input": texts.copy(), "model": OPENAI_MODEL}
|
|
196
|
+
return _vectors(_post(OPENAI_URL, os.environ["OPENAI_API_KEY"],
|
|
197
|
+
body, timeout), len(texts))
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _local_model():
|
|
201
|
+
"""The loaded local model, or None if it cannot be built.
|
|
202
|
+
|
|
203
|
+
First use downloads the pinned weights and caches them under
|
|
204
|
+
``~/.boost/cache/models``, so this can fail on a machine with no network.
|
|
205
|
+
That is a degrade, not an error: the caller floors to BM25 exactly as it
|
|
206
|
+
does when no key is set.
|
|
207
|
+
"""
|
|
208
|
+
return _backend()
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _embed_local(texts: List[str]) -> Optional[List[List[float]]]:
|
|
212
|
+
"""Embed locally. None on any failure, so the caller degrades to BM25.
|
|
213
|
+
|
|
214
|
+
Validated as strictly as the API path: a short batch would misalign vectors
|
|
215
|
+
against their chunks — every hit past the gap pointing at the wrong skill —
|
|
216
|
+
and a wrong-width row would either error inside sqlite-vec or quietly
|
|
217
|
+
corrupt the space, so both are rejected rather than stored.
|
|
218
|
+
"""
|
|
219
|
+
backend = _local_model()
|
|
220
|
+
if backend is None:
|
|
221
|
+
return None
|
|
222
|
+
try:
|
|
223
|
+
rows = backend.encode(texts.copy())
|
|
224
|
+
except Exception: # inference failure degrades, never raises
|
|
225
|
+
return None
|
|
226
|
+
if rows is None or len(rows) != len(texts):
|
|
227
|
+
return None
|
|
228
|
+
out: List[List[float]] = []
|
|
229
|
+
for row in rows:
|
|
230
|
+
try:
|
|
231
|
+
vec = [float(x) for x in row]
|
|
232
|
+
except (TypeError, ValueError):
|
|
233
|
+
return None
|
|
234
|
+
if len(vec) != LOCAL_DIM:
|
|
235
|
+
return None
|
|
236
|
+
out.append(vec)
|
|
237
|
+
return out
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _post(url: str, key: str, payload: dict, timeout: int) -> Optional[dict]:
|
|
241
|
+
data = json.dumps(payload).encode("utf-8")
|
|
242
|
+
req = urllib.request.Request(url, data=data, headers={ # noqa: S310 url is a hardcoded VOYAGE_URL/OPENAI_URL constant
|
|
243
|
+
"Authorization": "Bearer %s" % key,
|
|
244
|
+
"Content-Type": "application/json",
|
|
245
|
+
})
|
|
246
|
+
try:
|
|
247
|
+
with nethttp.urlopen(req, timeout=timeout) as resp:
|
|
248
|
+
return json.loads(resp.read())
|
|
249
|
+
except (urllib.error.URLError, OSError, ValueError):
|
|
250
|
+
return None
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def _vectors(obj: Optional[dict], n: int) -> Optional[List[List[float]]]:
|
|
254
|
+
"""Pull ``data[].embedding`` out of an OpenAI-shaped response.
|
|
255
|
+
|
|
256
|
+
Both Voyage and OpenAI return ``{"data": [{"embedding": [...]}, ...]}``.
|
|
257
|
+
Returns None unless exactly ``n`` numeric vectors come back.
|
|
258
|
+
"""
|
|
259
|
+
if not isinstance(obj, dict):
|
|
260
|
+
return None
|
|
261
|
+
data = obj.get("data")
|
|
262
|
+
if not isinstance(data, list) or len(data) != n:
|
|
263
|
+
return None
|
|
264
|
+
out: List[List[float]] = []
|
|
265
|
+
for item in data:
|
|
266
|
+
vec = item.get("embedding") if isinstance(item, dict) else None
|
|
267
|
+
if not isinstance(vec, list) or not vec:
|
|
268
|
+
return None
|
|
269
|
+
out.append([float(x) for x in vec])
|
|
270
|
+
return out
|