boost-skill-cli 1.2.50__tar.gz → 1.2.51__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.50 → boost_skill_cli-1.2.51}/CLAUDE.md +12 -0
- {boost_skill_cli-1.2.50/boost_skill_cli.egg-info → boost_skill_cli-1.2.51}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/discovery.py +41 -4
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/dense.py +43 -8
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/util.py +17 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- boost_skill_cli-1.2.51/tests/unit/test_dense_progress.py +211 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.gitattributes +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.gitignore +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.vale.ini +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/DCO +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/LICENSE +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/Makefile +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/README.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/codecov.yml +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/index.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/README.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/examples/README.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/index.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/noxfile.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/setup.cfg +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/style/README.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/style/boost.css +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/style/boost.js +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/style/demo.html +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/tests/visual/visual_check.mjs +0 -0
|
@@ -534,6 +534,18 @@ Consequences for code you write here:
|
|
|
534
534
|
the measured trade is **3.40 GB → 3.87 GB (+14%), in 1360 s**, peaking at
|
|
535
535
|
~2× while both copies coexist. Don't describe it as size-neutral — an earlier
|
|
536
536
|
draft of this section did, from prediction rather than measurement.
|
|
537
|
+
- **Embedding reports progress and commits as it goes.** `dense.build` takes
|
|
538
|
+
`on_progress(done, total)` and `_embed_and_store` commits every
|
|
539
|
+
`_COMMIT_EVERY` rows. Both are bug fixes, not polish: a full catalogue is
|
|
540
|
+
tens of thousands of distinct chunks under one fixed spinner label, which a
|
|
541
|
+
user reported as a hang after hours; and every row used to land in a single
|
|
542
|
+
transaction that committed after the last one, so an interrupt threw away the
|
|
543
|
+
whole build. Periodic commits are safe because `build` deletes each changed
|
|
544
|
+
tap's rows *before* re-inserting, so a partial store is replaced rather than
|
|
545
|
+
doubled. The total counts **distinct** texts, not rows — 42.9% of chunks on a
|
|
546
|
+
real install are repeats and are embedded once — so a progress total taken
|
|
547
|
+
from row count would over-report the work.
|
|
548
|
+
|
|
537
549
|
- **Nothing on the search path may count `chunks`.** `SELECT COUNT(*)` scans the
|
|
538
550
|
`chunks_tap` covering index — 8,419 pages / 34.5 MB, measured 1.94 s — and
|
|
539
551
|
both `ready()` and `status()` did it on every search, the latter only to word
|
|
@@ -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.51'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 51)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -388,8 +388,8 @@ def cmd_reindex(argv):
|
|
|
388
388
|
# holds — count, stats, trending, plain search. See the import-budget
|
|
389
389
|
# gate (scripts/import_budget.py).
|
|
390
390
|
from ..core import embed
|
|
391
|
-
with spin.Spinner("embedding chunks into the dense store"):
|
|
392
|
-
dense_stats = _reindex_dense(args.force)
|
|
391
|
+
with spin.Spinner("embedding chunks into the dense store") as sp:
|
|
392
|
+
dense_stats = _reindex_dense(args.force, spinner=sp)
|
|
393
393
|
if args.as_json:
|
|
394
394
|
print(json.dumps({"bm25": stats, "dense": dense_stats}
|
|
395
395
|
if args.dense else stats))
|
|
@@ -434,7 +434,44 @@ def cmd_reindex(argv):
|
|
|
434
434
|
return 0
|
|
435
435
|
|
|
436
436
|
|
|
437
|
-
def
|
|
437
|
+
def _embed_progress(spinner):
|
|
438
|
+
"""A callback that rewrites the spinner's label with real numbers.
|
|
439
|
+
|
|
440
|
+
Embedding is the longest thing boost does — tens of thousands of distinct
|
|
441
|
+
chunks at roughly a second each for a full catalogue — and it ran under a
|
|
442
|
+
fixed label for hours. "embedding chunks into the dense store" is
|
|
443
|
+
indistinguishable from a hang, which is exactly how it was reported.
|
|
444
|
+
|
|
445
|
+
The rate comes from this run rather than a constant, because the two
|
|
446
|
+
backends differ by an order of magnitude and a local model's throughput
|
|
447
|
+
depends on the machine. Until a batch has finished there is nothing to
|
|
448
|
+
estimate from, so it says the total and nothing else rather than guessing.
|
|
449
|
+
"""
|
|
450
|
+
started = time.monotonic()
|
|
451
|
+
|
|
452
|
+
def report(done: int, total: int) -> None:
|
|
453
|
+
if spinner is None or not total:
|
|
454
|
+
return
|
|
455
|
+
pct = 100.0 * done / total
|
|
456
|
+
# The bar first, because it is the part that answers the question the
|
|
457
|
+
# user actually has — "is this moving?" — at a glance, before any of
|
|
458
|
+
# the digits are read. `spin.bar` is the same determinate bar the rest
|
|
459
|
+
# of the CLI draws, so this looks like boost rather than like a
|
|
460
|
+
# second progress convention.
|
|
461
|
+
label = "embedding %s %d%% · %s/%s chunks" % (
|
|
462
|
+
spin.bar(done, total, width=16), int(pct),
|
|
463
|
+
format(done, ","), format(total, ","))
|
|
464
|
+
elapsed = time.monotonic() - started
|
|
465
|
+
if done and elapsed > 1:
|
|
466
|
+
remaining = (total - done) * (elapsed / done)
|
|
467
|
+
if remaining >= 1:
|
|
468
|
+
label += " · ~%s left" % util.human_duration(remaining)
|
|
469
|
+
spinner.label = label
|
|
470
|
+
|
|
471
|
+
return report
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
def _reindex_dense(force, spinner=None):
|
|
438
475
|
"""Build the dense vector store; returns stats or None when unavailable."""
|
|
439
476
|
# Local import: the dense/embedding engines are opt-in (`search --dense`),
|
|
440
477
|
# so they stay out of startup for every other command in this module.
|
|
@@ -447,7 +484,7 @@ def _reindex_dense(force):
|
|
|
447
484
|
# only what changed. Doing it after would quantize, then write float32 rows
|
|
448
485
|
# into a store that no longer has a float32 table.
|
|
449
486
|
migrated = dense.quantize()
|
|
450
|
-
stats = dense.build(force=force)
|
|
487
|
+
stats = dense.build(force=force, on_progress=_embed_progress(spinner))
|
|
451
488
|
if migrated and isinstance(stats, dict):
|
|
452
489
|
stats = stats | {"quantized": migrated["chunks"]}
|
|
453
490
|
return stats
|
|
@@ -25,6 +25,11 @@ from .rag import Hit, chunk, entry_key, read_body
|
|
|
25
25
|
|
|
26
26
|
INDEX_VERSION = 2
|
|
27
27
|
_BATCH = 128 # texts per embedding request
|
|
28
|
+
|
|
29
|
+
#: Rows between commits while storing vectors. Small enough that an interrupted
|
|
30
|
+
#: build keeps almost everything it embedded, large enough that the commits are
|
|
31
|
+
#: not the cost — on a 750k-chunk store this is ~150 commits.
|
|
32
|
+
_COMMIT_EVERY = 5000
|
|
28
33
|
_POOL = 8 # chunk over-fetch factor for KNN before per-entry reduce
|
|
29
34
|
|
|
30
35
|
|
|
@@ -462,12 +467,20 @@ def ready() -> bool:
|
|
|
462
467
|
con.close()
|
|
463
468
|
|
|
464
469
|
|
|
465
|
-
def build(entries: list[dict] | None = None,
|
|
466
|
-
|
|
470
|
+
def build(entries: list[dict] | None = None, force: bool = False,
|
|
471
|
+
on_progress=None) -> dict | None:
|
|
467
472
|
"""(Re)embed and store chunk vectors, reusing unchanged taps.
|
|
468
473
|
|
|
469
474
|
Returns stats, or ``None`` if the backend or an embeddings provider is
|
|
470
475
|
unavailable (nothing is written in that case).
|
|
476
|
+
|
|
477
|
+
``on_progress(done, total)`` is called before the first batch and after
|
|
478
|
+
each one. It exists because this is the longest-running thing boost does —
|
|
479
|
+
a full catalogue is tens of thousands of distinct chunks at roughly a
|
|
480
|
+
second each — and it used to run under a bare spinner that said "embedding
|
|
481
|
+
chunks into the dense store" for hours without a number. A user cannot
|
|
482
|
+
tell that apart from a hang, and the honest fix is to say how many there
|
|
483
|
+
are and how far in we got.
|
|
471
484
|
"""
|
|
472
485
|
from .rag import _tap_commits, _tap_paths
|
|
473
486
|
if not have_backend() or not embed.available():
|
|
@@ -517,7 +530,8 @@ def build(entries: list[dict] | None = None,
|
|
|
517
530
|
removed_taps = sorted(_indexed_taps(con) - {e["tap"] for e in entries})
|
|
518
531
|
_delete_taps(con, changed_taps + removed_taps)
|
|
519
532
|
|
|
520
|
-
added, failed_taps = _embed_and_store(con, fresh, tap_paths
|
|
533
|
+
added, failed_taps = _embed_and_store(con, fresh, tap_paths,
|
|
534
|
+
on_progress=on_progress)
|
|
521
535
|
# Only record a commit for a tap whose chunks actually landed. Recording
|
|
522
536
|
# one for a tap that stored nothing makes every later non-forced run
|
|
523
537
|
# treat it as already built and skip it — one transient rate limit would
|
|
@@ -743,8 +757,8 @@ def _delete_taps(con: sqlite3.Connection, taps: list[str]) -> None:
|
|
|
743
757
|
|
|
744
758
|
|
|
745
759
|
def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
|
|
746
|
-
tap_paths: dict[str, Path] | None
|
|
747
|
-
) -> tuple[int, set]:
|
|
760
|
+
tap_paths: dict[str, Path] | None,
|
|
761
|
+
on_progress=None) -> tuple[int, set]:
|
|
748
762
|
"""Embed every chunk of ``entries``; returns ``(added, failed_taps)``.
|
|
749
763
|
|
|
750
764
|
A batch the provider rejects (rate limit, quota, oversized input) yields no
|
|
@@ -778,15 +792,31 @@ def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
|
|
|
778
792
|
order.append(text)
|
|
779
793
|
|
|
780
794
|
vec_of: dict[str, object] = {}
|
|
795
|
+
if on_progress is not None:
|
|
796
|
+
# Reported before the first request, so the size of the job is known
|
|
797
|
+
# up front rather than inferred from how long it has already taken.
|
|
798
|
+
on_progress(0, len(order))
|
|
781
799
|
for start in range(0, len(order), _BATCH):
|
|
782
800
|
batch = order[start:start + _BATCH]
|
|
783
801
|
vecs = embed.embed(batch, input_type="document")
|
|
784
|
-
if
|
|
785
|
-
|
|
786
|
-
|
|
802
|
+
if vecs and len(vecs) == len(batch):
|
|
803
|
+
vec_of.update(zip(batch, vecs, strict=True))
|
|
804
|
+
# else: taps are attributed per row below, not per batch — but the
|
|
805
|
+
# progress count still advances, or a run with a few rejected batches
|
|
806
|
+
# would appear to stall.
|
|
807
|
+
if on_progress is not None:
|
|
808
|
+
on_progress(min(start + _BATCH, len(order)), len(order))
|
|
787
809
|
|
|
788
810
|
added = 0
|
|
789
811
|
failed_taps: set = set()
|
|
812
|
+
# Durability, not speed. Every row used to land in one transaction that
|
|
813
|
+
# committed only after the last one, so interrupting a three-hour build —
|
|
814
|
+
# or losing the machine to a sleep or an OOM — threw away every vector it
|
|
815
|
+
# had paid for. Committing as the rows accumulate keeps the work, and
|
|
816
|
+
# re-running is still correct because `_delete_taps` has already removed
|
|
817
|
+
# each changed tap's old rows, so a partial store is replaced rather than
|
|
818
|
+
# doubled.
|
|
819
|
+
since_commit = 0
|
|
790
820
|
for e, ci, text in rows:
|
|
791
821
|
vec = vec_of.get(text)
|
|
792
822
|
if vec is None:
|
|
@@ -801,6 +831,11 @@ def _embed_and_store(con: sqlite3.Connection, entries: list[dict],
|
|
|
801
831
|
e.get("kind", "skill"), ci, text[:200].strip()))
|
|
802
832
|
_store_vector(con, cur.lastrowid, mod.serialize_float32(vec))
|
|
803
833
|
added += 1
|
|
834
|
+
since_commit += 1
|
|
835
|
+
if since_commit >= _COMMIT_EVERY:
|
|
836
|
+
con.commit()
|
|
837
|
+
since_commit = 0
|
|
838
|
+
con.commit()
|
|
804
839
|
return added, failed_taps
|
|
805
840
|
|
|
806
841
|
|
|
@@ -168,6 +168,23 @@ def rel_time(iso: str) -> str:
|
|
|
168
168
|
return then.strftime("%Y-%m-%d")
|
|
169
169
|
|
|
170
170
|
|
|
171
|
+
def human_duration(seconds: float) -> str:
|
|
172
|
+
"""A short, honest duration: ``'45s'``, ``'12m'``, ``'2h 5m'``.
|
|
173
|
+
|
|
174
|
+
Coarse on purpose. This labels an estimate that is extrapolated from a
|
|
175
|
+
partial run, so seconds of precision on a two-hour figure would claim an
|
|
176
|
+
accuracy the number does not have.
|
|
177
|
+
"""
|
|
178
|
+
seconds = max(0, int(seconds))
|
|
179
|
+
if seconds < 60:
|
|
180
|
+
return "%ds" % seconds
|
|
181
|
+
minutes = seconds // 60
|
|
182
|
+
if minutes < 60:
|
|
183
|
+
return "%dm" % minutes
|
|
184
|
+
hours, minutes = divmod(minutes, 60)
|
|
185
|
+
return "%dh %dm" % (hours, minutes) if minutes else "%dh" % hours
|
|
186
|
+
|
|
187
|
+
|
|
171
188
|
def human_size(n: int) -> str:
|
|
172
189
|
"""Format a byte count for humans: ``1536`` -> ``'1.5KB'``.
|
|
173
190
|
|
|
@@ -682,6 +682,7 @@ tests/unit/test_dense.py
|
|
|
682
682
|
tests/unit/test_dense_embed_dedupe.py
|
|
683
683
|
tests/unit/test_dense_fallback.py
|
|
684
684
|
tests/unit/test_dense_fix_hint.py
|
|
685
|
+
tests/unit/test_dense_progress.py
|
|
685
686
|
tests/unit/test_dense_quantized.py
|
|
686
687
|
tests/unit/test_dense_ready_order.py
|
|
687
688
|
tests/unit/test_dense_shard_real_schema.py
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Copyright the boost contributors.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
"""Embedding says how far along it is, and keeps what it embedded.
|
|
4
|
+
|
|
5
|
+
`boost reindex --dense` is the longest thing boost does — a full catalogue is
|
|
6
|
+
tens of thousands of distinct chunks at roughly a second each — and it ran under
|
|
7
|
+
one fixed label, "embedding chunks into the dense store", for hours. That is
|
|
8
|
+
indistinguishable from a hang, and it was reported as one.
|
|
9
|
+
|
|
10
|
+
Worse, every row landed in a single transaction that committed only after the
|
|
11
|
+
last one, so interrupting a three-hour build threw away everything it had paid
|
|
12
|
+
to embed. Both halves are pinned here: progress is reported with real numbers
|
|
13
|
+
from the first batch, and rows are durable long before the end.
|
|
14
|
+
|
|
15
|
+
Re-running after an interrupt stays correct because `build` deletes each
|
|
16
|
+
changed tap's rows before re-inserting them, so a partial store is replaced
|
|
17
|
+
rather than doubled — asserted below, since that is what makes periodic commits
|
|
18
|
+
safe rather than a duplication bug.
|
|
19
|
+
"""
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import sqlite3
|
|
23
|
+
|
|
24
|
+
import pytest
|
|
25
|
+
|
|
26
|
+
from boost_cli.core import dense, embed, rag, util
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _vec_loadable() -> bool:
|
|
30
|
+
con = sqlite3.connect(":memory:")
|
|
31
|
+
try:
|
|
32
|
+
import sqlite_vec
|
|
33
|
+
con.enable_load_extension(True)
|
|
34
|
+
sqlite_vec.load(con)
|
|
35
|
+
con.enable_load_extension(False)
|
|
36
|
+
con.execute("create virtual table t using vec0(embedding float[4])")
|
|
37
|
+
return True
|
|
38
|
+
except Exception:
|
|
39
|
+
return False
|
|
40
|
+
finally:
|
|
41
|
+
con.close()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# Scoped to the classes that need a vector store, not the module: the label
|
|
45
|
+
# and duration tests are pure and must still run where the extra is absent —
|
|
46
|
+
# which is every default install.
|
|
47
|
+
needs_vec = pytest.mark.skipif(
|
|
48
|
+
not _vec_loadable(), reason="sqlite-vec extension not loadable here")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _toy_embed(texts, input_type="document"):
|
|
52
|
+
return [[float(len(t) % 7), 1.0, 0.0, 0.5] for t in texts]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _entries(n):
|
|
56
|
+
return [{"name": "s%03d" % i, "tap": "acme/skills", "kind": "skill",
|
|
57
|
+
"skill_md": "skills/s%03d/SKILL.md" % i} for i in range(n)]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@pytest.fixture()
|
|
61
|
+
def dense_env(sandbox, monkeypatch):
|
|
62
|
+
monkeypatch.setattr(embed, "embed", _toy_embed)
|
|
63
|
+
monkeypatch.setattr(embed, "provider", lambda: "openai")
|
|
64
|
+
monkeypatch.setattr(embed, "model", lambda: "toy-4")
|
|
65
|
+
monkeypatch.setattr(embed, "dimension", lambda: 4)
|
|
66
|
+
monkeypatch.setattr(embed, "available", lambda: True)
|
|
67
|
+
monkeypatch.setattr(rag, "_tap_paths", lambda: {"acme/skills": "/x"})
|
|
68
|
+
monkeypatch.setattr(rag, "_tap_commits", lambda: {"acme__skills": "c1"})
|
|
69
|
+
# One distinct body per entry, so the distinct-text count is the entry
|
|
70
|
+
# count and the progress totals are predictable.
|
|
71
|
+
monkeypatch.setattr(dense, "read_body", lambda e, tp=None: e["name"])
|
|
72
|
+
return monkeypatch
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@needs_vec
|
|
76
|
+
class TestProgressReporting:
|
|
77
|
+
def test_it_reports_the_total_before_the_first_request(self, dense_env):
|
|
78
|
+
seen = []
|
|
79
|
+
dense.build(_entries(5), on_progress=lambda d, t: seen.append((d, t)))
|
|
80
|
+
# The size of the job has to be knowable up front; inferring it from
|
|
81
|
+
# how long it has already taken is what users were left doing.
|
|
82
|
+
assert seen[0] == (0, 5)
|
|
83
|
+
|
|
84
|
+
def test_it_reaches_the_total(self, dense_env):
|
|
85
|
+
seen = []
|
|
86
|
+
dense.build(_entries(5), on_progress=lambda d, t: seen.append((d, t)))
|
|
87
|
+
assert seen[-1] == (5, 5)
|
|
88
|
+
|
|
89
|
+
def test_progress_never_goes_backwards(self, dense_env):
|
|
90
|
+
seen = []
|
|
91
|
+
dense.build(_entries(300), on_progress=lambda d, t: seen.append(d))
|
|
92
|
+
assert seen == sorted(seen)
|
|
93
|
+
|
|
94
|
+
def test_it_advances_even_when_a_batch_is_rejected(self, dense_env):
|
|
95
|
+
# A provider that rejects a batch used to leave the count frozen for
|
|
96
|
+
# that stretch, which reads as the stall it is not.
|
|
97
|
+
dense_env.setattr(embed, "embed", lambda texts, input_type="document": [])
|
|
98
|
+
seen = []
|
|
99
|
+
dense.build(_entries(300), on_progress=lambda d, t: seen.append((d, t)))
|
|
100
|
+
assert seen[0] == (0, 300)
|
|
101
|
+
assert seen[-1] == (300, 300)
|
|
102
|
+
|
|
103
|
+
def test_no_callback_is_fine(self, dense_env):
|
|
104
|
+
# The MCP server and every non-interactive caller pass nothing.
|
|
105
|
+
assert dense.build(_entries(3)) is not None
|
|
106
|
+
|
|
107
|
+
def test_the_total_counts_distinct_texts_not_rows(self, dense_env):
|
|
108
|
+
# Registries mirror each other, so identical text is embedded once —
|
|
109
|
+
# a progress total that counted rows would over-report the work.
|
|
110
|
+
dense_env.setattr(dense, "read_body", lambda e, tp=None: "same body")
|
|
111
|
+
seen = []
|
|
112
|
+
dense.build(_entries(10), on_progress=lambda d, t: seen.append((d, t)))
|
|
113
|
+
assert seen[0] == (0, 1)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
@needs_vec
|
|
117
|
+
class TestDurability:
|
|
118
|
+
def _rows(self):
|
|
119
|
+
con = sqlite3.connect(str(dense.db_path()))
|
|
120
|
+
try:
|
|
121
|
+
return con.execute("SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
122
|
+
finally:
|
|
123
|
+
con.close()
|
|
124
|
+
|
|
125
|
+
def test_rows_survive_an_interrupt_mid_build(self, dense_env):
|
|
126
|
+
# The failure this prevents: hours of embedding discarded because the
|
|
127
|
+
# single transaction never reached its commit.
|
|
128
|
+
boom = {"n": 0}
|
|
129
|
+
real = dense._store_vector
|
|
130
|
+
|
|
131
|
+
def flaky(con, rowid, blob):
|
|
132
|
+
boom["n"] += 1
|
|
133
|
+
if boom["n"] > dense._COMMIT_EVERY + 10:
|
|
134
|
+
raise KeyboardInterrupt("user pressed ctrl-c")
|
|
135
|
+
return real(con, rowid, blob)
|
|
136
|
+
|
|
137
|
+
dense_env.setattr(dense, "_store_vector", flaky)
|
|
138
|
+
dense_env.setattr(dense, "_COMMIT_EVERY", 20)
|
|
139
|
+
with pytest.raises(KeyboardInterrupt):
|
|
140
|
+
dense.build(_entries(200))
|
|
141
|
+
assert self._rows() > 0
|
|
142
|
+
|
|
143
|
+
def test_a_rerun_replaces_a_partial_store_rather_than_doubling_it(
|
|
144
|
+
self, dense_env):
|
|
145
|
+
dense.build(_entries(20))
|
|
146
|
+
first = self._rows()
|
|
147
|
+
dense.build(_entries(20), force=True)
|
|
148
|
+
# `build` deletes each changed tap's rows before re-inserting, which is
|
|
149
|
+
# what makes committing part-way through safe.
|
|
150
|
+
assert self._rows() == first
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TestProgressLabel:
|
|
154
|
+
"""What the user actually reads while it runs. No dense backend needed."""
|
|
155
|
+
|
|
156
|
+
class _Spin:
|
|
157
|
+
label = ""
|
|
158
|
+
|
|
159
|
+
def test_it_names_the_count_and_percentage(self):
|
|
160
|
+
from boost_cli.commands import discovery
|
|
161
|
+
sp = self._Spin()
|
|
162
|
+
discovery._embed_progress(sp)(12480, 62331)
|
|
163
|
+
assert "12,480/62,331 chunks" in sp.label
|
|
164
|
+
assert "20%" in sp.label
|
|
165
|
+
|
|
166
|
+
def test_it_draws_a_determinate_bar(self):
|
|
167
|
+
# The bar answers "is this moving?" before any digit is read, which is
|
|
168
|
+
# the question a fixed spinner left unanswerable for hours.
|
|
169
|
+
from boost_cli.commands import discovery
|
|
170
|
+
sp = self._Spin()
|
|
171
|
+
report = discovery._embed_progress(sp)
|
|
172
|
+
report(0, 100)
|
|
173
|
+
assert "░" in sp.label and "▓" not in sp.label
|
|
174
|
+
report(50, 100)
|
|
175
|
+
assert sp.label.count("▓") == 8 # half of a 16-wide bar
|
|
176
|
+
report(100, 100)
|
|
177
|
+
assert "░" not in sp.label
|
|
178
|
+
|
|
179
|
+
def test_no_estimate_before_there_is_anything_to_estimate_from(self):
|
|
180
|
+
# Until a batch has finished there is no rate; inventing one would be
|
|
181
|
+
# a guess dressed as a measurement.
|
|
182
|
+
from boost_cli.commands import discovery
|
|
183
|
+
sp = self._Spin()
|
|
184
|
+
discovery._embed_progress(sp)(0, 62331)
|
|
185
|
+
assert "left" not in sp.label
|
|
186
|
+
|
|
187
|
+
def test_a_missing_spinner_is_a_no_op(self):
|
|
188
|
+
from boost_cli.commands import discovery
|
|
189
|
+
discovery._embed_progress(None)(5, 10) # must not raise
|
|
190
|
+
|
|
191
|
+
def test_zero_total_is_a_no_op(self):
|
|
192
|
+
from boost_cli.commands import discovery
|
|
193
|
+
sp = self._Spin()
|
|
194
|
+
discovery._embed_progress(sp)(0, 0)
|
|
195
|
+
assert sp.label == ""
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class TestHumanDuration:
|
|
199
|
+
"""The estimate's wording: coarse, because the number is extrapolated."""
|
|
200
|
+
|
|
201
|
+
@pytest.mark.parametrize("seconds,want", [
|
|
202
|
+
(0, "0s"), (45, "45s"), (60, "1m"), (600, "10m"),
|
|
203
|
+
(3600, "1h"), (7500, "2h 5m"),
|
|
204
|
+
])
|
|
205
|
+
def test_it_reads_as_a_person_would_say_it(self, seconds, want):
|
|
206
|
+
assert util.human_duration(seconds) == want
|
|
207
|
+
|
|
208
|
+
def test_negative_input_does_not_produce_nonsense(self):
|
|
209
|
+
# The estimate is (total - done) * rate; a clock that jumps backwards
|
|
210
|
+
# must not print "-3s left".
|
|
211
|
+
assert util.human_duration(-5) == "0s"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.2.50 → boost_skill_cli-1.2.51}/.vale/styles/config/vocabularies/boost/accept.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|