boost-skill-cli 1.2.44__tar.gz → 1.2.46__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.44 → boost_skill_cli-1.2.46}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/CLAUDE.md +37 -1
- {boost_skill_cli-1.2.44/boost_skill_cli.egg-info → boost_skill_cli-1.2.46}/PKG-INFO +24 -7
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/README.md +23 -6
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/cli.py +2 -1
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/discovery.py +58 -0
- boost_skill_cli-1.2.46/boost_cli/commands/quickstart.py +161 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/taps.py +49 -28
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/gitutil.py +38 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/registry.py +163 -1
- boost_skill_cli-1.2.46/boost_cli/core/shards.py +318 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46/boost_skill_cli.egg-info}/PKG-INFO +24 -7
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_skill_cli.egg-info/SOURCES.txt +8 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel.html +1 -1
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/commands.html +22 -8
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/index.html +7 -6
- boost_skill_cli-1.2.46/docs/roadmap/items/gstack-tap-first-then-coexistence.md +82 -0
- boost_skill_cli-1.2.46/docs/roadmap/items/published-shards-have-no-consumer.md +54 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap.html +130 -1
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/semantic-search.md +68 -1
- boost_skill_cli-1.2.46/scripts/publish_shards.py +166 -0
- boost_skill_cli-1.2.46/tests/functional/test_cli_quickstart.py +212 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_everyday_loop.py +1 -1
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/smoke.sh +1 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_errors_and_cli_table.py +8 -8
- boost_skill_cli-1.2.46/tests/unit/test_registry_parallel.py +230 -0
- boost_skill_cli-1.2.46/tests/unit/test_shards.py +293 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.gitattributes +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.gitignore +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/.vale.ini +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/DCO +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/LICENSE +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/Makefile +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/codecov.yml +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/README.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/examples/README.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/index.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/noxfile.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/setup.cfg +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/style/README.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/style/boost.css +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/style/boost.js +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/style/demo.html +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.44 → boost_skill_cli-1.2.46}/tests/visual/visual_check.mjs +0 -0
|
@@ -158,6 +158,22 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
|
|
|
158
158
|
93 MB), and must `update-index --refresh` first, because git silently declines
|
|
159
159
|
to remove a path whose stat data looks dirty and otherwise reports success
|
|
160
160
|
having changed nothing.
|
|
161
|
+
- **Tapping many registries goes through `registry.add_many`, and the reason is
|
|
162
|
+
the config file.** `add` ends in `config.load()` -> append -> `config.save()`,
|
|
163
|
+
which is read-modify-write on one JSON file: run it from N threads and taps
|
|
164
|
+
vanish at random. `add_many` clones in a `ThreadPoolExecutor` and writes the
|
|
165
|
+
config **once**, on one thread, after every clone has finished
|
|
166
|
+
(`tests/unit/test_registry_parallel.py` asserts the single write and the
|
|
167
|
+
concurrency separately). It is worth it because a clone is *latency*, not
|
|
168
|
+
bandwidth or CPU: ~1.6 s whether one runs or twelve, so `boost tap --catalog`
|
|
169
|
+
was 463 x 1.6 s = 13 minutes of waiting and is now **2 min 10 s** for the same
|
|
170
|
+
463 registries. Scanning stays serial on the caller's thread — it is 3 ms per
|
|
171
|
+
registry and writes a per-tap cache file, so parallelising it buys nothing and
|
|
172
|
+
scrambles output order. Cleanup after a failed clone must tolerate a
|
|
173
|
+
directory that was never created: `util.rmtree`'s read-only retry hook calls
|
|
174
|
+
`chmod` on the missing path and raises `FileNotFoundError`, which out of a worker thread
|
|
175
|
+
turns one 404 into a crashed catalog tap.
|
|
176
|
+
|
|
161
177
|
- **`~/.boost/cache/` holds boost's own indexes, not just tap catalogs.**
|
|
162
178
|
`paths.INTERNAL_CACHE_FILES` names them. `boost clean` sweeps `cache/*.json`
|
|
163
179
|
whose stem is not a configured tap, which described `rag_index.json` and
|
|
@@ -306,7 +322,7 @@ for both — edit items, run `build_roadmap.py`, never touch the HTML by hand.
|
|
|
306
322
|
## Architecture
|
|
307
323
|
|
|
308
324
|
**CLI dispatch.** `boost_cli/cli.py` holds `COMMANDS`, the single
|
|
309
|
-
source-of-truth list of `(name, group, module, summary)` for all
|
|
325
|
+
source-of-truth list of `(name, group, module, summary)` for all 81 commands.
|
|
310
326
|
Each command is implemented as `def cmd_<name_with_underscores>(argv) -> int`
|
|
311
327
|
inside `boost_cli/commands/<module>.py`, and `_dispatch` imports that module
|
|
312
328
|
lazily on invocation — so `boost --help` stays instant and command modules are
|
|
@@ -419,6 +435,26 @@ of the three item kinds (see Non-obvious rules above); `core/store.py` owns
|
|
|
419
435
|
install, uninstall and sync — copying into the canonical store, symlinking into
|
|
420
436
|
each agent's skills dir, and updating the lock file.
|
|
421
437
|
|
|
438
|
+
- **A published shard is only importable while three things match, and every
|
|
439
|
+
mismatch is silent if waved through.** `core/shards.py` fetches
|
|
440
|
+
`manifest.json` from a rolling `shards-latest` **prerelease** on this repo —
|
|
441
|
+
prerelease and `--latest=false` deliberately, so release-drafter (which
|
|
442
|
+
resolves the next version from published non-prereleases), the shields badge
|
|
443
|
+
in the README and setuptools-scm's `--match *[0-9]*` all keep ignoring it.
|
|
444
|
+
The manifest carries the embedding *space* once at the top, so
|
|
445
|
+
`shards.incompatible()` can refuse before downloading 129 MB; each row pins
|
|
446
|
+
the registry *commit*, checked in `shards.sync` and again in
|
|
447
|
+
`dense.import_shard`, because a stale shard makes `dense.build` mark that tap
|
|
448
|
+
"reused" forever; and each row's *sha256* is verified over the bytes written.
|
|
449
|
+
A shard URL off the manifest's own host is refused — a manifest names what
|
|
450
|
+
boost downloads, so it must not widen where the download goes. `boost tap
|
|
451
|
+
--at <sha>` exists for the commit rule: `boost quickstart` pins each registry
|
|
452
|
+
to the commit its vectors describe rather than tapping HEAD and hoping.
|
|
453
|
+
**Publish keyless vectors only** — a shard exported from a machine holding
|
|
454
|
+
`VOYAGE_API_KEY` is 1024-d `voyage-4` and can only be imported *or queried*
|
|
455
|
+
by another key-holder; `scripts/publish_shards.py manifest` refuses to
|
|
456
|
+
describe two spaces in one file.
|
|
457
|
+
|
|
422
458
|
**Search has two engines**, both in `core/`: `rag.py` is the always-on,
|
|
423
459
|
zero-dependency BM25 engine (full-content index, auto-builds on first
|
|
424
460
|
search — this is what the required `eval` gate floors at recall@k ≥ 0.78).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.46
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -58,8 +58,8 @@ Cursor and Gemini CLI in a single pass.
|
|
|
58
58
|
|
|
59
59
|
```bash
|
|
60
60
|
pipx install boost-skill-cli
|
|
61
|
-
boost
|
|
62
|
-
boost search tdd #
|
|
61
|
+
boost quickstart # taps the 7 starter registries, loads prebuilt vectors
|
|
62
|
+
boost search tdd # keyword + semantic, fused
|
|
63
63
|
boost install tdd-workflow # → every agent, version-pinned, one lock file
|
|
64
64
|
```
|
|
65
65
|
|
|
@@ -172,14 +172,26 @@ ln -s ~/.boost-src/boost ~/bin/boost # anywhere on PATH works
|
|
|
172
172
|
itself on your first search, so there is nothing to set up.
|
|
173
173
|
|
|
174
174
|
BM25 matches words, which fails when your query shares no vocabulary with the
|
|
175
|
-
skill you want. Semantic search fixes that
|
|
176
|
-
|
|
175
|
+
skill you want. Semantic search fixes that and needs no API key — only the
|
|
176
|
+
extra:
|
|
177
177
|
|
|
178
178
|
```bash
|
|
179
179
|
pipx inject boost-skill-cli "boost-skill-cli[rag]" # pip install "boost-skill-cli[rag]" if you used pip
|
|
180
|
-
boost
|
|
180
|
+
boost quickstart # downloads prebuilt vectors
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
+
`boost quickstart` is the fast path: it taps the starter registries **pinned to
|
|
184
|
+
the commits the published vectors were built from**, then downloads and imports
|
|
185
|
+
those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
|
|
186
|
+
and importing the same rows takes 0.12 s, so the difference between the two is
|
|
187
|
+
the difference between semantic search being available and being reachable.
|
|
188
|
+
|
|
189
|
+
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
190
|
+
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
191
|
+
Every download is checked against the sha256 in the manifest and refused on a
|
|
192
|
+
mismatch, and shards for a registry that has moved since publication are
|
|
193
|
+
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
194
|
+
|
|
183
195
|
When both indexes exist boost fuses the rankings rather than choosing between
|
|
184
196
|
them. See [docs/semantic-search.md](docs/semantic-search.md) for the whole
|
|
185
197
|
setup, what it costs, and how to tell which engine is actually serving.
|
|
@@ -198,6 +210,11 @@ boost tap --catalog --category java # Spring Boot / Kotlin / JVM packs
|
|
|
198
210
|
boost tap --catalog --category security # filter by category
|
|
199
211
|
```
|
|
200
212
|
|
|
213
|
+
Taps clone in parallel — eight at once by default, `--jobs N` (or
|
|
214
|
+
`BOOST_TAP_JOBS`) to change it, capped at 16 because it is someone else's
|
|
215
|
+
server. A clone is network latency rather than bandwidth, so the whole catalog
|
|
216
|
+
measures **2 min 10 s for 463 registries** where one-at-a-time took 13 minutes.
|
|
217
|
+
|
|
201
218
|
Every `est_items` is measured from the repository's file tree rather than
|
|
202
219
|
estimated, so `--limit` ranks by real size. Items are counted once however many
|
|
203
220
|
agents a repository renders them for, so a pack shipping a copy in `.claude/`,
|
|
@@ -362,7 +379,7 @@ at least 95% alike, fold into one badged `×5`, with `^D` to show them again.
|
|
|
362
379
|
Identity is the description and never the name: `code-reviewer` appears 75 times
|
|
363
380
|
with 42 different descriptions, and those are 42 real skills.
|
|
364
381
|
|
|
365
|
-
##
|
|
382
|
+
## 81 commands, organized into 8 groups
|
|
366
383
|
|
|
367
384
|
`boost --help` prints the full grouped list. For every flag of every command see
|
|
368
385
|
[`docs/commands.html`](docs/commands.html); for a visual tour,
|
|
@@ -16,8 +16,8 @@ Cursor and Gemini CLI in a single pass.
|
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
pipx install boost-skill-cli
|
|
19
|
-
boost
|
|
20
|
-
boost search tdd #
|
|
19
|
+
boost quickstart # taps the 7 starter registries, loads prebuilt vectors
|
|
20
|
+
boost search tdd # keyword + semantic, fused
|
|
21
21
|
boost install tdd-workflow # → every agent, version-pinned, one lock file
|
|
22
22
|
```
|
|
23
23
|
|
|
@@ -130,14 +130,26 @@ ln -s ~/.boost-src/boost ~/bin/boost # anywhere on PATH works
|
|
|
130
130
|
itself on your first search, so there is nothing to set up.
|
|
131
131
|
|
|
132
132
|
BM25 matches words, which fails when your query shares no vocabulary with the
|
|
133
|
-
skill you want. Semantic search fixes that
|
|
134
|
-
|
|
133
|
+
skill you want. Semantic search fixes that and needs no API key — only the
|
|
134
|
+
extra:
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
137
|
pipx inject boost-skill-cli "boost-skill-cli[rag]" # pip install "boost-skill-cli[rag]" if you used pip
|
|
138
|
-
boost
|
|
138
|
+
boost quickstart # downloads prebuilt vectors
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
+
`boost quickstart` is the fast path: it taps the starter registries **pinned to
|
|
142
|
+
the commits the published vectors were built from**, then downloads and imports
|
|
143
|
+
those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
|
|
144
|
+
and importing the same rows takes 0.12 s, so the difference between the two is
|
|
145
|
+
the difference between semantic search being available and being reachable.
|
|
146
|
+
|
|
147
|
+
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
148
|
+
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
149
|
+
Every download is checked against the sha256 in the manifest and refused on a
|
|
150
|
+
mismatch, and shards for a registry that has moved since publication are
|
|
151
|
+
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
152
|
+
|
|
141
153
|
When both indexes exist boost fuses the rankings rather than choosing between
|
|
142
154
|
them. See [docs/semantic-search.md](docs/semantic-search.md) for the whole
|
|
143
155
|
setup, what it costs, and how to tell which engine is actually serving.
|
|
@@ -156,6 +168,11 @@ boost tap --catalog --category java # Spring Boot / Kotlin / JVM packs
|
|
|
156
168
|
boost tap --catalog --category security # filter by category
|
|
157
169
|
```
|
|
158
170
|
|
|
171
|
+
Taps clone in parallel — eight at once by default, `--jobs N` (or
|
|
172
|
+
`BOOST_TAP_JOBS`) to change it, capped at 16 because it is someone else's
|
|
173
|
+
server. A clone is network latency rather than bandwidth, so the whole catalog
|
|
174
|
+
measures **2 min 10 s for 463 registries** where one-at-a-time took 13 minutes.
|
|
175
|
+
|
|
159
176
|
Every `est_items` is measured from the repository's file tree rather than
|
|
160
177
|
estimated, so `--limit` ranks by real size. Items are counted once however many
|
|
161
178
|
agents a repository renders them for, so a pack shipping a copy in `.claude/`,
|
|
@@ -320,7 +337,7 @@ at least 95% alike, fold into one badged `×5`, with `^D` to show them again.
|
|
|
320
337
|
Identity is the description and never the name: `code-reviewer` appears 75 times
|
|
321
338
|
with 42 different descriptions, and those are 42 real skills.
|
|
322
339
|
|
|
323
|
-
##
|
|
340
|
+
## 81 commands, organized into 8 groups
|
|
324
341
|
|
|
325
342
|
`boost --help` prints the full grouped list. For every flag of every command see
|
|
326
343
|
[`docs/commands.html`](docs/commands.html); for a visual tour,
|
|
@@ -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.46'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 46)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Copyright the boost contributors.
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
"""boost CLI dispatcher —
|
|
3
|
+
"""boost CLI dispatcher — 81 commands across 8 groups.
|
|
4
4
|
|
|
5
5
|
Each command lives in boost_cli/commands/<module>.py as
|
|
6
6
|
def cmd_<name_with_underscores>(argv: list[str]) -> int
|
|
@@ -117,6 +117,7 @@ COMMANDS = [
|
|
|
117
117
|
("health", "chk", "quality", "Dashboard of skill-environment health"),
|
|
118
118
|
("trust", "chk", "quality", "Manage signing keys & verify tap provenance"),
|
|
119
119
|
# Configuration (13)
|
|
120
|
+
("quickstart", "cfg", "quickstart", "Tap the starter registries and load prebuilt vectors"),
|
|
120
121
|
("config", "cfg", "configuration", "Display or modify boost configuration"),
|
|
121
122
|
("clean", "cfg", "configuration", "Clear stale caches & broken symlinks"),
|
|
122
123
|
("compact", "cfg", "configuration", "Shrink tap clones to the files boost indexes"),
|
|
@@ -270,6 +270,59 @@ def _shard_io(args) -> int:
|
|
|
270
270
|
return 0
|
|
271
271
|
|
|
272
272
|
|
|
273
|
+
def _fetch_shards(args) -> int:
|
|
274
|
+
"""`--fetch-shards`: the published half of the keyless tier, on demand.
|
|
275
|
+
|
|
276
|
+
Separate from `boost quickstart` because the two answer different
|
|
277
|
+
questions. Quickstart sets a machine up; this refreshes vectors on one that
|
|
278
|
+
is already tapped, including taps quickstart never touches.
|
|
279
|
+
"""
|
|
280
|
+
from ..core import dense, shards
|
|
281
|
+
if not registry.list_taps():
|
|
282
|
+
raise BoostError("no taps configured — nothing to fetch",
|
|
283
|
+
hint="`boost quickstart` taps the defaults and fetches "
|
|
284
|
+
"their vectors in one pass")
|
|
285
|
+
manifest = shards.fetch_manifest()
|
|
286
|
+
why = shards.incompatible(manifest)
|
|
287
|
+
if why:
|
|
288
|
+
raise BoostError("published shards cannot serve this machine — %s" % why,
|
|
289
|
+
hint=dense.fix_hint(dense.status().get("reason", "")))
|
|
290
|
+
commits = rag._tap_commits()
|
|
291
|
+
by_name = {t.name: commits.get(t.safe_name, "") for t in registry.list_taps()}
|
|
292
|
+
results = shards.sync(list(by_name), by_name, manifest=manifest,
|
|
293
|
+
on_event=_shard_event)
|
|
294
|
+
if args.as_json:
|
|
295
|
+
print(json.dumps({"shards": results}, indent=2))
|
|
296
|
+
return 0
|
|
297
|
+
got = [r for r in results if r["status"] == "imported"]
|
|
298
|
+
total = sum(int(r.get("chunks") or 0) for r in got)
|
|
299
|
+
if got:
|
|
300
|
+
out.ok("imported %d shard(s), %s chunks — no embedding needed"
|
|
301
|
+
% (len(got), format(total, ",")))
|
|
302
|
+
else:
|
|
303
|
+
# Not a success line. Nothing landed, and saying "imported 0" with a
|
|
304
|
+
# tick reads as a job well done to the one user who most needs to know
|
|
305
|
+
# their vectors are still missing.
|
|
306
|
+
out.warn("no published vectors matched your taps")
|
|
307
|
+
missing = [r["tap"] for r in results if r["status"] != "imported"]
|
|
308
|
+
if missing:
|
|
309
|
+
out.info(out.role("%d tap(s) without usable vectors: %s"
|
|
310
|
+
% (len(missing), ", ".join(missing[:5])
|
|
311
|
+
+ (" …" if len(missing) > 5 else "")), "muted"))
|
|
312
|
+
out.info("embed those locally with `boost reindex --dense`")
|
|
313
|
+
return 0
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def _shard_event(tap: str, status: str, detail: str) -> None:
|
|
317
|
+
"""Progress for one shard, quiet enough to run over forty taps."""
|
|
318
|
+
if status == "downloading":
|
|
319
|
+
out.info(out.role("fetching %s %s" % (tap, detail), "muted"))
|
|
320
|
+
elif status in ("failed", "refused"):
|
|
321
|
+
out.info(out.role("%s: %s%s" % (tap, status,
|
|
322
|
+
" (%s)" % detail if detail else ""),
|
|
323
|
+
"muted"))
|
|
324
|
+
|
|
325
|
+
|
|
273
326
|
def cmd_reindex(argv):
|
|
274
327
|
"""Build/refresh the full-content (RAG) search index over tapped items."""
|
|
275
328
|
p = cliparse.parser(
|
|
@@ -287,11 +340,16 @@ def cmd_reindex(argv):
|
|
|
287
340
|
help="merge a prebuilt vector shard, skipping the embed "
|
|
288
341
|
"cost; refused unless it matches this store's backend "
|
|
289
342
|
"and the tap's current commit")
|
|
343
|
+
p.add_argument("--fetch-shards", action="store_true",
|
|
344
|
+
help="download and import published vectors for every tap "
|
|
345
|
+
"that has them, instead of embedding locally")
|
|
290
346
|
p.add_argument("--json", action="store_true", dest="as_json",
|
|
291
347
|
help="machine-readable output")
|
|
292
348
|
args = p.parse_args(argv)
|
|
293
349
|
if args.export_shard or args.import_shard:
|
|
294
350
|
return _shard_io(args)
|
|
351
|
+
if args.fetch_shards:
|
|
352
|
+
return _fetch_shards(args)
|
|
295
353
|
if not registry.list_taps():
|
|
296
354
|
raise BoostError("no taps configured — nothing to index",
|
|
297
355
|
hint="add the recommended registries with `boost tap --defaults`")
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Copyright the boost contributors.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
"""`boost quickstart` — one command from empty machine to working search.
|
|
4
|
+
|
|
5
|
+
WHY A COMMAND AND NOT A DOC. The setup a new user needs is four steps that each
|
|
6
|
+
fail quietly when skipped: tap something, build the BM25 index, install the
|
|
7
|
+
`rag` extra, and embed the catalogue. The last one is the wall — ~1.2 s/chunk on
|
|
8
|
+
CPU, hours for a corpus worth searching — and it is why the keyless semantic
|
|
9
|
+
tier was reachable in principle and not in practice. Published shards remove it,
|
|
10
|
+
but only if the tap sits at the commit its vectors were built from, so tapping
|
|
11
|
+
and fetching cannot be two commands a user is trusted to order correctly.
|
|
12
|
+
|
|
13
|
+
WHAT IT WILL NOT DO. It never embeds as a side effect. A user who runs a
|
|
14
|
+
"quickstart" and gets an unannounced multi-hour CPU job has been ambushed; the
|
|
15
|
+
taps without a published shard are named, with the one command that would embed
|
|
16
|
+
them, and left alone.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from .. import cliparse, spin
|
|
21
|
+
from ..core import (
|
|
22
|
+
catalog,
|
|
23
|
+
complete,
|
|
24
|
+
config,
|
|
25
|
+
dense,
|
|
26
|
+
journal,
|
|
27
|
+
rag,
|
|
28
|
+
registry,
|
|
29
|
+
shards,
|
|
30
|
+
)
|
|
31
|
+
from ..core import output as out
|
|
32
|
+
from ..errors import BoostError
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _tap_defaults(pins: dict[str, dict], dry_run: bool) -> list[str]:
|
|
36
|
+
"""Tap the default registries, pinned to a shard's commit when one exists.
|
|
37
|
+
|
|
38
|
+
Returns the tap names that are configured afterwards, tapped here or not.
|
|
39
|
+
Pinning is the whole point: tapping HEAD and then fetching a shard is the
|
|
40
|
+
ordering that produces a commit mismatch on every registry that moved since
|
|
41
|
+
the last shard run.
|
|
42
|
+
"""
|
|
43
|
+
names = [str(d["name"]) for d in config.DEFAULT_TAPS]
|
|
44
|
+
commits = {name: str(pins[name].get("commit")) for name in names
|
|
45
|
+
if name in pins}
|
|
46
|
+
if dry_run:
|
|
47
|
+
existing = {t.name for t in registry.list_taps()}
|
|
48
|
+
for name in names:
|
|
49
|
+
if name in existing:
|
|
50
|
+
out.info(out.role("%s already tapped" % name, "muted"))
|
|
51
|
+
continue
|
|
52
|
+
at = commits.get(name)
|
|
53
|
+
out.info("would tap %s%s" % (name, " @ %s" % at[:7] if at else ""))
|
|
54
|
+
return names
|
|
55
|
+
# One pool, one config write: seven sequential clones is ~11 s of waiting
|
|
56
|
+
# for work that takes ~2 s done together, and the first thing a new user
|
|
57
|
+
# sees should not be a progress bar.
|
|
58
|
+
with spin.Spinner("tapping %d registries" % len(names)):
|
|
59
|
+
results = registry.add_many([str(d["url"]) for d in config.DEFAULT_TAPS],
|
|
60
|
+
curated=True, pins=commits)
|
|
61
|
+
for res in results:
|
|
62
|
+
name = res["name"]
|
|
63
|
+
if res.get("skipped"):
|
|
64
|
+
out.info(out.role("%s already tapped" % name, "muted"))
|
|
65
|
+
continue
|
|
66
|
+
if not res.get("ok"):
|
|
67
|
+
out.warn("could not tap %s: %s" % (name, res.get("error", "")))
|
|
68
|
+
continue
|
|
69
|
+
try:
|
|
70
|
+
entries = catalog.rebuild_tap(res["tap"])
|
|
71
|
+
except BoostError as exc:
|
|
72
|
+
out.warn("could not index %s: %s" % (name, exc.message))
|
|
73
|
+
continue
|
|
74
|
+
journal.log("tap", name)
|
|
75
|
+
at = commits.get(name)
|
|
76
|
+
out.ok("tapped %s (%d items)%s"
|
|
77
|
+
% (name, len(entries), " @ %s" % at[:7] if at else ""))
|
|
78
|
+
return names
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _report(results: list[dict]) -> None:
|
|
82
|
+
"""Say what each shard did, and name the remedy for what it did not do."""
|
|
83
|
+
imported = [r for r in results if r["status"] == "imported"]
|
|
84
|
+
if imported:
|
|
85
|
+
total = sum(int(r.get("chunks") or 0) for r in imported)
|
|
86
|
+
out.ok("imported %d prebuilt shard%s (%s chunks) — no embedding needed"
|
|
87
|
+
% (len(imported), "" if len(imported) == 1 else "s",
|
|
88
|
+
format(total, ",")))
|
|
89
|
+
for kind, label in (("unpublished", "no published shard"),
|
|
90
|
+
("refused", "shard refused"),
|
|
91
|
+
("failed", "shard failed")):
|
|
92
|
+
rows = [r for r in results if r["status"] == kind]
|
|
93
|
+
if not rows:
|
|
94
|
+
continue
|
|
95
|
+
for r in rows:
|
|
96
|
+
detail = r.get("detail") or ""
|
|
97
|
+
out.info(out.role("%s: %s%s" % (r["tap"], label,
|
|
98
|
+
" (%s)" % detail if detail else ""),
|
|
99
|
+
"muted"))
|
|
100
|
+
left = [r["tap"] for r in results if r["status"] != "imported"]
|
|
101
|
+
if left:
|
|
102
|
+
out.info("embed the rest locally when you want to: "
|
|
103
|
+
"`boost reindex --dense`")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def cmd_quickstart(argv) -> int:
|
|
107
|
+
"""boost quickstart [--no-vectors] [--dry-run]"""
|
|
108
|
+
p = cliparse.parser(
|
|
109
|
+
prog="boost quickstart",
|
|
110
|
+
description="Tap the starter registries and load prebuilt vectors")
|
|
111
|
+
p.add_argument("--no-vectors", action="store_true",
|
|
112
|
+
help="set up taps and keyword search only, skip shards")
|
|
113
|
+
p.add_argument("--dry-run", action="store_true",
|
|
114
|
+
help="print what would happen, change nothing")
|
|
115
|
+
args = p.parse_args(argv)
|
|
116
|
+
|
|
117
|
+
manifest = None
|
|
118
|
+
pins: dict[str, dict] = {}
|
|
119
|
+
want_vectors = not args.no_vectors and dense.have_backend()
|
|
120
|
+
if want_vectors:
|
|
121
|
+
# Fetched first because it decides how the taps are pinned. A failure
|
|
122
|
+
# here is not fatal: keyword search is the documented default and works
|
|
123
|
+
# without a single vector.
|
|
124
|
+
try:
|
|
125
|
+
with spin.Spinner("reading the shard manifest"):
|
|
126
|
+
manifest = shards.fetch_manifest()
|
|
127
|
+
pins = shards.rows(manifest)
|
|
128
|
+
except BoostError as exc:
|
|
129
|
+
out.warn("no published shards: %s" % exc.message)
|
|
130
|
+
manifest = None
|
|
131
|
+
|
|
132
|
+
names = _tap_defaults(pins, args.dry_run)
|
|
133
|
+
if args.dry_run:
|
|
134
|
+
planned = [n for n in names if n in pins] if manifest else []
|
|
135
|
+
out.info("would build the keyword index, then import %d shard(s)"
|
|
136
|
+
% len(planned))
|
|
137
|
+
return 0
|
|
138
|
+
|
|
139
|
+
with spin.Spinner("building the keyword index"):
|
|
140
|
+
stats = rag.build()
|
|
141
|
+
out.ok("indexed %s items for keyword search" % format(
|
|
142
|
+
int(stats.get("entries", 0)), ","))
|
|
143
|
+
|
|
144
|
+
if manifest is not None:
|
|
145
|
+
commits = rag._tap_commits()
|
|
146
|
+
# `_tap_commits` is keyed by safe name; `sync` speaks tap names.
|
|
147
|
+
by_name = {t.name: commits.get(t.safe_name, "")
|
|
148
|
+
for t in registry.list_taps()}
|
|
149
|
+
results = shards.sync([n for n in names if n in by_name], by_name,
|
|
150
|
+
manifest=manifest)
|
|
151
|
+
_report(results)
|
|
152
|
+
elif args.no_vectors:
|
|
153
|
+
out.info(out.role("skipped vectors as asked", "muted"))
|
|
154
|
+
elif not dense.have_backend():
|
|
155
|
+
out.info("semantic search needs the extra: "
|
|
156
|
+
"`pipx inject boost-skill-cli \"boost-skill-cli[rag]\"`, "
|
|
157
|
+
"then `boost quickstart` again")
|
|
158
|
+
|
|
159
|
+
complete.refresh_names()
|
|
160
|
+
out.ok("ready — try `boost search brainstorming`")
|
|
161
|
+
return 0
|
|
@@ -44,22 +44,44 @@ def _tap_catalog(args) -> int:
|
|
|
44
44
|
out.dim("%d registries · ~%d items (dry run — nothing tapped)"
|
|
45
45
|
% (len(selection), sum(e.get("est_items") or 0 for e in selection)))
|
|
46
46
|
return 0
|
|
47
|
-
|
|
47
|
+
focus = {str(e["name"]): e.get("focus", "") for e in selection}
|
|
48
|
+
return _tap_all([str(e["url"]) for e in selection], jobs=args.jobs,
|
|
49
|
+
focus=focus)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _tap_all(urls: list[str], jobs: int | None,
|
|
53
|
+
focus: dict[str, str] | None = None,
|
|
54
|
+
pins: dict[str, str] | None = None) -> int:
|
|
55
|
+
"""Clone many registries at once, then scan each one that arrived.
|
|
56
|
+
|
|
57
|
+
The split is the whole optimisation. Cloning is network latency — 1.6 s per
|
|
58
|
+
registry whether one runs or twelve — so it goes wide; scanning is 3 ms per
|
|
59
|
+
registry and writes a per-tap cache file, so it stays on this thread where
|
|
60
|
+
its output can be printed in order and its errors belong to one tap.
|
|
61
|
+
"""
|
|
62
|
+
focus = focus or {}
|
|
63
|
+
results = registry.add_many(urls, curated=True, pins=pins, jobs=jobs)
|
|
48
64
|
rc = 0
|
|
49
|
-
for
|
|
50
|
-
|
|
51
|
-
|
|
65
|
+
for res in results:
|
|
66
|
+
name = res["name"]
|
|
67
|
+
if res.get("skipped"):
|
|
68
|
+
out.info(out.role("%s already tapped" % name, "muted"))
|
|
69
|
+
continue
|
|
70
|
+
if not res.get("ok"):
|
|
71
|
+
out.warn("could not tap %s: %s" % (name, res.get("error", "")))
|
|
72
|
+
rc = 1
|
|
52
73
|
continue
|
|
74
|
+
tap = res["tap"]
|
|
53
75
|
try:
|
|
54
|
-
tap = registry.add(str(e["url"]), curated=True)
|
|
55
76
|
entries = catalog.rebuild_tap(tap)
|
|
56
77
|
except BoostError as err:
|
|
57
|
-
out.warn("could not
|
|
78
|
+
out.warn("could not index %s: %s" % (name, err.message))
|
|
58
79
|
rc = 1
|
|
59
80
|
continue
|
|
60
81
|
journal.log("tap", tap.name)
|
|
61
|
-
|
|
62
|
-
|
|
82
|
+
note = focus.get(name) or ""
|
|
83
|
+
out.ok("tapped %s (%d items)%s"
|
|
84
|
+
% (tap.name, len(entries), " — %s" % note if note else ""))
|
|
63
85
|
return rc
|
|
64
86
|
|
|
65
87
|
|
|
@@ -101,7 +123,16 @@ def cmd_tap(argv) -> int:
|
|
|
101
123
|
help="with --catalog: print what would be tapped, tap nothing")
|
|
102
124
|
p.add_argument("--curated", action="store_true",
|
|
103
125
|
help="mark the tap as curated (★ in listings)")
|
|
126
|
+
p.add_argument("--at", metavar="SHA",
|
|
127
|
+
help="pin the clone to one 40-character commit, as a "
|
|
128
|
+
"published vector shard requires")
|
|
129
|
+
p.add_argument("--jobs", type=int, metavar="N",
|
|
130
|
+
help="clone this many registries at once (default %d, max "
|
|
131
|
+
"%d)" % (registry.DEFAULT_TAP_JOBS,
|
|
132
|
+
registry.MAX_TAP_JOBS))
|
|
104
133
|
args = p.parse_args(argv)
|
|
134
|
+
if args.at and not args.spec:
|
|
135
|
+
p.error("--at pins one registry, so it needs a SPEC")
|
|
105
136
|
if not args.spec and not args.defaults and not args.catalog:
|
|
106
137
|
p.error("provide a SPEC, --defaults, or --catalog")
|
|
107
138
|
|
|
@@ -109,30 +140,20 @@ def cmd_tap(argv) -> int:
|
|
|
109
140
|
if args.catalog:
|
|
110
141
|
rc |= _tap_catalog(args)
|
|
111
142
|
if args.defaults:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
entries = catalog.rebuild_tap(tap)
|
|
120
|
-
except BoostError as e:
|
|
121
|
-
out.warn("could not tap %s: %s" % (default["name"], e.message))
|
|
122
|
-
rc = 1
|
|
123
|
-
continue
|
|
124
|
-
journal.log("tap", tap.name)
|
|
125
|
-
# "items", not "skills": the defaults now carry rules and
|
|
126
|
-
# workflows, so a pure rules registry reported "257 skills"
|
|
127
|
-
# immediately after the README promised three kinds.
|
|
128
|
-
out.ok("tapped %s (%d items) — %s"
|
|
129
|
-
% (tap.name, len(entries), default.get("focus", "")))
|
|
143
|
+
# "items", not "skills": the defaults now carry rules and workflows, so
|
|
144
|
+
# a pure rules registry reported "257 skills" immediately after the
|
|
145
|
+
# README promised three kinds. `_tap_all` says items.
|
|
146
|
+
rc |= _tap_all([str(d["url"]) for d in config.DEFAULT_TAPS],
|
|
147
|
+
jobs=args.jobs,
|
|
148
|
+
focus={str(d["name"]): str(d.get("focus", ""))
|
|
149
|
+
for d in config.DEFAULT_TAPS})
|
|
130
150
|
if args.spec:
|
|
131
151
|
with spin.Spinner("cloning %s" % args.spec):
|
|
132
|
-
tap = registry.add(args.spec, curated=args.curated)
|
|
152
|
+
tap = registry.add(args.spec, curated=args.curated, at=args.at)
|
|
133
153
|
entries = catalog.rebuild_tap(tap)
|
|
134
154
|
journal.log("tap", tap.name)
|
|
135
|
-
|
|
155
|
+
pin = " @ %s" % args.at[:7] if args.at else ""
|
|
156
|
+
out.ok("Tapped %s (%d items)%s" % (tap.name, len(entries), pin))
|
|
136
157
|
# Refresh the TAB-completion name cache so `boost install <TAB>` sees
|
|
137
158
|
# whatever this call just tapped instead of the pre-tap snapshot.
|
|
138
159
|
complete.refresh_names()
|
|
@@ -284,6 +284,44 @@ def head_commit(repo: Path) -> str:
|
|
|
284
284
|
return proc.stdout.strip() if proc.returncode == 0 else ""
|
|
285
285
|
|
|
286
286
|
|
|
287
|
+
def checkout_commit(repo: Path, sha: str) -> None:
|
|
288
|
+
"""Detach `repo` at `sha`, fetching that commit first if it is absent.
|
|
289
|
+
|
|
290
|
+
A tap is cloned `--depth 1`, so the commit a published shard was built from
|
|
291
|
+
is usually *not* in the clone: the fetch is the normal path, not the
|
|
292
|
+
fallback. GitHub serves a fetch by full SHA for a reachable commit, which
|
|
293
|
+
is what makes pinning possible without un-shallowing a repo that exists to
|
|
294
|
+
stay small.
|
|
295
|
+
|
|
296
|
+
The fetch keeps `--depth 1` and the blobless filter for the same reason the
|
|
297
|
+
clone does — pinning a tap must not cost the history and blobs the sparse
|
|
298
|
+
clone was built to avoid (458 taps held 12 GB before that work).
|
|
299
|
+
"""
|
|
300
|
+
if not _is_sha(sha):
|
|
301
|
+
raise BoostError("%r is not a full commit SHA" % sha,
|
|
302
|
+
hint="pin with the 40-character hash a manifest names")
|
|
303
|
+
have = run(["-C", str(repo), "cat-file", "-e", sha + "^{commit}"],
|
|
304
|
+
check=False)
|
|
305
|
+
if have.returncode != 0:
|
|
306
|
+
run(["-C", str(repo), "fetch", "--quiet", "--depth", "1",
|
|
307
|
+
"--filter=blob:none", "origin", sha])
|
|
308
|
+
run(["-C", str(repo), "checkout", "--quiet", "--detach", sha])
|
|
309
|
+
# A detached checkout leaves the sparse cone as it was, but re-applying is
|
|
310
|
+
# cheap and keeps a pinned clone byte-identical to a freshly cloned one.
|
|
311
|
+
run(["-C", str(repo), "sparse-checkout", "reapply"], check=False)
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def _is_sha(value: str) -> bool:
|
|
315
|
+
"""True for a full 40-character hex commit hash.
|
|
316
|
+
|
|
317
|
+
Deliberately strict. An abbreviated hash is ambiguous across a fetch, and a
|
|
318
|
+
branch or tag name is not a pin at all — both would silently give a
|
|
319
|
+
different tree than the shard was built against, which `import_shard` would
|
|
320
|
+
then refuse with a confusing commit mismatch.
|
|
321
|
+
"""
|
|
322
|
+
return len(value) == 40 and all(c in "0123456789abcdef" for c in value.lower())
|
|
323
|
+
|
|
324
|
+
|
|
287
325
|
def remote_url(repo: Path) -> str:
|
|
288
326
|
"""Return the URL of `repo`'s `origin` remote, or "" if it has none."""
|
|
289
327
|
proc = run(["-C", str(repo), "remote", "get-url", "origin"], check=False)
|