boost-skill-cli 1.0.290__tar.gz → 1.0.292__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.290 → boost_skill_cli-1.0.292}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/discovery.py +31 -5
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/dense.py +34 -6
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/embed.py +4 -1
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/mcp.py +11 -3
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/rag.py +8 -4
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_discovery.py +51 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_dense.py +21 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_dense_fallback.py +59 -1
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_embed.py +13 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_mcp.py +9 -2
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.gitattributes +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.gitignore +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/.vale.ini +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/LICENSE +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/Makefile +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/README.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_skill_cli.egg-info/SOURCES.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/codecov.yml +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/index.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/README.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/examples/README.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/index.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/noxfile.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/setup.cfg +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/style/README.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/style/boost.css +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/style/boost.js +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/style/demo.html +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.290 → boost_skill_cli-1.0.292}/tests/visual/visual_check.mjs +0 -0
|
@@ -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.292'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 292)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -79,6 +79,9 @@ def _ai_rank(query: str, scored):
|
|
|
79
79
|
return [by_name[n] for n in names] + rest
|
|
80
80
|
|
|
81
81
|
|
|
82
|
+
_ENGINE_LABEL = {"BM25 full-content": "full-content BM25"}
|
|
83
|
+
|
|
84
|
+
|
|
82
85
|
def cmd_search(argv):
|
|
83
86
|
"""Search the tap catalogs, optionally AI-reranked with --smart."""
|
|
84
87
|
p = cliparse.parser(
|
|
@@ -104,9 +107,13 @@ def cmd_search(argv):
|
|
|
104
107
|
if not use_rag:
|
|
105
108
|
with spin.Spinner("building the search index (first run)"):
|
|
106
109
|
use_rag = rag.ensure()
|
|
110
|
+
engine = ""
|
|
107
111
|
if use_rag:
|
|
108
|
-
|
|
109
|
-
|
|
112
|
+
# retrieve_any, not retrieve: this picks the dense backend when one is
|
|
113
|
+
# built and floors to BM25 otherwise, so the CLI and the MCP server
|
|
114
|
+
# answer from the same engine instead of the CLI being BM25-only.
|
|
115
|
+
hits, engine = rag.retrieve_any(query, k=max(60, args.limit * 4))
|
|
116
|
+
scored = [(h["entry"], h["score"]) for h in (hits or [])]
|
|
110
117
|
else:
|
|
111
118
|
scored = catalog.search(query)
|
|
112
119
|
if args.as_json:
|
|
@@ -116,7 +123,10 @@ def cmd_search(argv):
|
|
|
116
123
|
out.info("no matches for %r" % query)
|
|
117
124
|
out.info(out.role("try `boost discover %s` to search all of GitHub" % query, "muted"))
|
|
118
125
|
return 0
|
|
119
|
-
|
|
126
|
+
# The CLI's long-standing wording for the BM25 engine differs from the label
|
|
127
|
+
# rag/eval use ("BM25 full-content"), and both are load-bearing: the latter
|
|
128
|
+
# is pinned in tests/eval/baseline.json. Map instead of moving either.
|
|
129
|
+
ranker = _ENGINE_LABEL.get(engine, engine) if use_rag else "heuristic relevance"
|
|
120
130
|
if args.smart:
|
|
121
131
|
if ai.available():
|
|
122
132
|
with spin.Spinner("ranking %d matches with Claude" % len(scored)):
|
|
@@ -190,8 +200,24 @@ def cmd_reindex(argv):
|
|
|
190
200
|
if dense_stats is None:
|
|
191
201
|
out.warn("dense index skipped — %s" % embed.fallback_note())
|
|
192
202
|
else:
|
|
193
|
-
|
|
194
|
-
|
|
203
|
+
failed = dense_stats.get("failed") or []
|
|
204
|
+
if failed:
|
|
205
|
+
out.warn("embedding failed for %d tap(s) — %d passages stored. "
|
|
206
|
+
"The provider rejected those batches (rate limit, "
|
|
207
|
+
"quota, or oversized input); their commits were not "
|
|
208
|
+
"recorded, so a rerun retries them."
|
|
209
|
+
% (len(failed), dense_stats["chunks"]))
|
|
210
|
+
elif not dense_stats["chunks"]:
|
|
211
|
+
# Reporting success with an empty store sent a real user chasing
|
|
212
|
+
# the wrong cause: a stale run can mark every tap "built", so the
|
|
213
|
+
# reuse path skips everything and stores nothing.
|
|
214
|
+
out.warn("the dense vector store is empty — %d tap(s) were "
|
|
215
|
+
"reused as already-built. Rebuild with "
|
|
216
|
+
"`boost reindex --dense --force`."
|
|
217
|
+
% len(dense_stats["reused"]))
|
|
218
|
+
else:
|
|
219
|
+
out.ok("embedded %d passages (%s) into the dense vector store"
|
|
220
|
+
% (dense_stats["chunks"], dense_stats["provider"]))
|
|
195
221
|
journal.log("reindex", "%d passages" % stats["docs"],
|
|
196
222
|
entries=stats["entries"])
|
|
197
223
|
return 0
|
|
@@ -115,6 +115,12 @@ def ready() -> bool:
|
|
|
115
115
|
return False
|
|
116
116
|
if meta.get("provider") != embed.provider():
|
|
117
117
|
return False
|
|
118
|
+
# Model, not just provider+dim: two models from one provider can share
|
|
119
|
+
# a dimension and still be different embedding spaces (voyage-3 and
|
|
120
|
+
# voyage-4 are both 1024-d), so serving stale vectors would silently
|
|
121
|
+
# mix spaces rather than fail loudly.
|
|
122
|
+
if meta.get("model") != embed.model():
|
|
123
|
+
return False
|
|
118
124
|
if meta.get("dim") != embed.dimension():
|
|
119
125
|
return False
|
|
120
126
|
try:
|
|
@@ -147,7 +153,9 @@ def build(entries: Optional[List[dict]] = None,
|
|
|
147
153
|
return None
|
|
148
154
|
try:
|
|
149
155
|
meta = _read_meta(con)
|
|
150
|
-
same_backend = (meta.get("provider") == prov
|
|
156
|
+
same_backend = (meta.get("provider") == prov
|
|
157
|
+
and meta.get("model") == mdl
|
|
158
|
+
and meta.get("dim") == dim)
|
|
151
159
|
if force or not same_backend:
|
|
152
160
|
_wipe(con)
|
|
153
161
|
_ensure_schema(con, dim)
|
|
@@ -172,9 +180,16 @@ def build(entries: Optional[List[dict]] = None,
|
|
|
172
180
|
removed_taps = sorted(_indexed_taps(con) - {e["tap"] for e in entries})
|
|
173
181
|
_delete_taps(con, changed_taps + removed_taps)
|
|
174
182
|
|
|
175
|
-
added = _embed_and_store(con, fresh, tap_paths)
|
|
183
|
+
added, failed_taps = _embed_and_store(con, fresh, tap_paths)
|
|
184
|
+
# Only record a commit for a tap whose chunks actually landed. Recording
|
|
185
|
+
# one for a tap that stored nothing makes every later non-forced run
|
|
186
|
+
# treat it as already built and skip it — one transient rate limit would
|
|
187
|
+
# otherwise leave the store permanently empty until `--force`.
|
|
188
|
+
failed_safe = {t.replace("/", "__") for t in failed_taps}
|
|
189
|
+
recorded = {safe: c for safe, c in commits.items()
|
|
190
|
+
if safe not in failed_safe}
|
|
176
191
|
_write_meta(con, {"version": INDEX_VERSION, "provider": prov,
|
|
177
|
-
"model": mdl, "dim": dim, "commits":
|
|
192
|
+
"model": mdl, "dim": dim, "commits": recorded})
|
|
178
193
|
con.commit()
|
|
179
194
|
total = con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
180
195
|
return {
|
|
@@ -185,6 +200,7 @@ def build(entries: Optional[List[dict]] = None,
|
|
|
185
200
|
"reindexed": changed_taps,
|
|
186
201
|
"pruned": removed_taps,
|
|
187
202
|
"reused": sorted(reused),
|
|
203
|
+
"failed": sorted(failed_taps),
|
|
188
204
|
"provider": prov,
|
|
189
205
|
"model": mdl,
|
|
190
206
|
}
|
|
@@ -210,19 +226,31 @@ def _delete_taps(con: sqlite3.Connection, taps: List[str]) -> None:
|
|
|
210
226
|
|
|
211
227
|
|
|
212
228
|
def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
|
|
213
|
-
tap_paths: Optional[Dict[str, Path]]
|
|
229
|
+
tap_paths: Optional[Dict[str, Path]]
|
|
230
|
+
) -> Tuple[int, set]:
|
|
231
|
+
"""Embed every chunk of ``entries``; returns ``(added, failed_taps)``.
|
|
232
|
+
|
|
233
|
+
A batch the provider rejects (rate limit, quota, oversized input) yields no
|
|
234
|
+
vectors. Its taps are reported back rather than silently dropped, so the
|
|
235
|
+
caller can avoid recording a commit for a tap that stored nothing.
|
|
236
|
+
"""
|
|
214
237
|
mod = _load()
|
|
215
238
|
if mod is None: # [rag] extra absent — nothing to serialize into
|
|
216
|
-
|
|
239
|
+
# Report every tap as failed so the caller records no commits: marking
|
|
240
|
+
# them built with zero vectors stored is what leaves the store
|
|
241
|
+
# permanently empty. (callers fall back to BM25; see module docstring)
|
|
242
|
+
return 0, {e["tap"] for e in entries}
|
|
217
243
|
rows: List[Tuple[dict, int, str]] = [] # (entry, chunk_ix, text)
|
|
218
244
|
for e in entries:
|
|
219
245
|
for ci, text in enumerate(_chunk_texts(e, tap_paths)):
|
|
220
246
|
rows.append((e, ci, text))
|
|
221
247
|
added = 0
|
|
248
|
+
failed_taps: set = set()
|
|
222
249
|
for start in range(0, len(rows), _BATCH):
|
|
223
250
|
batch = rows[start:start + _BATCH]
|
|
224
251
|
vecs = embed.embed([t for _e, _c, t in batch], input_type="document")
|
|
225
252
|
if not vecs or len(vecs) != len(batch):
|
|
253
|
+
failed_taps.update(e["tap"] for e, _c, _t in batch)
|
|
226
254
|
continue
|
|
227
255
|
for (e, ci, text), vec in zip(batch, vecs):
|
|
228
256
|
cur = con.execute(
|
|
@@ -233,7 +261,7 @@ def _embed_and_store(con: sqlite3.Connection, entries: List[dict],
|
|
|
233
261
|
con.execute("INSERT INTO vec_chunks (rowid, embedding) VALUES (?, ?)",
|
|
234
262
|
(cur.lastrowid, mod.serialize_float32(vec)))
|
|
235
263
|
added += 1
|
|
236
|
-
return added
|
|
264
|
+
return added, failed_taps
|
|
237
265
|
|
|
238
266
|
|
|
239
267
|
def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
|
|
@@ -23,7 +23,10 @@ OPENAI_URL = "https://api.openai.com/v1/embeddings"
|
|
|
23
23
|
|
|
24
24
|
# model -> output dimension. Stored in the vector index so a provider/model
|
|
25
25
|
# switch is detected and forces a clean rebuild instead of mixing spaces.
|
|
26
|
-
|
|
26
|
+
# voyage-4 over voyage-3: same 1024-d default and same $/token, but the
|
|
27
|
+
# voyage-4 generation carries a 200M-token complimentary allowance where
|
|
28
|
+
# voyage-3 has none — so a full index build of a large corpus is free.
|
|
29
|
+
VOYAGE_MODEL = "voyage-4"
|
|
27
30
|
OPENAI_MODEL = "text-embedding-3-small"
|
|
28
31
|
_DIMS = {VOYAGE_MODEL: 1024, OPENAI_MODEL: 1536}
|
|
29
32
|
|
|
@@ -98,7 +98,7 @@ INSTRUCTIONS = (
|
|
|
98
98
|
"capabilities (skills, rules, slash-commands, subagents) from curated "
|
|
99
99
|
"registries.\n"
|
|
100
100
|
"\n"
|
|
101
|
-
"
|
|
101
|
+
"Three moments make boost relevant. The first is the one usually missed:\n"
|
|
102
102
|
"\n"
|
|
103
103
|
"1. STARTING A TASK. Before doing non-trivial work — building a feature, "
|
|
104
104
|
"setting up tooling or CI, reviewing code, debugging a class of problem, "
|
|
@@ -116,13 +116,21 @@ INSTRUCTIONS = (
|
|
|
116
116
|
"version-pinned, wired into every agent on this machine, policy-governed, "
|
|
117
117
|
"and shareable with the team.\n"
|
|
118
118
|
"\n"
|
|
119
|
+
"3. SCOPE GROWTH. A turn that began trivial and grew is still a task "
|
|
120
|
+
"start — it just did not look like one at the time. When a question "
|
|
121
|
+
"becomes an investigation, a one-line fix becomes a refactor, or a quick "
|
|
122
|
+
"check turns into hours of work, run the check at the moment the scope "
|
|
123
|
+
"changes rather than treating the original framing as settled. The most "
|
|
124
|
+
"expensive misses are the tasks nobody checked because they were not "
|
|
125
|
+
"tasks when they began.\n"
|
|
126
|
+
"\n"
|
|
119
127
|
"Typical flow: boost_search -> boost_info -> boost_install. Only build "
|
|
120
128
|
"from scratch when a search turns up nothing relevant.\n"
|
|
121
129
|
"\n"
|
|
122
130
|
"Proportion: skip the check for trivial or one-off turns — answering a "
|
|
123
131
|
"question, a small edit, running a command you were just handed. Checking "
|
|
124
|
-
"once when a task starts
|
|
125
|
-
"noise."
|
|
132
|
+
"once when a task starts, or when it grows into one, is the habit; "
|
|
133
|
+
"checking before every tool call is noise."
|
|
126
134
|
)
|
|
127
135
|
|
|
128
136
|
|
|
@@ -421,13 +421,17 @@ def rerank(query: str, hits: List[Hit], limit: int = 10) -> Tuple[List[Hit], str
|
|
|
421
421
|
return (picked + rest)[:limit], "Claude relevance"
|
|
422
422
|
|
|
423
423
|
|
|
424
|
-
def
|
|
425
|
-
|
|
426
|
-
|
|
424
|
+
def retrieve_any(query: str, k: int = 60, kind: Optional[str] = None,
|
|
425
|
+
entries: Optional[List[dict]] = None
|
|
426
|
+
) -> Tuple[Optional[List[Hit]], str]:
|
|
427
427
|
"""Prefer the opt-in dense backend, floor to BM25.
|
|
428
428
|
|
|
429
429
|
Returns ``(hits, engine_label)``; ``hits`` is ``None`` only when no index of
|
|
430
430
|
any kind exists so the caller can fall back to ``catalog.search``.
|
|
431
|
+
|
|
432
|
+
Public because every retrieval entry point must make the same engine
|
|
433
|
+
choice: `cmd_search` calling ``retrieve`` directly meant the CLI could
|
|
434
|
+
never use a built dense index, while the MCP path could.
|
|
431
435
|
"""
|
|
432
436
|
from . import dense
|
|
433
437
|
if dense.ready():
|
|
@@ -454,7 +458,7 @@ def search(query: str, limit: int = 10, kind: Optional[str] = None,
|
|
|
454
458
|
Returns ``(hits, ranker_label)``, or ``None`` when no index exists yet so
|
|
455
459
|
the caller can fall back to ``catalog.search``.
|
|
456
460
|
"""
|
|
457
|
-
hits, engine =
|
|
461
|
+
hits, engine = retrieve_any(query, max(60, limit * 4), kind, entries)
|
|
458
462
|
if hits is None:
|
|
459
463
|
return None
|
|
460
464
|
if smart:
|
|
@@ -1106,3 +1106,54 @@ class TestReindex:
|
|
|
1106
1106
|
assert data["dense"]["chunks"] >= 1
|
|
1107
1107
|
assert data["dense"]["provider"] == "openai"
|
|
1108
1108
|
assert dense.ready() is True
|
|
1109
|
+
|
|
1110
|
+
def test_cli_search_uses_dense_when_the_vector_store_is_built(
|
|
1111
|
+
self, boost, tapped, monkeypatch):
|
|
1112
|
+
"""`boost search` must answer from the same engine the MCP server does.
|
|
1113
|
+
|
|
1114
|
+
It previously called ``rag.retrieve`` directly, so a built dense index
|
|
1115
|
+
served the MCP path while the CLI stayed BM25-only.
|
|
1116
|
+
"""
|
|
1117
|
+
if not _vec_loadable():
|
|
1118
|
+
pytest.skip("sqlite-vec extension not loadable here")
|
|
1119
|
+
from boost_cli.core import dense, embed
|
|
1120
|
+
|
|
1121
|
+
def toy(texts, input_type=None, timeout=60):
|
|
1122
|
+
return [[1.0, 2.0, 3.0] for _ in texts]
|
|
1123
|
+
monkeypatch.setattr(embed, "embed", toy)
|
|
1124
|
+
monkeypatch.setattr(embed, "available", lambda: True)
|
|
1125
|
+
monkeypatch.setattr(embed, "provider", lambda: "openai")
|
|
1126
|
+
monkeypatch.setattr(embed, "model", lambda: "toy-3")
|
|
1127
|
+
monkeypatch.setattr(embed, "dimension", lambda: 3)
|
|
1128
|
+
boost("reindex", "--dense")
|
|
1129
|
+
assert dense.ready() is True
|
|
1130
|
+
r = boost("search", "brainstorming")
|
|
1131
|
+
assert "ranked by dense vectors" in r.out
|
|
1132
|
+
assert "full-content BM25" not in r.out
|
|
1133
|
+
|
|
1134
|
+
def test_empty_store_warns_instead_of_reporting_success(
|
|
1135
|
+
self, boost, tapped, monkeypatch):
|
|
1136
|
+
"""A store left empty by an earlier run must not print a green check.
|
|
1137
|
+
|
|
1138
|
+
Reporting success on an empty store cost a real user a long debugging
|
|
1139
|
+
detour: every tap reads as already-built, so the reuse path skips
|
|
1140
|
+
everything and stores nothing.
|
|
1141
|
+
"""
|
|
1142
|
+
if not _vec_loadable():
|
|
1143
|
+
pytest.skip("sqlite-vec extension not loadable here")
|
|
1144
|
+
from boost_cli.core import dense, embed
|
|
1145
|
+
|
|
1146
|
+
def toy(texts, input_type=None, timeout=60):
|
|
1147
|
+
return [[1.0, 2.0, 3.0] for _ in texts]
|
|
1148
|
+
monkeypatch.setattr(embed, "embed", toy)
|
|
1149
|
+
monkeypatch.setattr(embed, "available", lambda: True)
|
|
1150
|
+
monkeypatch.setattr(embed, "provider", lambda: "openai")
|
|
1151
|
+
monkeypatch.setattr(embed, "model", lambda: "toy-3")
|
|
1152
|
+
monkeypatch.setattr(embed, "dimension", lambda: 3)
|
|
1153
|
+
# Records every tap commit while storing nothing — the exact state a
|
|
1154
|
+
# rate-limited pre-fix run left behind.
|
|
1155
|
+
dense.build(entries=[], force=True)
|
|
1156
|
+
r = boost("reindex", "--dense")
|
|
1157
|
+
assert "dense vector store is empty" in r.out
|
|
1158
|
+
assert "--force" in r.out
|
|
1159
|
+
assert dense.ready() is False
|
|
@@ -203,6 +203,27 @@ class TestIncremental:
|
|
|
203
203
|
monkeypatch.setattr(embed, "dimension", lambda: 4)
|
|
204
204
|
assert dense.ready() is False
|
|
205
205
|
|
|
206
|
+
def test_model_switch_invalidates(self, dense_env, monkeypatch):
|
|
207
|
+
# Same provider, same dimension, different model — voyage-3 -> voyage-4
|
|
208
|
+
# is exactly this shape. provider+dim alone cannot catch it.
|
|
209
|
+
dense.build(entries=_ENTRIES, force=True)
|
|
210
|
+
assert dense.ready() is True
|
|
211
|
+
monkeypatch.setattr(embed, "model", lambda: "toy-4")
|
|
212
|
+
assert dense.ready() is False
|
|
213
|
+
|
|
214
|
+
def test_model_switch_reembeds_instead_of_reusing(self, dense_env,
|
|
215
|
+
monkeypatch):
|
|
216
|
+
# The tap commit is unchanged, so only the model check can stop the
|
|
217
|
+
# reuse path from serving vectors from the previous embedding space.
|
|
218
|
+
dense.build(entries=_ENTRIES, force=True)
|
|
219
|
+
monkeypatch.setattr(embed, "model", lambda: "toy-4")
|
|
220
|
+
stats = dense.build(entries=_ENTRIES)
|
|
221
|
+
assert stats["reused"] == []
|
|
222
|
+
assert stats["model"] == "toy-4"
|
|
223
|
+
assert stats["added"] == len(_ENTRIES)
|
|
224
|
+
assert stats["chunks"] == len(_ENTRIES) # wiped, not appended
|
|
225
|
+
assert dense.ready() is True
|
|
226
|
+
|
|
206
227
|
def test_added_and_chunks_on_reindex(self, dense_env, monkeypatch):
|
|
207
228
|
dense.build(entries=_ENTRIES, force=True)
|
|
208
229
|
monkeypatch.setattr(rag, "_tap_commits", lambda: {"acme__skills": "c2"})
|
|
@@ -150,13 +150,15 @@ class TestReadyGuards:
|
|
|
150
150
|
monkeypatch.setattr(dense, "db_path", lambda: dbfile)
|
|
151
151
|
monkeypatch.setattr(embed, "available", lambda: True)
|
|
152
152
|
monkeypatch.setattr(embed, "provider", lambda: "openai")
|
|
153
|
+
monkeypatch.setattr(embed, "model", lambda: "toy-3")
|
|
153
154
|
monkeypatch.setattr(embed, "dimension", lambda: 3)
|
|
154
155
|
return monkeypatch
|
|
155
156
|
|
|
156
157
|
def _use(self, monkeypatch, con):
|
|
157
158
|
monkeypatch.setattr(dense, "_connect", lambda: con)
|
|
158
159
|
|
|
159
|
-
_GOOD: ClassVar[dict] = {"version": dense.INDEX_VERSION,
|
|
160
|
+
_GOOD: ClassVar[dict] = {"version": dense.INDEX_VERSION,
|
|
161
|
+
"provider": "openai", "model": "toy-3", "dim": 3}
|
|
160
162
|
|
|
161
163
|
def test_true_when_everything_matches(self, wired):
|
|
162
164
|
self._use(wired, self._seed(self._GOOD, rows=1))
|
|
@@ -182,6 +184,17 @@ class TestReadyGuards:
|
|
|
182
184
|
self._use(wired, self._seed({**self._GOOD, "dim": 99}))
|
|
183
185
|
assert dense.ready() is False
|
|
184
186
|
|
|
187
|
+
def test_false_on_model_mismatch(self, wired):
|
|
188
|
+
# provider and dim still match — only the model moved (voyage-3 ->
|
|
189
|
+
# voyage-4 is this exact case, both 1024-d under provider "voyage")
|
|
190
|
+
self._use(wired, self._seed({**self._GOOD, "model": "toy-4"}))
|
|
191
|
+
assert dense.ready() is False
|
|
192
|
+
|
|
193
|
+
def test_false_when_model_absent_from_meta(self, wired):
|
|
194
|
+
meta = {k: v for k, v in self._GOOD.items() if k != "model"}
|
|
195
|
+
self._use(wired, self._seed(meta))
|
|
196
|
+
assert dense.ready() is False
|
|
197
|
+
|
|
185
198
|
def test_false_when_chunks_table_missing(self, wired):
|
|
186
199
|
self._use(wired, self._seed(self._GOOD, with_chunks=False))
|
|
187
200
|
assert dense.ready() is False
|
|
@@ -485,12 +498,57 @@ class TestBuildWithoutExtension:
|
|
|
485
498
|
assert stats["reused"] == []
|
|
486
499
|
assert stats["provider"] == "voyage"
|
|
487
500
|
|
|
501
|
+
def test_model_switch_wipes_and_rebuilds(self, store):
|
|
502
|
+
# provider and dim unchanged, only the model moved — the voyage-3 ->
|
|
503
|
+
# voyage-4 case. Without the model term in `same_backend` the unchanged
|
|
504
|
+
# tap commit would reuse vectors from the old embedding space.
|
|
505
|
+
dense.build(entries=_ENTRIES, force=True)
|
|
506
|
+
store.setattr(embed, "model", lambda: "toy-4")
|
|
507
|
+
stats = dense.build(entries=_ENTRIES) # no force needed
|
|
508
|
+
assert stats["reused"] == []
|
|
509
|
+
assert stats["model"] == "toy-4"
|
|
510
|
+
assert stats["added"] == 2
|
|
511
|
+
assert stats["chunks"] == 2 # wiped, not appended
|
|
512
|
+
|
|
488
513
|
def test_batch_count_mismatch_drops_that_batch(self, store):
|
|
489
514
|
store.setattr(embed, "embed", lambda texts, **k: [[1.0, 2.0, 3.0]])
|
|
490
515
|
stats = dense.build(entries=_ENTRIES, force=True)
|
|
491
516
|
assert stats["added"] == 0
|
|
492
517
|
assert stats["chunks"] == 0
|
|
493
518
|
|
|
519
|
+
def test_failed_batch_is_reported_not_swallowed(self, store):
|
|
520
|
+
store.setattr(embed, "embed", lambda texts, **k: None) # provider 429s
|
|
521
|
+
stats = dense.build(entries=_ENTRIES, force=True)
|
|
522
|
+
assert stats["added"] == 0
|
|
523
|
+
assert stats["failed"] == ["acme/skills"]
|
|
524
|
+
|
|
525
|
+
def test_failed_tap_commit_is_not_recorded(self, store):
|
|
526
|
+
# A rate-limited run must not mark the tap "built at c1" — otherwise the
|
|
527
|
+
# next non-forced run reuses it and the store stays empty forever.
|
|
528
|
+
store.setattr(embed, "embed", lambda texts, **k: None)
|
|
529
|
+
dense.build(entries=_ENTRIES, force=True)
|
|
530
|
+
con = sqlite3.connect(str(dense.db_path()))
|
|
531
|
+
meta = dense._read_meta(con)
|
|
532
|
+
con.close()
|
|
533
|
+
assert meta["commits"] == {}
|
|
534
|
+
|
|
535
|
+
def test_rerun_after_failure_retries_instead_of_reusing(self, store):
|
|
536
|
+
store.setattr(embed, "embed", lambda texts, **k: None)
|
|
537
|
+
dense.build(entries=_ENTRIES, force=True) # fails, stores nothing
|
|
538
|
+
store.setattr(embed, "embed", _toy_embed) # provider recovers
|
|
539
|
+
stats = dense.build(entries=_ENTRIES) # no --force needed
|
|
540
|
+
assert stats["reused"] == []
|
|
541
|
+
assert stats["failed"] == []
|
|
542
|
+
assert stats["added"] == 2
|
|
543
|
+
assert stats["chunks"] == 2
|
|
544
|
+
|
|
545
|
+
def test_successful_tap_commit_is_recorded(self, store):
|
|
546
|
+
dense.build(entries=_ENTRIES, force=True)
|
|
547
|
+
con = sqlite3.connect(str(dense.db_path()))
|
|
548
|
+
meta = dense._read_meta(con)
|
|
549
|
+
con.close()
|
|
550
|
+
assert meta["commits"] == {"acme__skills": "c1"}
|
|
551
|
+
|
|
494
552
|
def test_empty_entries_builds_nothing(self, store):
|
|
495
553
|
stats = dense.build(entries=[], force=True)
|
|
496
554
|
assert stats["chunks"] == 0
|
|
@@ -51,6 +51,19 @@ class TestProviderSelection:
|
|
|
51
51
|
assert embed.dimension() == 1024
|
|
52
52
|
assert embed.available() is True
|
|
53
53
|
|
|
54
|
+
def test_every_selectable_model_has_a_dimension(self, sandbox, monkeypatch):
|
|
55
|
+
"""A model bump that forgets ``_DIMS`` would hand ``dense`` a None dim.
|
|
56
|
+
|
|
57
|
+
``dense.build`` bails out on a None dimension, so the vector store would
|
|
58
|
+
silently never build rather than fail loudly.
|
|
59
|
+
"""
|
|
60
|
+
for env in ("VOYAGE_API_KEY", "OPENAI_API_KEY"):
|
|
61
|
+
monkeypatch.delenv("VOYAGE_API_KEY", raising=False)
|
|
62
|
+
monkeypatch.delenv("OPENAI_API_KEY", raising=False)
|
|
63
|
+
monkeypatch.setenv(env, "k")
|
|
64
|
+
assert embed.model() in embed._DIMS
|
|
65
|
+
assert isinstance(embed.dimension(), int)
|
|
66
|
+
|
|
54
67
|
def test_openai_when_only_openai(self, sandbox, monkeypatch):
|
|
55
68
|
monkeypatch.setenv("OPENAI_API_KEY", "o")
|
|
56
69
|
assert embed.provider() == "openai"
|
|
@@ -116,15 +116,22 @@ class TestHandleRequest:
|
|
|
116
116
|
instr = resp["result"]["instructions"]
|
|
117
117
|
assert instr == mcp.INSTRUCTIONS
|
|
118
118
|
low = instr.lower()
|
|
119
|
-
#
|
|
119
|
+
# THREE triggers must survive here. Authoring alone was the original
|
|
120
120
|
# framing and it under-fired: agents reached for boost only when about
|
|
121
121
|
# to write a skill, never to check whether one already covered the work
|
|
122
|
-
# in front of them. Dropping
|
|
122
|
+
# in front of them. Dropping any trigger regresses that.
|
|
123
123
|
assert "starting a task" in low # trigger 1: leverage first
|
|
124
124
|
assert "boost_list" in instr # ...what is already installed
|
|
125
125
|
assert "before you write a new skill" in low # trigger 2: authoring
|
|
126
126
|
assert "boost_search" in instr # the concrete first action
|
|
127
127
|
assert "already exists" in low # the "don't reinvent" frame
|
|
128
|
+
# Trigger 3 closes the hole the other two leave open: both fire at a
|
|
129
|
+
# recognized task boundary, so a turn that starts trivial and escalates
|
|
130
|
+
# is never re-evaluated. Observed in practice — a one-line question grew
|
|
131
|
+
# into hours of retrieval work and the check never fired, because the
|
|
132
|
+
# proportionality carve-out below had already excused the opening turn.
|
|
133
|
+
assert "scope growth" in low # trigger 3: escalation
|
|
134
|
+
assert "grows into one" in low # ...wired into Proportion
|
|
128
135
|
# ...and it must stay bounded, or an agent learns to ignore all of it.
|
|
129
136
|
assert "skip the check for trivial" in low
|
|
130
137
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|