boost-skill-cli 1.2.53__tar.gz → 1.2.54__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.53 → boost_skill_cli-1.2.54}/CLAUDE.md +16 -0
- {boost_skill_cli-1.2.53/boost_skill_cli.egg-info → boost_skill_cli-1.2.54}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/shards.py +27 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.2.54/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +48 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap.html +46 -1
- boost_skill_cli-1.2.54/scripts/publish_shards.py +303 -0
- boost_skill_cli-1.2.54/tests/unit/test_shards_incremental.py +271 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_shards_matrix.py +4 -1
- boost_skill_cli-1.2.53/scripts/publish_shards.py +0 -166
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.gitattributes +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.gitignore +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/.vale.ini +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/DCO +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/LICENSE +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/Makefile +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/README.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/codecov.yml +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/index.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/README.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/examples/README.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/index.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/noxfile.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/setup.cfg +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/style/README.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/style/boost.css +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/style/boost.js +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/style/demo.html +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.53 → boost_skill_cli-1.2.54}/tests/visual/visual_check.mjs +0 -0
|
@@ -493,6 +493,22 @@ each agent's skills dir, and updating the lock file.
|
|
|
493
493
|
published. A matrix entry is a **space-separated list**, split in Python
|
|
494
494
|
inside the job, never by shell word-splitting.
|
|
495
495
|
|
|
496
|
+
- **A shard run reuses what it already published, and the manifest is how.**
|
|
497
|
+
Every weekly run used to embed the whole catalogue (~9 job-hours) on
|
|
498
|
+
ephemeral runners with no memory of last week, although registries move
|
|
499
|
+
slowly. `shards.unchanged(manifest, commits)` returns the rows whose pinned
|
|
500
|
+
commit is the tap's commit *now*; the build job removes those taps before
|
|
501
|
+
`reindex --dense`, and the publish job fetches last week's manifest from the
|
|
502
|
+
release and carries their rows forward verbatim (`publish_shards.py manifest
|
|
503
|
+
--carry-forward`). Carry forward, not import-and-re-export: the assets are
|
|
504
|
+
still on the release byte for byte (`gh release upload --clobber` replaces,
|
|
505
|
+
never deletes), so re-exporting would re-upload ~300 MB of identical vectors
|
|
506
|
+
a week. Three refusals keep it honest — an empty local commit is a failed
|
|
507
|
+
clone, not a match; a manifest in another embedding space reuses nothing;
|
|
508
|
+
and a row is carried only when the job's commit and the manifest's agree. A
|
|
509
|
+
registry that is neither fresh nor unchanged drops out of the manifest rather
|
|
510
|
+
than accumulating forever. Its asset stays; its row returns when it does.
|
|
511
|
+
|
|
496
512
|
- **A published shard is only importable while three things match, and every
|
|
497
513
|
mismatch is silent if waved through.** `core/shards.py` fetches
|
|
498
514
|
`manifest.json` from a rolling `shards-latest` **prerelease** on this repo —
|
|
@@ -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.54'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 54)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -171,6 +171,33 @@ def rows(manifest: dict) -> dict[str, dict]:
|
|
|
171
171
|
return out
|
|
172
172
|
|
|
173
173
|
|
|
174
|
+
def unchanged(manifest: dict, commits: dict[str, str]) -> dict[str, dict]:
|
|
175
|
+
"""Manifest rows that already describe the commit each tap is at now.
|
|
176
|
+
|
|
177
|
+
This is what lets a weekly shard run skip most of its own work. Every run
|
|
178
|
+
used to embed every registry from scratch — ~9 job-hours for the catalogue
|
|
179
|
+
— on ephemeral runners with no memory of last week, and registries move
|
|
180
|
+
slowly, so most of that bought the same vectors again. The manifest pins
|
|
181
|
+
the commit each shard was built from, so "has this one moved?" is one
|
|
182
|
+
comparison, and a registry that has not keeps last week's row.
|
|
183
|
+
|
|
184
|
+
Same rule that makes a shard importable at all: reuse only for the EXACT
|
|
185
|
+
commit the row describes. An empty local commit is a tap whose clone
|
|
186
|
+
failed, not a match — that registry is embedded, never skipped. The
|
|
187
|
+
embedding-space check is the caller's (:func:`incompatible`), because a
|
|
188
|
+
manifest from another space reuses nothing however fresh its commits.
|
|
189
|
+
"""
|
|
190
|
+
index = rows(manifest)
|
|
191
|
+
out: dict[str, dict] = {}
|
|
192
|
+
for tap, commit in commits.items():
|
|
193
|
+
row = index.get(tap)
|
|
194
|
+
if row is None or not commit:
|
|
195
|
+
continue
|
|
196
|
+
if str(row.get("commit")) == commit:
|
|
197
|
+
out[tap] = row
|
|
198
|
+
return out
|
|
199
|
+
|
|
200
|
+
|
|
174
201
|
def _same_origin(a: str, b: str) -> bool:
|
|
175
202
|
"""True when two URLs share scheme+host+port.
|
|
176
203
|
|
|
@@ -439,6 +439,7 @@ docs/roadmap/items/self-update-claims-up-to-date-without-asking.md
|
|
|
439
439
|
docs/roadmap/items/serve-404-reflected-the-request.md
|
|
440
440
|
docs/roadmap/items/serve-is-a-searchable-catalogue.md
|
|
441
441
|
docs/roadmap/items/serve-py-traversal-guards-untested.md
|
|
442
|
+
docs/roadmap/items/shard-runs-reembed-everything-weekly.md
|
|
442
443
|
docs/roadmap/items/shards-pipeline-never-produced-a-shard.md
|
|
443
444
|
docs/roadmap/items/shareable-catalogue-bundle.md
|
|
444
445
|
docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
|
|
@@ -783,6 +784,7 @@ tests/unit/test_serve.py
|
|
|
783
784
|
tests/unit/test_serve_docs.py
|
|
784
785
|
tests/unit/test_shard_plan.py
|
|
785
786
|
tests/unit/test_shards.py
|
|
787
|
+
tests/unit/test_shards_incremental.py
|
|
786
788
|
tests/unit/test_shards_matrix.py
|
|
787
789
|
tests/unit/test_smoke_covers_every_command.py
|
|
788
790
|
tests/unit/test_spdx_headers.py
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: shard-runs-reembed-everything-weekly
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Retrieval · CI
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: the manifest already knew which registries had not moved
|
|
11
|
+
order: 2
|
|
12
|
+
owner: loop/shards-incremental
|
|
13
|
+
pr:
|
|
14
|
+
title: Every weekly shard run re-embedded the whole catalogue
|
|
15
|
+
---
|
|
16
|
+
The catalogue shard run is <b>60 packed jobs over 463 registries, ~9 job-hours a week</b> at the
|
|
17
|
+
measured 0.22 s/chunk — and every one of those hours was spent on ephemeral runners with
|
|
18
|
+
no memory of the week before. Registries move slowly. Most weeks most of the catalogue is at the
|
|
19
|
+
same commit it was published at, and the run bought the same vectors again, byte for byte.
|
|
20
|
+
|
|
21
|
+
<b>The manifest already held the answer.</b> Each row pins the registry commit its shard was
|
|
22
|
+
built from, because <code>dense.import_shard</code> refuses a shard for any other commit. That
|
|
23
|
+
same pin answers "has this registry moved since we published?" in one comparison, and
|
|
24
|
+
<code>shards.unchanged(manifest, commits)</code> makes it: a tap is unchanged only for the
|
|
25
|
+
<em>exact</em> commit its row describes, an empty local commit (a clone that failed) never
|
|
26
|
+
counts, and a manifest in another embedding space reuses nothing however fresh its commits
|
|
27
|
+
— none of its rows would be importable by the consumer this run publishes for.
|
|
28
|
+
|
|
29
|
+
<b>Carry forward, not re-export.</b> The build job taps its chunk, asks
|
|
30
|
+
<code>publish_shards.py unchanged</code>, untaps every registry it lists, and embeds only what
|
|
31
|
+
is left — a chunk with nothing left skips the pass rather than failing on "no taps
|
|
32
|
+
configured". The publish job fetches last week's manifest from the release and carries those
|
|
33
|
+
rows forward verbatim: the assets are still there, since <code>gh release upload --clobber</code>
|
|
34
|
+
replaces but never deletes. The cheaper-looking alternative, import last week's shard and
|
|
35
|
+
re-export it, would re-upload ~300 MB of identical vectors a week for nothing.
|
|
36
|
+
|
|
37
|
+
<b>What the row set means now.</b> Fresh beats carried for the same tap. A registry that is
|
|
38
|
+
neither fresh nor unchanged — removed from the catalogue, or failed to tap this week
|
|
39
|
+
— drops out of the manifest rather than accumulating forever; its asset stays on the
|
|
40
|
+
release, harmless, and its row returns the week the registry does. A row is carried only when
|
|
41
|
+
the job's commit and the manifest's agree: two sources disagreeing means someone is wrong, and
|
|
42
|
+
the honest outcome is a re-embed next run, not a row that may describe a tree the registry has
|
|
43
|
+
left.
|
|
44
|
+
|
|
45
|
+
<b>Cost after.</b> The first run is unchanged. Every run after it costs the registries that
|
|
46
|
+
moved plus one comparison each for the rest, so a quiet week is a manifest upload and little
|
|
47
|
+
else, and wall clock is bounded by the largest registry that actually changed rather than by
|
|
48
|
+
the largest registry.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>20</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>289</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -5704,6 +5704,51 @@ header claims rows only a Voyage key can read.</p></details>
|
|
|
5704
5704
|
</div>
|
|
5705
5705
|
</article>
|
|
5706
5706
|
|
|
5707
|
+
<article class="cap rcard" id="shard-runs-reembed-everything-weekly">
|
|
5708
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Retrieval · CI</span></div>
|
|
5709
|
+
<h3>Every weekly shard run re-embedded the whole catalogue</h3>
|
|
5710
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
5711
|
+
<p>The catalogue shard run is <b>60 packed jobs over 463 registries, ~9 job-hours a week</b> at the
|
|
5712
|
+
measured 0.22 s/chunk — and every one of those hours was spent on ephemeral runners with
|
|
5713
|
+
no memory of the week before. Registries move slowly. Most weeks most of the catalogue is at the
|
|
5714
|
+
same commit it was published at, and the run bought the same vectors again, byte for byte.
|
|
5715
|
+
|
|
5716
|
+
<b>The manifest already held the answer.</b> Each row pins the registry commit its shard was
|
|
5717
|
+
built from, because <code>dense.import_shard</code> refuses a shard for any other commit. That
|
|
5718
|
+
same pin answers "has this registry moved since we published?" in one comparison, and
|
|
5719
|
+
<code>shards.unchanged(manifest, commits)</code> makes it: a tap is unchanged only for the
|
|
5720
|
+
<em>exact</em> commit its row describes, an empty local commit (a clone that failed) never
|
|
5721
|
+
counts, and a manifest in another embedding space reuses nothing however fresh its commits
|
|
5722
|
+
— none of its rows would be importable by the consumer this run publishes for.
|
|
5723
|
+
|
|
5724
|
+
<b>Carry forward, not re-export.</b> The build job taps its chunk, asks
|
|
5725
|
+
<code>publish_shards.py unchanged</code>, untaps every registry it lists, and embeds only what
|
|
5726
|
+
is left — a chunk with nothing left skips the pass rather than failing on "no taps
|
|
5727
|
+
configured". The publish job fetches last week's manifest from the release and carries those
|
|
5728
|
+
rows forward verbatim: the assets are still there, since <code>gh release upload --clobber</code>
|
|
5729
|
+
replaces but never deletes. The cheaper-looking alternative, import last week's shard and
|
|
5730
|
+
re-export it, would re-upload ~300 MB of identical vectors a week for nothing.
|
|
5731
|
+
|
|
5732
|
+
<b>What the row set means now.</b> Fresh beats carried for the same tap. A registry that is
|
|
5733
|
+
neither fresh nor unchanged — removed from the catalogue, or failed to tap this week
|
|
5734
|
+
— drops out of the manifest rather than accumulating forever; its asset stays on the
|
|
5735
|
+
release, harmless, and its row returns the week the registry does. A row is carried only when
|
|
5736
|
+
the job's commit and the manifest's agree: two sources disagreeing means someone is wrong, and
|
|
5737
|
+
the honest outcome is a re-embed next run, not a row that may describe a tree the registry has
|
|
5738
|
+
left.
|
|
5739
|
+
|
|
5740
|
+
<b>Cost after.</b> The first run is unchanged. Every run after it costs the registries that
|
|
5741
|
+
moved plus one comparison each for the rest, so a quiet week is a manifest upload and little
|
|
5742
|
+
else, and wall clock is bounded by the largest registry that actually changed rather than by
|
|
5743
|
+
the largest registry.</p></details>
|
|
5744
|
+
<div class="meta">
|
|
5745
|
+
<span class="m">Complexity <b>M</b></span>
|
|
5746
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
5747
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
5748
|
+
<span class="m">the manifest already knew which registries had not moved</span>
|
|
5749
|
+
</div>
|
|
5750
|
+
</article>
|
|
5751
|
+
|
|
5707
5752
|
<article class="cap rcard" id="workflow-linting-actionlint">
|
|
5708
5753
|
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Quality · CI/CD</span></div>
|
|
5709
5754
|
<h3>Workflow linting — <code>actionlint</code></h3>
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright the boost contributors.
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
"""Turn exported vector shards into something a stranger can download.
|
|
5
|
+
|
|
6
|
+
Three subcommands, matching the three halves of publishing:
|
|
7
|
+
|
|
8
|
+
publish_shards.py export --out DIR [--tap owner/repo ...]
|
|
9
|
+
Export every tapped registry's vectors from THIS machine's store.
|
|
10
|
+
Run it where the embeddings already exist — that is the whole point of
|
|
11
|
+
a shard, and re-embedding to publish would defeat it.
|
|
12
|
+
|
|
13
|
+
publish_shards.py unchanged --manifest-url URL --out FILE
|
|
14
|
+
Which tapped registries are already published at the commit they are
|
|
15
|
+
at now. Run it after tapping and BEFORE embedding: every registry it
|
|
16
|
+
lists can be untapped, and the embed pass costs only what moved.
|
|
17
|
+
|
|
18
|
+
publish_shards.py manifest --shard-dir DIR --repo owner/repo [--tag TAG]
|
|
19
|
+
[--carry-forward PREV.json --unchanged FILE...]
|
|
20
|
+
Digest the shards in DIR and write the manifest that `core.shards`
|
|
21
|
+
reads: schema version, the embedding space they all share, and one row
|
|
22
|
+
per shard with its registry commit, size, sha256 and download URL. With
|
|
23
|
+
`--carry-forward`, rows from the previous manifest survive for the
|
|
24
|
+
registries the build jobs reported unchanged — their assets are still
|
|
25
|
+
on the release, byte for byte, so the old row is the right row.
|
|
26
|
+
|
|
27
|
+
WHY THE MANIFEST IS GENERATED AND NOT WRITTEN BY HAND. Three of its fields are
|
|
28
|
+
load-bearing at import time and unguessable: `sha256` is what makes a download
|
|
29
|
+
verifiable, `commit` is what stops a stale shard being merged, and
|
|
30
|
+
`provider`/`model`/`dim` are what stop vectors from two different embedding
|
|
31
|
+
spaces being mixed into one store — a failure that does not raise, it just
|
|
32
|
+
returns nonsense rankings.
|
|
33
|
+
|
|
34
|
+
WHY CARRY FORWARD RATHER THAN RE-EXPORT. Every weekly run used to embed every
|
|
35
|
+
registry from scratch (~9 job-hours for the catalogue) although most registries
|
|
36
|
+
had not moved. The cheap alternative — import last week's shard and re-export
|
|
37
|
+
it — re-uploads ~300 MB of identical vectors a week. Carrying the row forward
|
|
38
|
+
uploads nothing: the asset is already on the release, and `--clobber` never
|
|
39
|
+
deletes what it does not replace.
|
|
40
|
+
|
|
41
|
+
WHICH EMBEDDING SPACE TO PUBLISH. The keyless one. `embed` resolves Voyage, then
|
|
42
|
+
OpenAI, then the local ONNX `BAAI/bge-small-en-v1.5` that ships with the `rag`
|
|
43
|
+
extra, so a shard built on a machine holding `VOYAGE_API_KEY` is 1024-d
|
|
44
|
+
`voyage-4` and can only be imported — and queried — by someone else holding that
|
|
45
|
+
key. Export refuses to mix spaces for that reason, and says which one it found.
|
|
46
|
+
"""
|
|
47
|
+
from __future__ import annotations
|
|
48
|
+
|
|
49
|
+
import argparse
|
|
50
|
+
import hashlib
|
|
51
|
+
import json
|
|
52
|
+
import sys
|
|
53
|
+
from datetime import UTC, datetime
|
|
54
|
+
from pathlib import Path
|
|
55
|
+
|
|
56
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
57
|
+
|
|
58
|
+
from boost_cli.core import dense, gitutil, registry, shards
|
|
59
|
+
from boost_cli.errors import BoostError
|
|
60
|
+
|
|
61
|
+
DEFAULT_TAG = "shards-latest"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _safe(tap: str) -> str:
|
|
65
|
+
return tap.replace("/", "__")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _space(d: dict) -> dict:
|
|
69
|
+
"""The (provider, model, dim) triple, normalised so JSON and shard agree."""
|
|
70
|
+
return {"provider": str(d.get("provider") or ""),
|
|
71
|
+
"model": str(d.get("model") or ""),
|
|
72
|
+
"dim": int(d.get("dim") or 0)}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _fmt_space(space: dict) -> str:
|
|
76
|
+
return "%s/%s/%sd" % (space["provider"], space["model"], space["dim"])
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def cmd_export(args: argparse.Namespace) -> int:
|
|
80
|
+
"""Write one `<tap>.shard.json` per tap into `--out`."""
|
|
81
|
+
taps = args.tap or [t.name for t in registry.list_taps()]
|
|
82
|
+
if not taps:
|
|
83
|
+
print("no taps configured on this machine", file=sys.stderr)
|
|
84
|
+
return 1
|
|
85
|
+
out_dir = Path(args.out)
|
|
86
|
+
out_dir.mkdir(parents=True, exist_ok=True)
|
|
87
|
+
written = 0
|
|
88
|
+
for tap in taps:
|
|
89
|
+
try:
|
|
90
|
+
shard = dense.export_shard(tap)
|
|
91
|
+
except BoostError as exc:
|
|
92
|
+
print("skip %s: %s" % (tap, exc.message), file=sys.stderr)
|
|
93
|
+
continue
|
|
94
|
+
if not shard.get("chunks"):
|
|
95
|
+
print("skip %s: no vectors" % tap, file=sys.stderr)
|
|
96
|
+
continue
|
|
97
|
+
dest = out_dir / (_safe(tap) + ".shard.json")
|
|
98
|
+
dest.write_text(json.dumps(shard), encoding="utf-8")
|
|
99
|
+
written += 1
|
|
100
|
+
print("%s: %d chunks, %s @ %s"
|
|
101
|
+
% (tap, len(shard["chunks"]), shard.get("model"),
|
|
102
|
+
str(shard.get("commit"))[:8]))
|
|
103
|
+
print("wrote %d shard(s) to %s" % (written, out_dir))
|
|
104
|
+
return 0 if written else 1
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def cmd_unchanged(args: argparse.Namespace) -> int:
|
|
108
|
+
"""Write `tap commit` for every tap whose published shard is current.
|
|
109
|
+
|
|
110
|
+
Exit 0 whatever happens: an empty list means "embed everything", which is
|
|
111
|
+
the right outcome for a first run, an unreachable release, or a manifest in
|
|
112
|
+
another embedding space — and a workflow that aborted on any of those would
|
|
113
|
+
never publish the first shard.
|
|
114
|
+
"""
|
|
115
|
+
lines: list[str] = []
|
|
116
|
+
try:
|
|
117
|
+
manifest = shards.fetch_manifest(args.manifest_url)
|
|
118
|
+
except BoostError as exc:
|
|
119
|
+
print("no usable manifest (%s) — embedding everything" % exc.message,
|
|
120
|
+
file=sys.stderr)
|
|
121
|
+
manifest = None
|
|
122
|
+
if manifest is not None:
|
|
123
|
+
why = shards.incompatible(manifest)
|
|
124
|
+
if why:
|
|
125
|
+
print("published shards are not in this run's space (%s) — "
|
|
126
|
+
"embedding everything" % why, file=sys.stderr)
|
|
127
|
+
else:
|
|
128
|
+
commits = {t.name: (gitutil.head_commit(t.path) if t.is_cloned
|
|
129
|
+
else "")
|
|
130
|
+
for t in registry.list_taps()}
|
|
131
|
+
for tap, row in shards.unchanged(manifest, commits).items():
|
|
132
|
+
lines.append("%s %s" % (tap, row["commit"]))
|
|
133
|
+
text = "".join(line + "\n" for line in lines)
|
|
134
|
+
if args.out:
|
|
135
|
+
Path(args.out).write_text(text, encoding="utf-8")
|
|
136
|
+
else:
|
|
137
|
+
sys.stdout.write(text)
|
|
138
|
+
print("%d registr%s unchanged since the last publish"
|
|
139
|
+
% (len(lines), "y" if len(lines) == 1 else "ies"), file=sys.stderr)
|
|
140
|
+
return 0
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _fresh_row(path: Path, repo: str, tag: str) -> tuple[dict, dict]:
|
|
144
|
+
"""One manifest row plus the embedding space its shard was built in."""
|
|
145
|
+
raw = path.read_bytes()
|
|
146
|
+
shard = json.loads(raw.decode("utf-8"))
|
|
147
|
+
missing = [k for k in ("tap", "commit", "provider", "model", "dim")
|
|
148
|
+
if not shard.get(k)]
|
|
149
|
+
if missing:
|
|
150
|
+
raise SystemExit("%s is missing %s" % (path.name, ", ".join(missing)))
|
|
151
|
+
row = {
|
|
152
|
+
"tap": shard["tap"],
|
|
153
|
+
"commit": shard["commit"],
|
|
154
|
+
"chunks": len(shard.get("chunks") or []),
|
|
155
|
+
"bytes": len(raw),
|
|
156
|
+
"sha256": hashlib.sha256(raw).hexdigest(),
|
|
157
|
+
"url": "https://github.com/%s/releases/download/%s/%s"
|
|
158
|
+
% (repo, tag, path.name),
|
|
159
|
+
}
|
|
160
|
+
return row, _space(shard)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _carried_rows(prev_path: str, unchanged_files: list[str],
|
|
164
|
+
fresh_taps: set[str], space: dict | None
|
|
165
|
+
) -> tuple[list[dict], dict | None]:
|
|
166
|
+
"""Rows from the previous manifest for registries reported unchanged.
|
|
167
|
+
|
|
168
|
+
Returns ``(rows, previous_space)``. Every guard here refuses rather than
|
|
169
|
+
degrades: a row is carried only for the exact commit the job saw, only
|
|
170
|
+
when the previous manifest is in this run's embedding space, and never
|
|
171
|
+
for a registry a fresh shard already describes.
|
|
172
|
+
"""
|
|
173
|
+
try:
|
|
174
|
+
prev = json.loads(Path(prev_path).read_text(encoding="utf-8"))
|
|
175
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
176
|
+
print("previous manifest unreadable (%s) — carrying nothing forward"
|
|
177
|
+
% exc, file=sys.stderr)
|
|
178
|
+
return [], None
|
|
179
|
+
prev_space = _space(prev)
|
|
180
|
+
if space is not None and prev_space != space:
|
|
181
|
+
print("previous manifest is %s, this run is %s — carrying nothing "
|
|
182
|
+
"forward" % (_fmt_space(prev_space), _fmt_space(space)),
|
|
183
|
+
file=sys.stderr)
|
|
184
|
+
return [], prev_space
|
|
185
|
+
wanted: dict[str, str] = {}
|
|
186
|
+
for name in unchanged_files:
|
|
187
|
+
try:
|
|
188
|
+
text = Path(name).read_text(encoding="utf-8")
|
|
189
|
+
except OSError as exc:
|
|
190
|
+
print("cannot read %s (%s) — its registries will be re-embedded "
|
|
191
|
+
"next run" % (name, exc), file=sys.stderr)
|
|
192
|
+
continue
|
|
193
|
+
for line in text.splitlines():
|
|
194
|
+
parts = line.split()
|
|
195
|
+
if len(parts) == 2:
|
|
196
|
+
wanted[parts[0]] = parts[1]
|
|
197
|
+
index = shards.rows(prev)
|
|
198
|
+
out: list[dict] = []
|
|
199
|
+
for tap, commit in sorted(wanted.items()):
|
|
200
|
+
if tap in fresh_taps:
|
|
201
|
+
continue
|
|
202
|
+
row = index.get(tap)
|
|
203
|
+
if row is None or str(row.get("commit")) != commit:
|
|
204
|
+
# The job says one commit, the manifest another: someone is wrong,
|
|
205
|
+
# and a row carried under those conditions could describe a tree
|
|
206
|
+
# the registry is no longer at. Re-embedded next run.
|
|
207
|
+
continue
|
|
208
|
+
out.append(dict(row))
|
|
209
|
+
return out, prev_space
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def cmd_manifest(args: argparse.Namespace) -> int:
|
|
213
|
+
"""Digest a directory of shards (plus carried rows) into one manifest."""
|
|
214
|
+
shard_dir = Path(args.shard_dir)
|
|
215
|
+
files = sorted(shard_dir.glob("*.shard.json"))
|
|
216
|
+
rows: list[dict] = []
|
|
217
|
+
spaces: list[dict] = []
|
|
218
|
+
for path in files:
|
|
219
|
+
row, space = _fresh_row(path, args.repo, args.tag)
|
|
220
|
+
rows.append(row)
|
|
221
|
+
spaces.append(space)
|
|
222
|
+
first = spaces[0] if spaces else None
|
|
223
|
+
for path, space in zip(files, spaces, strict=True):
|
|
224
|
+
if space != first:
|
|
225
|
+
# Refuse rather than publish a manifest whose top-level space is a
|
|
226
|
+
# lie for some of its rows: `core.shards.incompatible` reads that
|
|
227
|
+
# one header to decide whether to download anything at all.
|
|
228
|
+
raise SystemExit(
|
|
229
|
+
"%s is %s but the others are %s — publish one embedding space "
|
|
230
|
+
"per manifest" % (path.name, _fmt_space(space),
|
|
231
|
+
_fmt_space(first or {})))
|
|
232
|
+
carried = 0
|
|
233
|
+
if args.carry_forward:
|
|
234
|
+
old, prev_space = _carried_rows(args.carry_forward, args.unchanged,
|
|
235
|
+
{r["tap"] for r in rows}, first)
|
|
236
|
+
rows.extend(old)
|
|
237
|
+
carried = len(old)
|
|
238
|
+
if first is None and old:
|
|
239
|
+
# A quiet week: nothing moved, nothing fresh, and the manifest is
|
|
240
|
+
# still due. Its space is the previous manifest's.
|
|
241
|
+
first = prev_space
|
|
242
|
+
if not rows or first is None:
|
|
243
|
+
print("nothing to publish: no *.shard.json under %s and nothing "
|
|
244
|
+
"carried forward" % shard_dir, file=sys.stderr)
|
|
245
|
+
return 1
|
|
246
|
+
manifest = {
|
|
247
|
+
"version": 1,
|
|
248
|
+
"generated": datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
249
|
+
"provider": first["provider"],
|
|
250
|
+
"model": first["model"],
|
|
251
|
+
"dim": first["dim"],
|
|
252
|
+
"shards": sorted(rows, key=lambda r: r["tap"]),
|
|
253
|
+
}
|
|
254
|
+
dest = Path(args.out)
|
|
255
|
+
dest.write_text(json.dumps(manifest, indent=2) + "\n", encoding="utf-8")
|
|
256
|
+
total = sum(int(r.get("chunks") or 0) for r in rows)
|
|
257
|
+
print("manifest: %d shard(s) (%d fresh, %d carried forward), %s chunks, "
|
|
258
|
+
"%s -> %s" % (len(rows), len(rows) - carried, carried,
|
|
259
|
+
format(total, ","), _fmt_space(first), dest))
|
|
260
|
+
return 0
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def main(argv: list[str] | None = None) -> int:
|
|
264
|
+
p = argparse.ArgumentParser(description=__doc__,
|
|
265
|
+
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
266
|
+
sub = p.add_subparsers(dest="cmd", required=True)
|
|
267
|
+
|
|
268
|
+
ex = sub.add_parser("export", help="export this machine's vectors")
|
|
269
|
+
ex.add_argument("--out", required=True, metavar="DIR")
|
|
270
|
+
ex.add_argument("--tap", action="append", metavar="OWNER/REPO",
|
|
271
|
+
help="only this tap (repeatable); default is every tap")
|
|
272
|
+
ex.set_defaults(func=cmd_export)
|
|
273
|
+
|
|
274
|
+
un = sub.add_parser("unchanged",
|
|
275
|
+
help="list tapped registries already published at "
|
|
276
|
+
"their current commit")
|
|
277
|
+
un.add_argument("--manifest-url", metavar="URL",
|
|
278
|
+
help="the published manifest (default: boost's own)")
|
|
279
|
+
un.add_argument("--out", metavar="FILE",
|
|
280
|
+
help="write `tap commit` lines here instead of stdout")
|
|
281
|
+
un.set_defaults(func=cmd_unchanged)
|
|
282
|
+
|
|
283
|
+
mf = sub.add_parser("manifest", help="write manifest.json for a shard dir")
|
|
284
|
+
mf.add_argument("--shard-dir", required=True, metavar="DIR")
|
|
285
|
+
mf.add_argument("--repo", required=True, metavar="OWNER/REPO",
|
|
286
|
+
help="repo whose release hosts the assets")
|
|
287
|
+
mf.add_argument("--tag", default=DEFAULT_TAG,
|
|
288
|
+
help="release tag hosting the assets (default: %(default)s)")
|
|
289
|
+
mf.add_argument("--out", default="manifest.json", metavar="FILE")
|
|
290
|
+
mf.add_argument("--carry-forward", metavar="PREV.json",
|
|
291
|
+
help="the previous manifest; its rows survive for "
|
|
292
|
+
"registries listed in --unchanged files")
|
|
293
|
+
mf.add_argument("--unchanged", nargs="*", default=[], metavar="FILE",
|
|
294
|
+
help="`tap commit` files written by "
|
|
295
|
+
"`publish_shards.py unchanged` in the build jobs")
|
|
296
|
+
mf.set_defaults(func=cmd_manifest)
|
|
297
|
+
|
|
298
|
+
args = p.parse_args(argv)
|
|
299
|
+
return int(args.func(args))
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
if __name__ == "__main__":
|
|
303
|
+
raise SystemExit(main())
|