boost-skill-cli 1.2.13__tar.gz → 1.2.15__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.2.13 → boost_skill_cli-1.2.15}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/dense.py +10 -2
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/rag.py +109 -15
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- boost_skill_cli-1.2.15/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/rag-architecture.md +15 -0
- boost_skill_cli-1.2.15/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +49 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap.html +46 -1
- boost_skill_cli-1.2.15/tests/unit/test_dense_ready_order.py +40 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_rag.py +21 -5
- boost_skill_cli-1.2.15/tests/unit/test_rag_fastpath.py +279 -0
- boost_skill_cli-1.2.13/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.gitattributes +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.gitignore +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/.vale.ini +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/LICENSE +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/Makefile +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/README.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/codecov.yml +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/index.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/README.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/examples/README.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/index.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/noxfile.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/setup.cfg +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/style/README.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/style/boost.css +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/style/boost.js +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/style/demo.html +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.13 → boost_skill_cli-1.2.15}/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.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.15'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 15)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -263,8 +263,16 @@ def status() -> dict:
|
|
|
263
263
|
|
|
264
264
|
|
|
265
265
|
def ready() -> bool:
|
|
266
|
-
"""True when a usable, provider-matched vector index exists on disk.
|
|
267
|
-
|
|
266
|
+
"""True when a usable, provider-matched vector index exists on disk.
|
|
267
|
+
|
|
268
|
+
The stat comes first, deliberately: on a machine with no vector store —
|
|
269
|
+
every BM25-only install — this must answer False without importing the
|
|
270
|
+
backend, because ``have_backend()`` drags in numpy via sqlite_vec
|
|
271
|
+
(~120 ms measured) and every cold ``boost search`` asks.
|
|
272
|
+
"""
|
|
273
|
+
if not db_path().exists():
|
|
274
|
+
return False
|
|
275
|
+
if not have_backend() or not embed.available():
|
|
268
276
|
return False
|
|
269
277
|
con = _connect()
|
|
270
278
|
if con is None:
|
|
@@ -445,12 +445,16 @@ def _load_raw() -> dict | None:
|
|
|
445
445
|
p = index_path()
|
|
446
446
|
key = str(p)
|
|
447
447
|
try:
|
|
448
|
-
|
|
448
|
+
st = p.stat()
|
|
449
449
|
except OSError:
|
|
450
450
|
_CACHE.pop(key, None)
|
|
451
451
|
return None
|
|
452
|
+
# (mtime_ns, size), not bare mtime: a rewrite landing inside one mtime
|
|
453
|
+
# tick would otherwise serve the previous index from this cache forever —
|
|
454
|
+
# the same stamp `catalog._cached_tap` already uses, for the same reason.
|
|
455
|
+
stamp = (st.st_mtime_ns, st.st_size)
|
|
452
456
|
cached = _CACHE.get(key)
|
|
453
|
-
if isinstance(cached, tuple) and cached[0] ==
|
|
457
|
+
if isinstance(cached, tuple) and cached[0] == stamp:
|
|
454
458
|
return cached[1] # type: ignore[return-value]
|
|
455
459
|
try:
|
|
456
460
|
data = json.loads(p.read_text(encoding="utf-8"))
|
|
@@ -458,7 +462,7 @@ def _load_raw() -> dict | None:
|
|
|
458
462
|
return None
|
|
459
463
|
if not isinstance(data, dict) or data.get("version") != INDEX_VERSION:
|
|
460
464
|
return None
|
|
461
|
-
_CACHE[key] = (
|
|
465
|
+
_CACHE[key] = (stamp, data)
|
|
462
466
|
return data
|
|
463
467
|
|
|
464
468
|
|
|
@@ -699,16 +703,97 @@ def dedupe_by_content(hits: list[Hit], limit: int) -> list[Hit]:
|
|
|
699
703
|
# Same body already shown. Keep its rank, but prefer a better source.
|
|
700
704
|
kept = out[seen]
|
|
701
705
|
if source_rank(hit["entry"]) < source_rank(kept["entry"]):
|
|
702
|
-
#
|
|
703
|
-
#
|
|
704
|
-
#
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
"snippet": kept["snippet"],
|
|
708
|
-
"content": digest})
|
|
706
|
+
# Copy the kept hit wholesale and swap only the entry: a literal
|
|
707
|
+
# rebuild here would silently drop anything else the caller
|
|
708
|
+
# carried on the hit (retrieve defers snippet windowing through
|
|
709
|
+
# this function, so the carry is load-bearing, not hygiene).
|
|
710
|
+
out[seen] = cast(Hit, {**kept, "entry": hit["entry"]})
|
|
709
711
|
return out[:limit]
|
|
710
712
|
|
|
711
713
|
|
|
714
|
+
def _windowed(hits: list[Hit], terms: Sequence[str]) -> list[Hit]:
|
|
715
|
+
"""Window each hit's raw stored snip onto the query terms.
|
|
716
|
+
|
|
717
|
+
Deferred to the hits actually returned: ranking carries the raw ``snip``
|
|
718
|
+
through dedupe, and only the survivors pay ``_passage`` — the eager
|
|
719
|
+
version computed 39,726 windows on a real machine to display 60.
|
|
720
|
+
"""
|
|
721
|
+
return [cast(Hit, {**h, "snippet": _passage(h["snippet"], terms)})
|
|
722
|
+
for h in hits]
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
def _retrieve_from_index(docs: list[dict], scores: dict[int, float],
|
|
726
|
+
terms: list[str], k: int, kind: str | None,
|
|
727
|
+
) -> list[Hit] | None:
|
|
728
|
+
"""Rank from the index's own doc metadata — no full-catalogue parse.
|
|
729
|
+
|
|
730
|
+
The slow path builds a ``live`` map by parsing every tap cache on the
|
|
731
|
+
machine (458 files, ~100 MB, 0.32 s measured) to serve two needs: filter
|
|
732
|
+
docs whose entry is gone, and hand back real entry dicts. On a fresh index
|
|
733
|
+
both are answerable cheaper: every doc of a still-configured tap is live
|
|
734
|
+
by construction (``ensure()`` rebuilds on staleness), and only the final
|
|
735
|
+
``k`` survivors need materialising — so only *their* taps' caches load.
|
|
736
|
+
|
|
737
|
+
Ranking, dedupe and tie-breaks use index-side values (``n``/``h``/``k``)
|
|
738
|
+
that ``build()`` copied from the same cache entries the slow path reads,
|
|
739
|
+
plus a shadow entry carrying the two fields ``source_rank`` consults
|
|
740
|
+
(``tap``, ``curated``) from one ``registry.list_taps()`` snapshot — never
|
|
741
|
+
a second config read, and never :func:`registry.get`, which raises for a
|
|
742
|
+
concurrently-untapped name.
|
|
743
|
+
|
|
744
|
+
Returns ``None`` when any survivor's entry cannot be materialised (a tap
|
|
745
|
+
cache vanished or moved under a stat-fresh index): the caller reruns the
|
|
746
|
+
query through the explicit-entries path, whose output is the contract.
|
|
747
|
+
Byte-identical-or-fall-back, never approximate.
|
|
748
|
+
"""
|
|
749
|
+
taps = {t.name: t for t in registry.list_taps()}
|
|
750
|
+
best: dict[tuple[str, str], tuple[float, str, str, str]] = {}
|
|
751
|
+
for doc_id, score in scores.items():
|
|
752
|
+
d = docs[doc_id]
|
|
753
|
+
if kind is not None and d["k"] != kind:
|
|
754
|
+
continue
|
|
755
|
+
if d["t"] not in taps: # untapped repos stop ranking, stale or not
|
|
756
|
+
continue
|
|
757
|
+
key = (d["t"], d["f"])
|
|
758
|
+
prev = best.get(key)
|
|
759
|
+
if prev is None or score > prev[0]:
|
|
760
|
+
best[key] = (score, d["snip"], d.get("h", ""), d["n"])
|
|
761
|
+
ranked = sorted(best.items(),
|
|
762
|
+
key=lambda kv: (-kv[1][0], kv[1][3], kv[0]))
|
|
763
|
+
# The shadow entry carries exactly what downstream code reads before
|
|
764
|
+
# materialisation: `source_rank` consults tap + curated, and the loop
|
|
765
|
+
# below reads tap + skill_md. Nothing else — an extra field here would
|
|
766
|
+
# be dead weight pretending to be contract.
|
|
767
|
+
hits: list[Hit] = [
|
|
768
|
+
{"entry": {"tap": key[0], "skill_md": key[1],
|
|
769
|
+
"curated": taps[key[0]].curated},
|
|
770
|
+
"score": score, "content": digest,
|
|
771
|
+
"snippet": snip} # type: ignore[typeddict-item]
|
|
772
|
+
for key, (score, snip, digest, _name) in ranked]
|
|
773
|
+
# The FULL ranked list flows through dedupe, exactly as the slow path's
|
|
774
|
+
# does: a curated duplicate at rank 3,000 legally replaces the displayed
|
|
775
|
+
# source of survivor #1, so the promotion scan cannot be truncated.
|
|
776
|
+
survivors = dedupe_by_content(hits, len(hits))
|
|
777
|
+
loaded: dict[str, dict[tuple[str, str], dict]] = {}
|
|
778
|
+
out: list[Hit] = []
|
|
779
|
+
for hit in survivors:
|
|
780
|
+
if len(out) == k:
|
|
781
|
+
break
|
|
782
|
+
tap_name = hit["entry"]["tap"]
|
|
783
|
+
tap = taps.get(tap_name)
|
|
784
|
+
if tap is None: # promoted source raced an untap
|
|
785
|
+
return None
|
|
786
|
+
if tap_name not in loaded:
|
|
787
|
+
loaded[tap_name] = {entry_key(e): e
|
|
788
|
+
for e in catalog.load_tap(tap)}
|
|
789
|
+
entry = loaded[tap_name].get((tap_name, hit["entry"]["skill_md"]))
|
|
790
|
+
if entry is None:
|
|
791
|
+
return None
|
|
792
|
+
out.append(cast(Hit, {**hit, "entry": entry,
|
|
793
|
+
"snippet": _passage(hit["snippet"], terms)}))
|
|
794
|
+
return out
|
|
795
|
+
|
|
796
|
+
|
|
712
797
|
def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
713
798
|
entries: list[dict] | None = None) -> list[Hit]:
|
|
714
799
|
"""Top-k full-content hits for ``query``. ``[]`` if the index is empty."""
|
|
@@ -718,11 +803,20 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
718
803
|
terms = tokenize(query)
|
|
719
804
|
if not terms:
|
|
720
805
|
return []
|
|
721
|
-
entries = catalog.all_entries() if entries is None else entries
|
|
722
|
-
live = {entry_key(e): e for e in entries}
|
|
723
806
|
docs = raw["docs"]
|
|
807
|
+
scores = _bm25(terms, raw, read_postings(terms))
|
|
808
|
+
if entries is None:
|
|
809
|
+
fast = _retrieve_from_index(docs, scores, terms, k, kind)
|
|
810
|
+
if fast is not None:
|
|
811
|
+
return fast
|
|
812
|
+
# An entry vanished between index and cache: answer from the full
|
|
813
|
+
# catalogue exactly as before the fast path existed. One side effect
|
|
814
|
+
# rides along only here now — load_tap's rescan of old-CACHE_FORMAT
|
|
815
|
+
# caches, which otherwise happens on tap operations and build().
|
|
816
|
+
entries = catalog.all_entries()
|
|
817
|
+
live = {entry_key(e): e for e in entries}
|
|
724
818
|
best: dict[tuple[str, str], tuple[float, str, str]] = {}
|
|
725
|
-
for doc_id, score in
|
|
819
|
+
for doc_id, score in scores.items():
|
|
726
820
|
d = docs[doc_id]
|
|
727
821
|
if kind is not None and d["k"] != kind:
|
|
728
822
|
continue
|
|
@@ -742,9 +836,9 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
742
836
|
# or they still consume the slots they were removed from.
|
|
743
837
|
hits: list[Hit] = [
|
|
744
838
|
{"entry": live[key], "score": score, "content": digest,
|
|
745
|
-
"snippet":
|
|
839
|
+
"snippet": snip} # type: ignore[typeddict-item]
|
|
746
840
|
for key, (score, snip, digest) in ranked]
|
|
747
|
-
return dedupe_by_content(hits, k)
|
|
841
|
+
return _windowed(dedupe_by_content(hits, k), terms)
|
|
748
842
|
|
|
749
843
|
|
|
750
844
|
#: The label `rerank` returns when the LLM pass actually ran. Every other value
|
|
@@ -213,6 +213,7 @@ docs/roadmap/items/ci-time-is-now-runner-queueing.md
|
|
|
213
213
|
docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
|
|
214
214
|
docs/roadmap/items/code-scanning-rule-can-be-restored.md
|
|
215
215
|
docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
|
|
216
|
+
docs/roadmap/items/cold-search-reads-the-whole-catalogue.md
|
|
216
217
|
docs/roadmap/items/command-carousel-page.md
|
|
217
218
|
docs/roadmap/items/command-reference-docs-site.md
|
|
218
219
|
docs/roadmap/items/completions-complete-only-command-names.md
|
|
@@ -615,6 +616,7 @@ tests/unit/test_dense.py
|
|
|
615
616
|
tests/unit/test_dense_embed_dedupe.py
|
|
616
617
|
tests/unit/test_dense_fallback.py
|
|
617
618
|
tests/unit/test_dense_fix_hint.py
|
|
619
|
+
tests/unit/test_dense_ready_order.py
|
|
618
620
|
tests/unit/test_dense_shard_real_schema.py
|
|
619
621
|
tests/unit/test_dense_shard_unreadable_vectors.py
|
|
620
622
|
tests/unit/test_dense_shards.py
|
|
@@ -684,6 +686,7 @@ tests/unit/test_projectlock.py
|
|
|
684
686
|
tests/unit/test_provenance.py
|
|
685
687
|
tests/unit/test_publish_golden_dataset.py
|
|
686
688
|
tests/unit/test_rag.py
|
|
689
|
+
tests/unit/test_rag_fastpath.py
|
|
687
690
|
tests/unit/test_rag_fusion.py
|
|
688
691
|
tests/unit/test_registries_fresh.py
|
|
689
692
|
tests/unit/test_registry.py
|
|
Binary file
|
|
@@ -135,6 +135,21 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
|
|
|
135
135
|
Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
|
|
136
136
|
dict-of-postings scan — comfortably sub-second per query in Python.
|
|
137
137
|
|
|
138
|
+
**Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
|
|
139
|
+
`entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
|
|
140
|
+
the index's own doc metadata and materialises real catalog entries only for the
|
|
141
|
+
final `k` survivors, loading only *their* taps' caches (`_retrieve_from_index`).
|
|
142
|
+
The previous shape parsed every tap cache on the machine per query
|
|
143
|
+
(`catalog.all_entries()`: 458 files / ~100 MB / 0.32 s measured at 71.6k
|
|
144
|
+
entries) and computed a display snippet for every scored doc (39,726 calls to
|
|
145
|
+
serve 60). Snippet windowing now runs on returned hits only, on both paths.
|
|
146
|
+
The contract is byte-identical-or-fall-back: any survivor whose entry cannot be
|
|
147
|
+
materialised (a tap cache vanished under a stat-fresh index) reruns the query
|
|
148
|
+
through the explicit-`entries` path rather than approximating. An explicit
|
|
149
|
+
`entries=` list (the eval harness, `boost chat`) keeps today's exact path.
|
|
150
|
+
`dense.ready()` stats the store before importing the backend for the same
|
|
151
|
+
cold-path reason. Measured end to end: 0.94 s → 0.49 s cold at 458 taps.
|
|
152
|
+
|
|
138
153
|
### 6b. Two-stage pipeline — upgrade `boost_search` / `catalog.search` **in place**
|
|
139
154
|
|
|
140
155
|
No parallel MCP tool (per decision). The upgraded flow:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cold-search-reads-the-whole-catalogue
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Performance · Search
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: 0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use
|
|
11
|
+
order: 122
|
|
12
|
+
owner: loop/search-perf
|
|
13
|
+
pr:
|
|
14
|
+
title: A cold search materialises 71,600 entries to print five
|
|
15
|
+
---
|
|
16
|
+
Profiled cold <code>boost search</code> at real scale (458 taps, 71,600
|
|
17
|
+
entries): 0.94 s, of which <b>0.32 s</b> is <code>catalog.all_entries()</code>
|
|
18
|
+
parsing every tap cache on the machine (~100 MB of JSON) to build a
|
|
19
|
+
<code>live</code> map whose entries are only <i>displayed</i> for the final k
|
|
20
|
+
hits, <b>0.11 s</b> is <code>_passage</code> windowing a snippet for all
|
|
21
|
+
39,726 scored docs to show 60, and <b>0.12 s</b> is <code>dense.ready()</code>
|
|
22
|
+
importing numpy via sqlite_vec just to answer "no vector store". BM25 scoring
|
|
23
|
+
itself: 18 ms. The engine was fine; the packaging around it was the cost.<br><br>
|
|
24
|
+
Shipped: <code>rag.retrieve(entries=None)</code> now ranks off the index's own
|
|
25
|
+
doc metadata (name/hash/kind/length all live there already), runs the full
|
|
26
|
+
ranked list through <code>dedupe_by_content</code> with shadow entries carrying
|
|
27
|
+
the two fields <code>source_rank</code> reads, and materialises real entries
|
|
28
|
+
for just the survivors' taps — with a <b>byte-identical-or-fall-back</b>
|
|
29
|
+
contract: any survivor that fails to materialise reruns the query through the
|
|
30
|
+
explicit-<code>entries</code> path (the eval-gate path, unchanged). Snippets
|
|
31
|
+
window on returned hits only, on both paths; <code>dense.ready()</code> stats
|
|
32
|
+
before importing; <code>_load_raw</code> keys its cache on
|
|
33
|
+
<code>(mtime_ns, size)</code>. Measured after: <b>0.94 s → 0.49 s cold</b>.
|
|
34
|
+
Complement of the shipped <i>cache-the-catalog-entry-set-across-rag-queries</i>
|
|
35
|
+
(PR 114), which memoised <code>all_entries</code> per process — warm repeats
|
|
36
|
+
were already amortised; this removes the cold-start read entirely.<br><br>
|
|
37
|
+
Analysed and deliberately <b>deferred</b>: moving the per-doc
|
|
38
|
+
<code>snip</code> out of <code>rag_index.json</code> into the postings SQLite.
|
|
39
|
+
<i>bm25-index-is-one-json-blob</i> declined it at 743 entries (14% of the
|
|
40
|
+
JSON); at 71.6k the premise inverts — snips are ~76% (46 MB → 11.4 MB slim,
|
|
41
|
+
103 ms → 37 ms parse) — but an adversarial design review found the v6→v7
|
|
42
|
+
in-place migration can clobber a concurrently rebuilt pair without a
|
|
43
|
+
build-id pairing token, and a mixed-version machine (pipx CLI + long-running
|
|
44
|
+
MCP serve) thrashes full 71k-file reindexes across the version boundary.
|
|
45
|
+
66 ms does not buy that; if the recorded (tap, skill_md)-keyed postings
|
|
46
|
+
follow-up ever lands, fold the snip move into that single format bump.
|
|
47
|
+
Residual known cost: the "semantic search is off" hint imports the backend
|
|
48
|
+
(~0.1 s) on machines with the extra installed but no store built — the one
|
|
49
|
+
state where that line is the advice.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>261</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -6849,6 +6849,51 @@ was a comment. A comment cannot fail a build.</p>
|
|
|
6849
6849
|
<span class="m">a comment in the sibling file predicted this exact failure</span>
|
|
6850
6850
|
</div>
|
|
6851
6851
|
</article>
|
|
6852
|
+
|
|
6853
|
+
<article class="cap rcard" id="cold-search-reads-the-whole-catalogue">
|
|
6854
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Performance · Search</span></div>
|
|
6855
|
+
<h3>A cold search materialises 71,600 entries to print five</h3>
|
|
6856
|
+
<p>Profiled cold <code>boost search</code> at real scale (458 taps, 71,600
|
|
6857
|
+
entries): 0.94 s, of which <b>0.32 s</b> is <code>catalog.all_entries()</code>
|
|
6858
|
+
parsing every tap cache on the machine (~100 MB of JSON) to build a
|
|
6859
|
+
<code>live</code> map whose entries are only <i>displayed</i> for the final k
|
|
6860
|
+
hits, <b>0.11 s</b> is <code>_passage</code> windowing a snippet for all
|
|
6861
|
+
39,726 scored docs to show 60, and <b>0.12 s</b> is <code>dense.ready()</code>
|
|
6862
|
+
importing numpy via sqlite_vec just to answer "no vector store". BM25 scoring
|
|
6863
|
+
itself: 18 ms. The engine was fine; the packaging around it was the cost.<br><br>
|
|
6864
|
+
Shipped: <code>rag.retrieve(entries=None)</code> now ranks off the index's own
|
|
6865
|
+
doc metadata (name/hash/kind/length all live there already), runs the full
|
|
6866
|
+
ranked list through <code>dedupe_by_content</code> with shadow entries carrying
|
|
6867
|
+
the two fields <code>source_rank</code> reads, and materialises real entries
|
|
6868
|
+
for just the survivors' taps — with a <b>byte-identical-or-fall-back</b>
|
|
6869
|
+
contract: any survivor that fails to materialise reruns the query through the
|
|
6870
|
+
explicit-<code>entries</code> path (the eval-gate path, unchanged). Snippets
|
|
6871
|
+
window on returned hits only, on both paths; <code>dense.ready()</code> stats
|
|
6872
|
+
before importing; <code>_load_raw</code> keys its cache on
|
|
6873
|
+
<code>(mtime_ns, size)</code>. Measured after: <b>0.94 s → 0.49 s cold</b>.
|
|
6874
|
+
Complement of the shipped <i>cache-the-catalog-entry-set-across-rag-queries</i>
|
|
6875
|
+
(PR 114), which memoised <code>all_entries</code> per process — warm repeats
|
|
6876
|
+
were already amortised; this removes the cold-start read entirely.<br><br>
|
|
6877
|
+
Analysed and deliberately <b>deferred</b>: moving the per-doc
|
|
6878
|
+
<code>snip</code> out of <code>rag_index.json</code> into the postings SQLite.
|
|
6879
|
+
<i>bm25-index-is-one-json-blob</i> declined it at 743 entries (14% of the
|
|
6880
|
+
JSON); at 71.6k the premise inverts — snips are ~76% (46 MB → 11.4 MB slim,
|
|
6881
|
+
103 ms → 37 ms parse) — but an adversarial design review found the v6→v7
|
|
6882
|
+
in-place migration can clobber a concurrently rebuilt pair without a
|
|
6883
|
+
build-id pairing token, and a mixed-version machine (pipx CLI + long-running
|
|
6884
|
+
MCP serve) thrashes full 71k-file reindexes across the version boundary.
|
|
6885
|
+
66 ms does not buy that; if the recorded (tap, skill_md)-keyed postings
|
|
6886
|
+
follow-up ever lands, fold the snip move into that single format bump.
|
|
6887
|
+
Residual known cost: the "semantic search is off" hint imports the backend
|
|
6888
|
+
(~0.1 s) on machines with the extra installed but no store built — the one
|
|
6889
|
+
state where that line is the advice.</p>
|
|
6890
|
+
<div class="meta">
|
|
6891
|
+
<span class="m">Complexity <b>M</b></span>
|
|
6892
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
6893
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
6894
|
+
<span class="m">0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use</span>
|
|
6895
|
+
</div>
|
|
6896
|
+
</article>
|
|
6852
6897
|
<!-- /ROADMAP:cards -->
|
|
6853
6898
|
|
|
6854
6899
|
</div>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""dense.ready() must stat before it imports.
|
|
2
|
+
|
|
3
|
+
On a machine with no vector store — the common BM25-only install — ready()
|
|
4
|
+
used to import sqlite_vec (which drags in numpy, ~120 ms measured) just to
|
|
5
|
+
answer False. The cheap ``db_path().exists()`` check has to come first; the
|
|
6
|
+
backend and provider probes only run once there is a store worth opening.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
from boost_cli.core import dense, embed, paths
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TestReadyShortCircuit:
|
|
16
|
+
def test_missing_store_answers_false_without_importing(self, sandbox,
|
|
17
|
+
monkeypatch):
|
|
18
|
+
monkeypatch.setattr(
|
|
19
|
+
dense, "_load",
|
|
20
|
+
lambda: pytest.fail("no store on disk — backend must not import"))
|
|
21
|
+
monkeypatch.setattr(
|
|
22
|
+
embed, "available",
|
|
23
|
+
lambda: pytest.fail("no store on disk — provider must not probe"))
|
|
24
|
+
assert not dense.db_path().exists()
|
|
25
|
+
assert dense.ready() is False
|
|
26
|
+
|
|
27
|
+
def test_present_store_still_requires_the_backend(self, sandbox,
|
|
28
|
+
monkeypatch):
|
|
29
|
+
paths.ensure_dirs()
|
|
30
|
+
dense.db_path().write_bytes(b"")
|
|
31
|
+
monkeypatch.setattr(dense, "_load", lambda: None)
|
|
32
|
+
assert dense.ready() is False
|
|
33
|
+
|
|
34
|
+
def test_present_store_still_requires_a_provider(self, sandbox,
|
|
35
|
+
monkeypatch):
|
|
36
|
+
paths.ensure_dirs()
|
|
37
|
+
dense.db_path().write_bytes(b"")
|
|
38
|
+
monkeypatch.setattr(dense, "have_backend", lambda: True)
|
|
39
|
+
monkeypatch.setattr(embed, "available", lambda: False)
|
|
40
|
+
assert dense.ready() is False
|
|
@@ -576,6 +576,23 @@ class TestRerank:
|
|
|
576
576
|
assert "beta-snippet" in p
|
|
577
577
|
|
|
578
578
|
|
|
579
|
+
def _wire_live_catalog(monkeypatch, entries):
|
|
580
|
+
"""Serve ``entries`` as the machine's live catalogue for ``entries=None``.
|
|
581
|
+
|
|
582
|
+
The fast path sources from ``registry.list_taps()`` + ``catalog.load_tap``
|
|
583
|
+
(never the whole catalogue); its vanished-entry fallback still reads
|
|
584
|
+
``all_entries``. Wire all three seams so either route sees the same data.
|
|
585
|
+
"""
|
|
586
|
+
from boost_cli.core import registry
|
|
587
|
+
taps = sorted({e["tap"] for e in entries})
|
|
588
|
+
monkeypatch.setattr(registry, "list_taps",
|
|
589
|
+
lambda: [registry.Tap(name=t, url="") for t in taps])
|
|
590
|
+
monkeypatch.setattr(
|
|
591
|
+
rag.catalog, "load_tap",
|
|
592
|
+
lambda tap, rebuild=False: [e for e in entries if e["tap"] == tap.name])
|
|
593
|
+
monkeypatch.setattr(rag.catalog, "all_entries", lambda: entries)
|
|
594
|
+
|
|
595
|
+
|
|
579
596
|
class TestSearchSeam:
|
|
580
597
|
def test_search_none_without_index(self, sandbox):
|
|
581
598
|
assert rag.search("x") is None
|
|
@@ -583,8 +600,7 @@ class TestSearchSeam:
|
|
|
583
600
|
def test_search_smart_false_returns_bm25(self, corpus, monkeypatch):
|
|
584
601
|
_root, entries = corpus
|
|
585
602
|
rag.build(entries=entries, force=True)
|
|
586
|
-
|
|
587
|
-
monkeypatch.setattr(rag.catalog, "all_entries", lambda: entries)
|
|
603
|
+
_wire_live_catalog(monkeypatch, entries)
|
|
588
604
|
result = rag.search("testing", limit=5, smart=False)
|
|
589
605
|
assert result is not None
|
|
590
606
|
hits, label = result
|
|
@@ -594,7 +610,7 @@ class TestSearchSeam:
|
|
|
594
610
|
def test_search_smart_degrades_without_ai(self, corpus, monkeypatch):
|
|
595
611
|
_root, entries = corpus
|
|
596
612
|
rag.build(entries=entries, force=True)
|
|
597
|
-
monkeypatch
|
|
613
|
+
_wire_live_catalog(monkeypatch, entries)
|
|
598
614
|
monkeypatch.setattr(rag.ai, "available", lambda: False)
|
|
599
615
|
_hits, label = rag.search("testing", limit=5)
|
|
600
616
|
assert label == "BM25 full-content"
|
|
@@ -602,7 +618,7 @@ class TestSearchSeam:
|
|
|
602
618
|
def test_search_smart_is_default_and_uses_ai(self, corpus, monkeypatch):
|
|
603
619
|
_root, entries = corpus
|
|
604
620
|
rag.build(entries=entries, force=True)
|
|
605
|
-
monkeypatch
|
|
621
|
+
_wire_live_catalog(monkeypatch, entries)
|
|
606
622
|
monkeypatch.setattr(rag.ai, "available", lambda: True)
|
|
607
623
|
monkeypatch.setattr(rag.ai, "ask",
|
|
608
624
|
lambda *a, **k: '["pytest-helper", "jest-runner"]')
|
|
@@ -621,7 +637,7 @@ class TestSearchSeam:
|
|
|
621
637
|
entries.append(_entry(name, skill_md="%s/SKILL.md" % name))
|
|
622
638
|
monkeypatch.setattr(rag, "_tap_paths", lambda: {"acme/skills": root})
|
|
623
639
|
monkeypatch.setattr(rag, "_tap_commits", lambda: {"acme__skills": "c1"})
|
|
624
|
-
monkeypatch
|
|
640
|
+
_wire_live_catalog(monkeypatch, entries)
|
|
625
641
|
monkeypatch.setattr(rag.ai, "available", lambda: False)
|
|
626
642
|
rag.build(entries=entries, force=True)
|
|
627
643
|
hits, _label = rag.search("testing common") # default limit == 10
|