boost-skill-cli 1.2.47__tar.gz → 1.2.49__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.47 → boost_skill_cli-1.2.49}/CLAUDE.md +37 -1
- {boost_skill_cli-1.2.47/boost_skill_cli.egg-info → boost_skill_cli-1.2.49}/PKG-INFO +14 -1
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/README.md +13 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/__init__.py +9 -1
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/discovery.py +26 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/pkg.py +54 -2
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/quickstart.py +34 -6
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/taps.py +8 -2
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/paths.py +10 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/registry.py +96 -6
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49/boost_skill_cli.egg-info}/PKG-INFO +14 -1
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/commands.html +8 -6
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/semantic-search.md +7 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/pyproject.toml +15 -0
- boost_skill_cli-1.2.49/scripts/shard_plan.py +146 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_quickstart.py +32 -0
- boost_skill_cli-1.2.49/tests/functional/test_cli_tap_pins.py +204 -0
- boost_skill_cli-1.2.49/tests/unit/test_shard_plan.py +125 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_shards_matrix.py +33 -7
- boost_skill_cli-1.2.49/tests/unit/test_tap_pins.py +167 -0
- boost_skill_cli-1.2.49/tests/unit/test_version_tags.py +104 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.gitattributes +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.gitignore +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/.vale.ini +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/DCO +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/LICENSE +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/Makefile +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/codecov.yml +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/index.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/roadmap.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/README.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/examples/README.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/index.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/noxfile.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/setup.cfg +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/README.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/boost.css +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/boost.js +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/style/demo.html +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.47 → boost_skill_cli-1.2.49}/tests/visual/visual_check.mjs +0 -0
|
@@ -185,7 +185,16 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
|
|
|
185
185
|
`HOME`/`BOOST_HOME`; tests point them at a tempdir. In zsh, one-line chains
|
|
186
186
|
like `export A=$(...) B=$A/x` leave `B` broken — use separate `export`
|
|
187
187
|
statements.
|
|
188
|
-
- **Versioning is setuptools-scm from git tags.**
|
|
188
|
+
- **Versioning is setuptools-scm from git tags.** **Only `vX.Y.Z` tags count**, and
|
|
189
|
+
two settings say so: `git_describe_command`'s `--match v[0-9]*` decides which
|
|
190
|
+
tag is *found* and `tag_regex` decides how it is *parsed*. Both are load-
|
|
191
|
+
bearing since the repo gained a deliberate non-version tag — `shards-latest`,
|
|
192
|
+
the rolling release hosting the vector shards. At defaults, `git describe`
|
|
193
|
+
returned `shards-latest-1-g82c3e6a`, the build called itself
|
|
194
|
+
`vshards-latest-…`, and `boost self-update` then reported "already up to
|
|
195
|
+
date" against a newer PyPI release, because it compares version tuples and
|
|
196
|
+
that string parses as none. A silent wrong answer in the command whose job is
|
|
197
|
+
to detect being behind. There is no `__version__`
|
|
189
198
|
constant and `boost_cli/_version.py` is generated + gitignored. Don't hardcode
|
|
190
199
|
or assert exact versions; version tests are shape-only (`^boost \S+$`). The
|
|
191
200
|
publish workflow filename must stay `publish.yml` (PyPI Trusted Publisher
|
|
@@ -435,6 +444,33 @@ of the three item kinds (see Non-obvious rules above); `core/store.py` owns
|
|
|
435
444
|
install, uninstall and sync — copying into the canonical store, symlinking into
|
|
436
445
|
each agent's skills dir, and updating the lock file.
|
|
437
446
|
|
|
447
|
+
- **A tap pin lives in `config.json`, and `boost update` is what makes it real.**
|
|
448
|
+
`boost tap --at <sha>` used to check a commit out and record nothing, so the
|
|
449
|
+
next `boost update` reset the clone to the default branch — measured on a
|
|
450
|
+
two-commit fixture: tapped at `fb61736`, updated, `6206d22`. That silently
|
|
451
|
+
invalidates any shard imported for the old commit (stale vectors, still
|
|
452
|
+
present, no error), which is also the reason **search must never refresh taps
|
|
453
|
+
in the background**: `_hint_stale_taps` reads one mtime
|
|
454
|
+
(`paths.tap_refresh_marker`, stamped by `registry.update`) and prints one
|
|
455
|
+
line rather than fetching. `registry.update` skips a pinned tap; `--force`
|
|
456
|
+
moves it *and* drops the pin, because deciding to move a tap is deciding to
|
|
457
|
+
stop holding it still. After any tap actually moves, `pkg._resync_vectors`
|
|
458
|
+
asks the manifest whether a shard exists for the new commit — importing it
|
|
459
|
+
costs a download instead of an hour of CPU — and says plainly when one does
|
|
460
|
+
not.
|
|
461
|
+
|
|
462
|
+
- **The shard matrix is packed, not sliced, and 256 is a hard ceiling.**
|
|
463
|
+
GitHub runs at most 256 matrix jobs per workflow, so `shards.yml` cannot take
|
|
464
|
+
one job per registry once the scope is the 463-registry catalogue — the run
|
|
465
|
+
fails before a job starts. `scripts/shard_plan.py` bin-packs by the measured
|
|
466
|
+
`est_items` (longest-processing-time-first), which matters because cost is
|
|
467
|
+
uneven: the largest catalogued registry is 880 items against a median of 30,
|
|
468
|
+
so slicing puts several giants in one job while others idle, against a
|
|
469
|
+
6-hour per-job ceiling. Packing is deterministic on purpose — a rerun that
|
|
470
|
+
repacked differently would re-embed registries whose shards were already
|
|
471
|
+
published. A matrix entry is a **space-separated list**, split in Python
|
|
472
|
+
inside the job, never by shell word-splitting.
|
|
473
|
+
|
|
438
474
|
- **A published shard is only importable while three things match, and every
|
|
439
475
|
mismatch is silent if waved through.** `core/shards.py` fetches
|
|
440
476
|
`manifest.json` from a rolling `shards-latest` **prerelease** on this repo —
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.49
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -186,8 +186,21 @@ those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
|
|
|
186
186
|
and importing the same rows takes 0.12 s, so the difference between the two is
|
|
187
187
|
the difference between semantic search being available and being reachable.
|
|
188
188
|
|
|
189
|
+
Want everything? `boost quickstart --catalog` taps all 463 catalogued
|
|
190
|
+
registries — 2 min 10 s now that clones run in parallel — and fetches vectors
|
|
191
|
+
for every one that has a published shard.
|
|
192
|
+
|
|
189
193
|
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
190
194
|
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
195
|
+
|
|
196
|
+
Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
|
|
197
|
+
it fetches vectors for, and `boost update` skips a pinned tap rather than moving
|
|
198
|
+
it out from under them (`--force` moves it anyway and drops the pin). When a tap
|
|
199
|
+
does move, boost checks whether a newer shard exists for the new commit and
|
|
200
|
+
imports it; if none does, it says so instead of leaving stale vectors looking
|
|
201
|
+
fresh. `boost search` never refreshes taps behind your back — it prints one line
|
|
202
|
+
when they are more than two weeks old and leaves the fetching to
|
|
203
|
+
`boost update --taps-only`.
|
|
191
204
|
Every download is checked against the sha256 in the manifest and refused on a
|
|
192
205
|
mismatch, and shards for a registry that has moved since publication are
|
|
193
206
|
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
@@ -144,8 +144,21 @@ those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
|
|
|
144
144
|
and importing the same rows takes 0.12 s, so the difference between the two is
|
|
145
145
|
the difference between semantic search being available and being reachable.
|
|
146
146
|
|
|
147
|
+
Want everything? `boost quickstart --catalog` taps all 463 catalogued
|
|
148
|
+
registries — 2 min 10 s now that clones run in parallel — and fetches vectors
|
|
149
|
+
for every one that has a published shard.
|
|
150
|
+
|
|
147
151
|
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
148
152
|
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
153
|
+
|
|
154
|
+
Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
|
|
155
|
+
it fetches vectors for, and `boost update` skips a pinned tap rather than moving
|
|
156
|
+
it out from under them (`--force` moves it anyway and drops the pin). When a tap
|
|
157
|
+
does move, boost checks whether a newer shard exists for the new commit and
|
|
158
|
+
imports it; if none does, it says so instead of leaving stale vectors looking
|
|
159
|
+
fresh. `boost search` never refreshes taps behind your back — it prints one line
|
|
160
|
+
when they are more than two weeks old and leaves the fetching to
|
|
161
|
+
`boost update --taps-only`.
|
|
149
162
|
Every download is checked against the sha256 in the manifest and refused on a
|
|
150
163
|
mismatch, and shards for a registry that has moved since publication are
|
|
151
164
|
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
@@ -21,8 +21,16 @@ def _detect_version() -> str:
|
|
|
21
21
|
import subprocess
|
|
22
22
|
from pathlib import Path
|
|
23
23
|
root = Path(__file__).resolve().parent.parent
|
|
24
|
+
# `--match v[0-9]*`, exactly as pyproject's git_describe_command:
|
|
25
|
+
# the repo carries a deliberate non-version tag (`shards-latest`, the
|
|
26
|
+
# rolling release hosting the vector shards), and without the match
|
|
27
|
+
# this fallback served `shards-latest-3-g…` as the version — which
|
|
28
|
+
# parses as no version at all, so `self-update` compared nothing and
|
|
29
|
+
# answered "already up to date" while a newer release existed.
|
|
30
|
+
# `--always` still yields a bare SHA when no version tag is reachable.
|
|
24
31
|
proc = subprocess.run(
|
|
25
|
-
["git", "-C", str(root), "describe", "--tags", "--always",
|
|
32
|
+
["git", "-C", str(root), "describe", "--tags", "--always",
|
|
33
|
+
"--dirty", "--match", "v[0-9]*"],
|
|
26
34
|
capture_output=True, text=True, timeout=3)
|
|
27
35
|
described = proc.stdout.strip()
|
|
28
36
|
if proc.returncode == 0 and described:
|
|
@@ -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.49'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 49)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -141,6 +141,9 @@ def cmd_search(argv):
|
|
|
141
141
|
"no matches for %r" % query,
|
|
142
142
|
"try `boost discover %s` to search all of GitHub" % query))
|
|
143
143
|
_hint_semantic_search(engine)
|
|
144
|
+
# Especially here: "no matches" is exactly the answer an out-of-date
|
|
145
|
+
# tap set produces, and the user has no other way to suspect it.
|
|
146
|
+
_hint_stale_taps()
|
|
144
147
|
return 0
|
|
145
148
|
# The CLI's long-standing wording for the BM25 engine differs from the label
|
|
146
149
|
# rag/eval use ("BM25 full-content"), and both are load-bearing: the latter
|
|
@@ -180,6 +183,7 @@ def cmd_search(argv):
|
|
|
180
183
|
if use_rag:
|
|
181
184
|
_note_stem_expansions(query)
|
|
182
185
|
_hint_semantic_search(engine)
|
|
186
|
+
_hint_stale_taps()
|
|
183
187
|
return 0
|
|
184
188
|
|
|
185
189
|
|
|
@@ -200,6 +204,28 @@ def _note_stem_expansions(query: str) -> None:
|
|
|
200
204
|
max(0, out.term_width() - 2)), "muted"))
|
|
201
205
|
|
|
202
206
|
|
|
207
|
+
def _hint_stale_taps() -> None:
|
|
208
|
+
"""Mention old tap clones. One `stat`, and never a network call.
|
|
209
|
+
|
|
210
|
+
Search deliberately does not refresh the taps themselves. A refresh is a
|
|
211
|
+
`git fetch` per tap — ~1.6 s each, minutes across a real install — so doing
|
|
212
|
+
it inline would turn a sub-second command into a wait, and doing it in the
|
|
213
|
+
background would mean unannounced network egress plus writes to the very
|
|
214
|
+
caches the search is reading. Worse, a tap's commit is load-bearing for
|
|
215
|
+
dense vectors, so a silent update would strand imported shards as stale.
|
|
216
|
+
|
|
217
|
+
So: say it, do not do it. The marker's mtime answers "how long ago" for the
|
|
218
|
+
price of one stat, and a machine that has never refreshed says nothing at
|
|
219
|
+
all rather than inventing an age.
|
|
220
|
+
"""
|
|
221
|
+
age = registry.refresh_age_days()
|
|
222
|
+
if age is None or age < registry.STALE_TAPS_DAYS:
|
|
223
|
+
return
|
|
224
|
+
out.info(out.role(
|
|
225
|
+
"taps last refreshed %d days ago — `boost update --taps-only`"
|
|
226
|
+
% int(age), "muted"))
|
|
227
|
+
|
|
228
|
+
|
|
203
229
|
def _hint_semantic_search(engine: str) -> None:
|
|
204
230
|
"""Say that a better engine exists, when BM25 answered alone.
|
|
205
231
|
|
|
@@ -31,6 +31,7 @@ from ..core import (
|
|
|
31
31
|
lockfile,
|
|
32
32
|
paths,
|
|
33
33
|
projectlock,
|
|
34
|
+
rag,
|
|
34
35
|
registry,
|
|
35
36
|
resolve,
|
|
36
37
|
scopes,
|
|
@@ -835,6 +836,48 @@ def _update_materialized(kind: str, installed: dict[str, dict], results) -> int:
|
|
|
835
836
|
return n
|
|
836
837
|
|
|
837
838
|
|
|
839
|
+
def _resync_vectors(moved: list[str]) -> None:
|
|
840
|
+
"""Keep prebuilt vectors honest after the taps underneath them move.
|
|
841
|
+
|
|
842
|
+
A tap's commit is load-bearing for dense search: `dense.build` marks a tap
|
|
843
|
+
"reused" per commit and `import_shard` refuses a shard built for another
|
|
844
|
+
one. So an update that moves a tap leaves its vectors stale *but present* —
|
|
845
|
+
the failure mode that looks like nothing at all, and the reason auto-
|
|
846
|
+
updating taps in the background would quietly undo a shard import.
|
|
847
|
+
|
|
848
|
+
Two outcomes are worth the network: a newer shard exists for the commit the
|
|
849
|
+
tap just moved to, in which case importing it costs a download instead of
|
|
850
|
+
an hour of CPU; or one does not, in which case the honest thing is to say
|
|
851
|
+
the vectors are now stale and name the command that rebuilds them.
|
|
852
|
+
"""
|
|
853
|
+
if not moved:
|
|
854
|
+
return
|
|
855
|
+
from ..core import dense, shards
|
|
856
|
+
if not dense.ready():
|
|
857
|
+
return # nothing embedded here to invalidate
|
|
858
|
+
try:
|
|
859
|
+
manifest = shards.fetch_manifest()
|
|
860
|
+
except BoostError:
|
|
861
|
+
# Offline, or no manifest published. The vectors are still stale, and
|
|
862
|
+
# saying so without the remedy we could not check for is enough.
|
|
863
|
+
out.info(out.role("prebuilt vectors for %d refreshed tap(s) are now "
|
|
864
|
+
"stale — `boost reindex --dense` rebuilds them"
|
|
865
|
+
% len(moved), "muted"))
|
|
866
|
+
return
|
|
867
|
+
commits = rag._tap_commits()
|
|
868
|
+
by_name = {t.name: commits.get(t.safe_name, "")
|
|
869
|
+
for t in registry.list_taps() if t.name in moved}
|
|
870
|
+
got = [r for r in shards.sync(list(by_name), by_name, manifest=manifest)
|
|
871
|
+
if r["status"] == "imported"]
|
|
872
|
+
if got:
|
|
873
|
+
out.ok("re-imported prebuilt vectors for %d tap(s)" % len(got))
|
|
874
|
+
left = len(moved) - len(got)
|
|
875
|
+
if left:
|
|
876
|
+
out.info(out.role("%d refreshed tap(s) have no matching shard yet — "
|
|
877
|
+
"their vectors are stale until "
|
|
878
|
+
"`boost reindex --dense`" % left, "muted"))
|
|
879
|
+
|
|
880
|
+
|
|
838
881
|
def cmd_update(argv: list[str]) -> int:
|
|
839
882
|
ap = cliparse.parser(prog="boost update",
|
|
840
883
|
description="Sync taps or update installed skills")
|
|
@@ -849,14 +892,23 @@ def cmd_update(argv: list[str]) -> int:
|
|
|
849
892
|
# sys.argv, so this makes the printed advice true rather than adding a path.
|
|
850
893
|
ap.add_argument("-y", "--yes", action="store_true",
|
|
851
894
|
help="skip the confirmation prompt")
|
|
895
|
+
ap.add_argument("--force", action="store_true",
|
|
896
|
+
help="move pinned taps too, clearing their pin")
|
|
852
897
|
args = ap.parse_args(argv)
|
|
853
|
-
results, failures = registry.update(args.tap or None)
|
|
898
|
+
results, failures = registry.update(args.tap or None, force=args.force)
|
|
854
899
|
if not results and not failures:
|
|
855
900
|
out.info("no taps configured — start with `boost tap --defaults`")
|
|
856
901
|
return 0
|
|
902
|
+
moved = []
|
|
857
903
|
for tname, summary in results.items():
|
|
858
|
-
|
|
904
|
+
if "skipped" not in summary:
|
|
905
|
+
catalog.rebuild_tap(registry.get(tname))
|
|
906
|
+
# "abc1234 → def5678" is a tap whose tree changed; "already up to date"
|
|
907
|
+
# and "pinned at ..." are not. Only the first invalidates vectors.
|
|
908
|
+
if "→" in summary:
|
|
909
|
+
moved.append(tname)
|
|
859
910
|
out.ok("%s: %s" % (tname, summary))
|
|
911
|
+
_resync_vectors(moved)
|
|
860
912
|
# Report the dead ones by name, after the successes, so a broken upstream
|
|
861
913
|
# reads as one line of bad news rather than as the whole command failing.
|
|
862
914
|
for tname, err in failures.items():
|
|
@@ -32,19 +32,43 @@ from ..core import output as out
|
|
|
32
32
|
from ..errors import BoostError
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
def
|
|
36
|
-
"""
|
|
35
|
+
def _selection(catalog_scope: bool) -> list[dict]:
|
|
36
|
+
"""The registries quickstart will tap: the seven defaults, or all of them.
|
|
37
|
+
|
|
38
|
+
`--catalog` exists because "search everything" is a real ask and the two
|
|
39
|
+
costs that used to make it unreasonable are gone: tapping 463 registries is
|
|
40
|
+
2 min 10 s now that clones run in parallel, and their vectors are a
|
|
41
|
+
download rather than an hour of CPU.
|
|
42
|
+
"""
|
|
43
|
+
if not catalog_scope:
|
|
44
|
+
return [d.copy() for d in config.DEFAULT_TAPS]
|
|
45
|
+
return [{"name": e["name"], "url": e["url"]}
|
|
46
|
+
for e in config.load_registry_catalog()
|
|
47
|
+
if not e.get("list_only") and e.get("name") and e.get("url")]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _tap_defaults(selection: list[dict], pins: dict[str, dict],
|
|
51
|
+
dry_run: bool) -> list[str]:
|
|
52
|
+
"""Tap the selected registries, pinned to a shard's commit when one exists.
|
|
37
53
|
|
|
38
54
|
Returns the tap names that are configured afterwards, tapped here or not.
|
|
39
55
|
Pinning is the whole point: tapping HEAD and then fetching a shard is the
|
|
40
56
|
ordering that produces a commit mismatch on every registry that moved since
|
|
41
57
|
the last shard run.
|
|
42
58
|
"""
|
|
43
|
-
names = [str(d["name"]) for d in
|
|
59
|
+
names = [str(d["name"]) for d in selection]
|
|
44
60
|
commits = {name: str(pins[name].get("commit")) for name in names
|
|
45
61
|
if name in pins}
|
|
46
62
|
if dry_run:
|
|
47
63
|
existing = {t.name for t in registry.list_taps()}
|
|
64
|
+
pending = [n for n in names if n not in existing]
|
|
65
|
+
# Over 463 registries a line each is a wall of text, so past a handful
|
|
66
|
+
# the dry run reports the shape instead of the list.
|
|
67
|
+
if len(pending) > 12:
|
|
68
|
+
out.info("would tap %d registries (%d pinned to a published "
|
|
69
|
+
"shard's commit)"
|
|
70
|
+
% (len(pending), sum(1 for n in pending if n in commits)))
|
|
71
|
+
return names
|
|
48
72
|
for name in names:
|
|
49
73
|
if name in existing:
|
|
50
74
|
out.info(out.role("%s already tapped" % name, "muted"))
|
|
@@ -56,7 +80,7 @@ def _tap_defaults(pins: dict[str, dict], dry_run: bool) -> list[str]:
|
|
|
56
80
|
# for work that takes ~2 s done together, and the first thing a new user
|
|
57
81
|
# sees should not be a progress bar.
|
|
58
82
|
with spin.Spinner("tapping %d registries" % len(names)):
|
|
59
|
-
results = registry.add_many([str(d["url"]) for d in
|
|
83
|
+
results = registry.add_many([str(d["url"]) for d in selection],
|
|
60
84
|
curated=True, pins=commits)
|
|
61
85
|
for res in results:
|
|
62
86
|
name = res["name"]
|
|
@@ -104,10 +128,13 @@ def _report(results: list[dict]) -> None:
|
|
|
104
128
|
|
|
105
129
|
|
|
106
130
|
def cmd_quickstart(argv) -> int:
|
|
107
|
-
"""boost quickstart [--no-vectors] [--dry-run]"""
|
|
131
|
+
"""boost quickstart [--catalog] [--no-vectors] [--dry-run]"""
|
|
108
132
|
p = cliparse.parser(
|
|
109
133
|
prog="boost quickstart",
|
|
110
134
|
description="Tap the starter registries and load prebuilt vectors")
|
|
135
|
+
p.add_argument("--catalog", action="store_true",
|
|
136
|
+
help="tap every catalogued registry, not just the 7 "
|
|
137
|
+
"starters, and fetch vectors for all of them")
|
|
111
138
|
p.add_argument("--no-vectors", action="store_true",
|
|
112
139
|
help="set up taps and keyword search only, skip shards")
|
|
113
140
|
p.add_argument("--dry-run", action="store_true",
|
|
@@ -129,7 +156,8 @@ def cmd_quickstart(argv) -> int:
|
|
|
129
156
|
out.warn("no published shards: %s" % exc.message)
|
|
130
157
|
manifest = None
|
|
131
158
|
|
|
132
|
-
|
|
159
|
+
selection = _selection(args.catalog)
|
|
160
|
+
names = _tap_defaults(selection, pins, args.dry_run)
|
|
133
161
|
if args.dry_run:
|
|
134
162
|
planned = [n for n in names if n in pins] if manifest else []
|
|
135
163
|
out.info("would build the keyword index, then import %d shard(s)"
|
|
@@ -226,7 +226,8 @@ def cmd_taps(argv) -> int:
|
|
|
226
226
|
skills = catalog.load_tap(tap)
|
|
227
227
|
total += len(skills)
|
|
228
228
|
taps.append({"name": tap.name, "url": tap.url, "curated": tap.curated,
|
|
229
|
-
"skills": len(skills), "updated": _tap_updated(tap)
|
|
229
|
+
"skills": len(skills), "updated": _tap_updated(tap),
|
|
230
|
+
"pin": tap.pin})
|
|
230
231
|
if args.json:
|
|
231
232
|
print(json.dumps(taps, indent=2))
|
|
232
233
|
return 0
|
|
@@ -234,7 +235,12 @@ def cmd_taps(argv) -> int:
|
|
|
234
235
|
out.info("no taps configured")
|
|
235
236
|
out.info(out.role("add the recommended registries with `boost tap --defaults`", "muted"))
|
|
236
237
|
return 0
|
|
237
|
-
|
|
238
|
+
# A pinned tap reads as its commit rather than its date: the date of a
|
|
239
|
+
# clone held still is not what the user needs to know about it, and a tap
|
|
240
|
+
# that `boost update` deliberately skips should say why on the line the
|
|
241
|
+
# user is already reading.
|
|
242
|
+
rows = [(t["name"], str(t["skills"]),
|
|
243
|
+
"@%s" % str(t["pin"])[:7] if t["pin"] else t["updated"],
|
|
238
244
|
"★" if t["curated"] else "", out.role(_tilde(t["url"]), "muted"))
|
|
239
245
|
for t in taps]
|
|
240
246
|
out.table(rows, headers=("NAME", "SKILLS", "UPDATED", "", "URL"))
|
|
@@ -103,6 +103,16 @@ def state_dir() -> Path:
|
|
|
103
103
|
return boost_home() / "state"
|
|
104
104
|
|
|
105
105
|
|
|
106
|
+
def tap_refresh_marker() -> Path:
|
|
107
|
+
"""File whose mtime records when the taps were last refreshed.
|
|
108
|
+
|
|
109
|
+
An mtime rather than a JSON field: the only question asked of it is "how
|
|
110
|
+
long ago", on the search path, where one `stat` is affordable and parsing
|
|
111
|
+
anything is not.
|
|
112
|
+
"""
|
|
113
|
+
return state_dir() / "last-tap-refresh"
|
|
114
|
+
|
|
115
|
+
|
|
106
116
|
def snapshots_dir() -> Path:
|
|
107
117
|
"""Return the directory for ``snap-*`` store snapshot tarballs."""
|
|
108
118
|
return state_dir() / "snapshots"
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
|
|
6
6
|
import difflib
|
|
7
7
|
import os
|
|
8
|
+
import time
|
|
8
9
|
from concurrent.futures import ThreadPoolExecutor
|
|
9
10
|
from contextlib import suppress
|
|
10
11
|
from dataclasses import dataclass
|
|
@@ -20,6 +21,12 @@ class Tap:
|
|
|
20
21
|
name: str # "anthropics/skills" or a short alias
|
|
21
22
|
url: str # https URL or local path
|
|
22
23
|
curated: bool = False
|
|
24
|
+
#: A 40-character commit this tap is held at, or "" for "track the default
|
|
25
|
+
#: branch". A pin is durable *because it is recorded here*: `tap --at`
|
|
26
|
+
#: checked a commit out and nothing remembered, so the next `boost update`
|
|
27
|
+
#: moved the clone to HEAD — silently invalidating any prebuilt vectors
|
|
28
|
+
#: imported for that commit, which is the whole reason the pin exists.
|
|
29
|
+
pin: str = ""
|
|
23
30
|
|
|
24
31
|
@property
|
|
25
32
|
def safe_name(self) -> str:
|
|
@@ -131,7 +138,8 @@ def list_taps() -> list[Tap]:
|
|
|
131
138
|
taps = config.get("taps", []) or []
|
|
132
139
|
if not isinstance(taps, list):
|
|
133
140
|
return []
|
|
134
|
-
return [Tap(name=t["name"], url=t.get("url", ""),
|
|
141
|
+
return [Tap(name=t["name"], url=t.get("url", ""),
|
|
142
|
+
curated=bool(t.get("curated")), pin=str(t.get("pin") or ""))
|
|
135
143
|
for t in taps if isinstance(t, dict) and t.get("name")]
|
|
136
144
|
|
|
137
145
|
|
|
@@ -203,9 +211,12 @@ def add(spec: str, curated: bool = False, at: str | None = None) -> Tap:
|
|
|
203
211
|
hint="add its key with `boost trust add <name> <key>`, "
|
|
204
212
|
"or relax `boost policy set require_signed_taps false`")
|
|
205
213
|
cfg = config.load()
|
|
206
|
-
|
|
207
|
-
|
|
214
|
+
row = {"name": name, "url": url, "curated": curated}
|
|
215
|
+
if at:
|
|
216
|
+
row["pin"] = at
|
|
217
|
+
cfg.setdefault("taps", []).append(row)
|
|
208
218
|
config.save(cfg)
|
|
219
|
+
tap.pin = at or ""
|
|
209
220
|
return tap
|
|
210
221
|
|
|
211
222
|
|
|
@@ -336,8 +347,12 @@ def add_many(specs: list[str], curated: bool = False,
|
|
|
336
347
|
cfg = config.load()
|
|
337
348
|
rows = cfg.setdefault("taps", [])
|
|
338
349
|
for r in fresh:
|
|
339
|
-
|
|
340
|
-
|
|
350
|
+
row = {"name": r["name"], "url": r["url"], "curated": curated}
|
|
351
|
+
pin = pins.get(r["name"])
|
|
352
|
+
if pin:
|
|
353
|
+
row["pin"] = pin
|
|
354
|
+
r["tap"].pin = pin
|
|
355
|
+
rows.append(row)
|
|
341
356
|
config.save(cfg)
|
|
342
357
|
# First occurrence, not last: a dict comprehension over `specs` keeps the
|
|
343
358
|
# LAST index for a repeated spec, which pushed the duplicate — and so its
|
|
@@ -352,6 +367,58 @@ def add_many(specs: list[str], curated: bool = False,
|
|
|
352
367
|
return results
|
|
353
368
|
|
|
354
369
|
|
|
370
|
+
#: How long a tap set may go unrefreshed before `boost search` mentions it.
|
|
371
|
+
#: Two weeks rather than days: registries move slowly, and a hint that fires
|
|
372
|
+
#: every other search is one users learn to read past.
|
|
373
|
+
STALE_TAPS_DAYS = 14
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
def mark_refreshed() -> None:
|
|
377
|
+
"""Stamp "the taps were refreshed just now"; never fails a refresh."""
|
|
378
|
+
with suppress(OSError):
|
|
379
|
+
paths.ensure_dirs()
|
|
380
|
+
paths.tap_refresh_marker().write_text("", encoding="utf-8")
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
def refresh_age_days() -> float | None:
|
|
384
|
+
"""Days since the last tap refresh, or None when nothing has recorded one.
|
|
385
|
+
|
|
386
|
+
None is not zero and not infinity: on a machine that has never run
|
|
387
|
+
`boost update` there is nothing to report, and inventing an age would make
|
|
388
|
+
every fresh install nag about staleness on its first search.
|
|
389
|
+
"""
|
|
390
|
+
marker = paths.tap_refresh_marker()
|
|
391
|
+
try:
|
|
392
|
+
age = time.time() - marker.stat().st_mtime
|
|
393
|
+
except OSError:
|
|
394
|
+
return None
|
|
395
|
+
return max(0.0, age / 86400.0)
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def pin(name: str, commit: str) -> Tap:
|
|
399
|
+
"""Record `commit` as the tap's pin, so `update` leaves it alone."""
|
|
400
|
+
tap = get(name)
|
|
401
|
+
cfg = config.load()
|
|
402
|
+
for row in cfg.get("taps", []) or []:
|
|
403
|
+
if isinstance(row, dict) and row.get("name") == tap.name:
|
|
404
|
+
row["pin"] = commit
|
|
405
|
+
config.save(cfg)
|
|
406
|
+
tap.pin = commit
|
|
407
|
+
return tap
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def unpin(name: str) -> Tap:
|
|
411
|
+
"""Drop a tap's pin so it tracks its default branch again."""
|
|
412
|
+
tap = get(name)
|
|
413
|
+
cfg = config.load()
|
|
414
|
+
for row in cfg.get("taps", []) or []:
|
|
415
|
+
if isinstance(row, dict) and row.get("name") == tap.name:
|
|
416
|
+
row.pop("pin", None)
|
|
417
|
+
config.save(cfg)
|
|
418
|
+
tap.pin = ""
|
|
419
|
+
return tap
|
|
420
|
+
|
|
421
|
+
|
|
355
422
|
def remove(name: str) -> Tap:
|
|
356
423
|
"""Deregister a tap and delete its clone and cache file.
|
|
357
424
|
|
|
@@ -374,9 +441,14 @@ def remove(name: str) -> Tap:
|
|
|
374
441
|
WHEEL_SCHEME = "builtin:"
|
|
375
442
|
|
|
376
443
|
|
|
377
|
-
def update(name: str | None = None
|
|
444
|
+
def update(name: str | None = None,
|
|
445
|
+
force: bool = False) -> tuple[dict, dict]:
|
|
378
446
|
"""git-pull one tap (or all). Returns ``({name: summary}, {name: error})``.
|
|
379
447
|
|
|
448
|
+
**A pinned tap is skipped** unless ``force``, which also clears the pin —
|
|
449
|
+
an update that silently moved a pinned clone is what made `tap --at` a
|
|
450
|
+
suggestion rather than a guarantee.
|
|
451
|
+
|
|
380
452
|
**A named tap still raises.** ``boost update sometap`` is a request about
|
|
381
453
|
that one tap, so its failure is the answer to the question asked.
|
|
382
454
|
|
|
@@ -395,6 +467,14 @@ def update(name: str | None = None) -> tuple[dict, dict]:
|
|
|
395
467
|
results: dict = {}
|
|
396
468
|
failures: dict = {}
|
|
397
469
|
for tap in targets:
|
|
470
|
+
if tap.pin and not force:
|
|
471
|
+
# A pinned tap is held at one commit on purpose: prebuilt vectors
|
|
472
|
+
# are keyed to it, and moving the clone would make them stale while
|
|
473
|
+
# still present — the failure that looks like nothing at all. Not
|
|
474
|
+
# an error, because "update everything" over 400 taps should not
|
|
475
|
+
# fail because three are pinned.
|
|
476
|
+
results[tap.name] = "pinned at %s (skipped)" % tap.pin[:7]
|
|
477
|
+
continue
|
|
398
478
|
try:
|
|
399
479
|
if tap.url.startswith(WHEEL_SCHEME):
|
|
400
480
|
# boost's own tap arrives with the wheel, so there is no remote
|
|
@@ -414,6 +494,11 @@ def update(name: str | None = None) -> tuple[dict, dict]:
|
|
|
414
494
|
results[tap.name] = "cloned"
|
|
415
495
|
else:
|
|
416
496
|
results[tap.name] = gitutil.pull(tap.path)
|
|
497
|
+
if tap.pin:
|
|
498
|
+
# `--force` is a decision to stop holding this tap still,
|
|
499
|
+
# so the pin goes with the move rather than silently
|
|
500
|
+
# re-applying on the next run.
|
|
501
|
+
unpin(tap.name)
|
|
417
502
|
except BoostError as err:
|
|
418
503
|
if name:
|
|
419
504
|
raise
|
|
@@ -421,4 +506,9 @@ def update(name: str | None = None) -> tuple[dict, dict]:
|
|
|
421
506
|
# says; git's own first line already carries the URL or path. See
|
|
422
507
|
# gitutil._git_error for why that line is now the one we show.
|
|
423
508
|
failures[tap.name] = err.message
|
|
509
|
+
if results:
|
|
510
|
+
# Stamped on any successful sweep, including one where every tap was
|
|
511
|
+
# already current: "refreshed" is about having asked, not about having
|
|
512
|
+
# found something.
|
|
513
|
+
mark_refreshed()
|
|
424
514
|
return results, failures
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.49
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -186,8 +186,21 @@ those vectors. Embedding is ~1.2 s/chunk on CPU — hours for a real corpus —
|
|
|
186
186
|
and importing the same rows takes 0.12 s, so the difference between the two is
|
|
187
187
|
the difference between semantic search being available and being reachable.
|
|
188
188
|
|
|
189
|
+
Want everything? `boost quickstart --catalog` taps all 463 catalogued
|
|
190
|
+
registries — 2 min 10 s now that clones run in parallel — and fetches vectors
|
|
191
|
+
for every one that has a published shard.
|
|
192
|
+
|
|
189
193
|
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
190
194
|
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
195
|
+
|
|
196
|
+
Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
|
|
197
|
+
it fetches vectors for, and `boost update` skips a pinned tap rather than moving
|
|
198
|
+
it out from under them (`--force` moves it anyway and drops the pin). When a tap
|
|
199
|
+
does move, boost checks whether a newer shard exists for the new commit and
|
|
200
|
+
imports it; if none does, it says so instead of leaving stale vectors looking
|
|
201
|
+
fresh. `boost search` never refreshes taps behind your back — it prints one line
|
|
202
|
+
when they are more than two weeks old and leaves the fetching to
|
|
203
|
+
`boost update --taps-only`.
|
|
191
204
|
Every download is checked against the sha256 in the manifest and refused on a
|
|
192
205
|
mismatch, and shards for a registry that has moved since publication are
|
|
193
206
|
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
@@ -553,6 +553,7 @@ scripts/publish_shards.py
|
|
|
553
553
|
scripts/release_guard.py
|
|
554
554
|
scripts/release_preflight.py
|
|
555
555
|
scripts/serve_docs.py
|
|
556
|
+
scripts/shard_plan.py
|
|
556
557
|
style/README.md
|
|
557
558
|
style/boost.css
|
|
558
559
|
style/boost.js
|
|
@@ -599,6 +600,7 @@ tests/functional/test_cli_pane_width.py
|
|
|
599
600
|
tests/functional/test_cli_pkg.py
|
|
600
601
|
tests/functional/test_cli_quality.py
|
|
601
602
|
tests/functional/test_cli_quickstart.py
|
|
603
|
+
tests/functional/test_cli_tap_pins.py
|
|
602
604
|
tests/functional/test_cli_taps.py
|
|
603
605
|
tests/functional/test_cli_team.py
|
|
604
606
|
tests/functional/test_everyday_loop.py
|
|
@@ -775,6 +777,7 @@ tests/unit/test_secretscan.py
|
|
|
775
777
|
tests/unit/test_selfupdate.py
|
|
776
778
|
tests/unit/test_serve.py
|
|
777
779
|
tests/unit/test_serve_docs.py
|
|
780
|
+
tests/unit/test_shard_plan.py
|
|
778
781
|
tests/unit/test_shards.py
|
|
779
782
|
tests/unit/test_shards_matrix.py
|
|
780
783
|
tests/unit/test_smoke_covers_every_command.py
|
|
@@ -786,6 +789,7 @@ tests/unit/test_store.py
|
|
|
786
789
|
tests/unit/test_store_materialize.py
|
|
787
790
|
tests/unit/test_sync_blocked_links.py
|
|
788
791
|
tests/unit/test_sync_repairs_gutted_skill.py
|
|
792
|
+
tests/unit/test_tap_pins.py
|
|
789
793
|
tests/unit/test_token_parity.py
|
|
790
794
|
tests/unit/test_toolchain_lock.py
|
|
791
795
|
tests/unit/test_trustaudit.py
|
|
@@ -793,6 +797,7 @@ tests/unit/test_typosquat.py
|
|
|
793
797
|
tests/unit/test_updatediff.py
|
|
794
798
|
tests/unit/test_util.py
|
|
795
799
|
tests/unit/test_version.py
|
|
800
|
+
tests/unit/test_version_tags.py
|
|
796
801
|
tests/unit/test_vex.py
|
|
797
802
|
tests/unit/test_visual_harness_flags.py
|
|
798
803
|
tests/unit/test_workflow_concurrency.py
|