boost-skill-cli 1.2.58__tar.gz → 1.2.60__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.58 → boost_skill_cli-1.2.60}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/CLAUDE.md +35 -0
- {boost_skill_cli-1.2.58/boost_skill_cli.egg-info → boost_skill_cli-1.2.60}/PKG-INFO +24 -4
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/README.md +23 -3
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/discovery.py +45 -2
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/pkg.py +107 -1
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/quality.py +15 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/claude_settings.py +36 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/config.py +25 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/dense.py +19 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/paths.py +12 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/registry.py +21 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/shards.py +133 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/store.py +20 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/data/registries.json +15 -3
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60/boost_skill_cli.egg-info}/PKG-INFO +24 -4
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/commands.html +5 -3
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/index.html +4 -1
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +16 -10
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +6 -1
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/tool-call-eval-tier.md +20 -3
- boost_skill_cli-1.2.60/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +62 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap.html +102 -14
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_registries.py +24 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_quality.py +40 -0
- boost_skill_cli-1.2.60/tests/unit/test_cli_update_shards.py +154 -0
- boost_skill_cli-1.2.60/tests/unit/test_gstack_coexistence.py +285 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shards.py +7 -1
- boost_skill_cli-1.2.60/tests/unit/test_shards_ingest.py +289 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.gitattributes +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.gitignore +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/.vale.ini +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/DCO +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/LICENSE +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/Makefile +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/codecov.yml +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/README.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/examples/README.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/index.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/noxfile.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/eval_tools.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/setup.cfg +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/README.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/boost.css +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/boost.js +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/style/demo.html +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/eval/tool_calls.jsonl +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_bot_pr_dco.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_eval_tools.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcp_read.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.58 → boost_skill_cli-1.2.60}/tests/visual/visual_check.mjs +0 -0
|
@@ -543,6 +543,41 @@ each agent's skills dir, and updating the lock file.
|
|
|
543
543
|
by another key-holder; `scripts/publish_shards.py manifest` refuses to
|
|
544
544
|
describe two spaces in one file.
|
|
545
545
|
|
|
546
|
+
- **`sync` and `ingest` differ in which side is authoritative, and only one of
|
|
547
|
+
them survives a republish.** `shards.sync` takes this machine's commits as
|
|
548
|
+
given and asks whether a published shard happens to match — right on setup
|
|
549
|
+
day, wrong a week later, because the weekly run republishes against whatever
|
|
550
|
+
the registries moved to. So for most taps the answer becomes "no", and the
|
|
551
|
+
user is told their vectors are stale with no way to act on it but hours of
|
|
552
|
+
local CPU: `boost update` chases branch HEAD and `--force` chases it while
|
|
553
|
+
dropping the pin, neither of which can land on a commit a manifest names.
|
|
554
|
+
`shards.ingest` reads the manifest as the **target**: a row for a tap held at
|
|
555
|
+
another commit is a reason to move the tap (`registry.retarget` — checkout
|
|
556
|
+
then pin, never the reverse), and `boost update --shards` is the surface. Two
|
|
557
|
+
invariants are load-bearing. **Download and verify before moving**: a move
|
|
558
|
+
followed by a failed download leaves vectors stale but present, the failure
|
|
559
|
+
that looks like nothing at all — `retarget` is injected so the ordering is
|
|
560
|
+
testable without a git remote. **Skip on `built`, not on `commits`**:
|
|
561
|
+
`dense.tap_commits()` says which commit the *vectors* were built at, and a tap
|
|
562
|
+
matching on both is skipped without a download, which is the whole reason a
|
|
563
|
+
weekly cron line costs one manifest fetch. A registry that dropped out of the
|
|
564
|
+
manifest is left pinned where it sits — falling back to HEAD would invent a
|
|
565
|
+
target no published vectors describe. And a tap that moves invalidates more
|
|
566
|
+
than vectors: its catalog cache and the BM25 index name entries from the old
|
|
567
|
+
tree, so `catalog.rebuild_tap` and `rag.build` run for anything that moved.
|
|
568
|
+
|
|
569
|
+
- **Search reads two mtimes and makes zero network calls, and cheapness is not
|
|
570
|
+
the argument.** The manifest is ~170 KB, so an inline check would be
|
|
571
|
+
affordable; acting on its answer means moving taps and downloading hundreds of
|
|
572
|
+
megabytes, which cannot happen inside a sub-second search. So the most an
|
|
573
|
+
inline check could ever produce is the one line `_hint_stale_shards` already
|
|
574
|
+
prints for one `stat` — at the price of a round trip per query and
|
|
575
|
+
unannounced egress. `paths.shard_sync_marker()` lives under `state/`, not
|
|
576
|
+
`cache/`, because `boost clean` sweeps `cache/*.json` and would delete it,
|
|
577
|
+
after which search would nag about vectors refreshed that morning. The shard
|
|
578
|
+
hint suppresses the tap-age hint when it fires: its remedy moves the taps too,
|
|
579
|
+
and two staleness lines under one result set is how a hint becomes noise.
|
|
580
|
+
|
|
546
581
|
**Search has two engines**, both in `core/`: `rag.py` is the always-on,
|
|
547
582
|
zero-dependency BM25 engine (full-content index, auto-builds on first
|
|
548
583
|
search — this is what the required `eval` gate floors at recall@k ≥ 0.78).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.60
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -197,14 +197,34 @@ for every one that has a published shard.
|
|
|
197
197
|
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
198
198
|
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
199
199
|
|
|
200
|
+
Vectors are republished weekly, and `boost update --shards` is the ingestion
|
|
201
|
+
side of that. It reads the manifest as the *target* state: each tap is moved
|
|
202
|
+
onto the commit its published vectors were built from, those vectors are
|
|
203
|
+
imported, and the keyword index is rebuilt for anything that moved. A tap
|
|
204
|
+
already sitting at the published commit with those vectors already built is
|
|
205
|
+
skipped without downloading anything, so in a week where a registry did not
|
|
206
|
+
move the command does nothing at all — which is what makes it safe to schedule:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
# refresh prebuilt vectors every Monday at 09:00 — crontab -e
|
|
210
|
+
0 9 * * 1 /full/path/to/boost update --shards >> ~/.boost/logs/shards.log 2>&1
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Plain `boost update` moves each tap to its branch head; `--shards` moves each
|
|
214
|
+
tap to the commit the published vectors describe. Two different targets, so
|
|
215
|
+
they are separate modes rather than one pass, and `--shards --taps-only` is
|
|
216
|
+
refused rather than silently picking one.
|
|
217
|
+
|
|
200
218
|
Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
|
|
201
219
|
it fetches vectors for, and `boost update` skips a pinned tap rather than moving
|
|
202
220
|
it out from under them (`--force` moves it anyway and drops the pin). When a tap
|
|
203
221
|
does move, boost checks whether a newer shard exists for the new commit and
|
|
204
222
|
imports it; if none does, it says so instead of leaving stale vectors looking
|
|
205
|
-
fresh. `boost search` never refreshes taps behind your back
|
|
206
|
-
|
|
207
|
-
|
|
223
|
+
fresh. `boost search` never refreshes taps behind your back, and never checks
|
|
224
|
+
the manifest either — acting on that answer means moving taps and downloading
|
|
225
|
+
hundreds of megabytes, which cannot happen inside a sub-second search. It prints
|
|
226
|
+
one line when the taps or the prebuilt vectors are more than two weeks old and
|
|
227
|
+
leaves the fetching to `boost update --taps-only` or `boost update --shards`.
|
|
208
228
|
Every download is checked against the sha256 in the manifest and refused on a
|
|
209
229
|
mismatch, and shards for a registry that has moved since publication are
|
|
210
230
|
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
@@ -155,14 +155,34 @@ for every one that has a published shard.
|
|
|
155
155
|
Already tapped? `boost reindex --fetch-shards` does the download half alone,
|
|
156
156
|
and `boost reindex --dense` embeds locally whatever has no published shard.
|
|
157
157
|
|
|
158
|
+
Vectors are republished weekly, and `boost update --shards` is the ingestion
|
|
159
|
+
side of that. It reads the manifest as the *target* state: each tap is moved
|
|
160
|
+
onto the commit its published vectors were built from, those vectors are
|
|
161
|
+
imported, and the keyword index is rebuilt for anything that moved. A tap
|
|
162
|
+
already sitting at the published commit with those vectors already built is
|
|
163
|
+
skipped without downloading anything, so in a week where a registry did not
|
|
164
|
+
move the command does nothing at all — which is what makes it safe to schedule:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# refresh prebuilt vectors every Monday at 09:00 — crontab -e
|
|
168
|
+
0 9 * * 1 /full/path/to/boost update --shards >> ~/.boost/logs/shards.log 2>&1
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Plain `boost update` moves each tap to its branch head; `--shards` moves each
|
|
172
|
+
tap to the commit the published vectors describe. Two different targets, so
|
|
173
|
+
they are separate modes rather than one pass, and `--shards --taps-only` is
|
|
174
|
+
refused rather than silently picking one.
|
|
175
|
+
|
|
158
176
|
Because vectors are keyed to a registry's commit, `quickstart` **pins** each tap
|
|
159
177
|
it fetches vectors for, and `boost update` skips a pinned tap rather than moving
|
|
160
178
|
it out from under them (`--force` moves it anyway and drops the pin). When a tap
|
|
161
179
|
does move, boost checks whether a newer shard exists for the new commit and
|
|
162
180
|
imports it; if none does, it says so instead of leaving stale vectors looking
|
|
163
|
-
fresh. `boost search` never refreshes taps behind your back
|
|
164
|
-
|
|
165
|
-
|
|
181
|
+
fresh. `boost search` never refreshes taps behind your back, and never checks
|
|
182
|
+
the manifest either — acting on that answer means moving taps and downloading
|
|
183
|
+
hundreds of megabytes, which cannot happen inside a sub-second search. It prints
|
|
184
|
+
one line when the taps or the prebuilt vectors are more than two weeks old and
|
|
185
|
+
leaves the fetching to `boost update --taps-only` or `boost update --shards`.
|
|
166
186
|
Every download is checked against the sha256 in the manifest and refused on a
|
|
167
187
|
mismatch, and shards for a registry that has moved since publication are
|
|
168
188
|
refused rather than merged — stale vectors would otherwise look fresh forever.
|
|
@@ -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.60'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 60)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -218,6 +218,8 @@ def _hint_stale_taps() -> None:
|
|
|
218
218
|
price of one stat, and a machine that has never refreshed says nothing at
|
|
219
219
|
all rather than inventing an age.
|
|
220
220
|
"""
|
|
221
|
+
if _hint_stale_shards():
|
|
222
|
+
return
|
|
221
223
|
age = registry.refresh_age_days()
|
|
222
224
|
if age is None or age < registry.STALE_TAPS_DAYS:
|
|
223
225
|
return
|
|
@@ -226,6 +228,37 @@ def _hint_stale_taps() -> None:
|
|
|
226
228
|
% int(age), "muted"))
|
|
227
229
|
|
|
228
230
|
|
|
231
|
+
def _hint_stale_shards() -> bool:
|
|
232
|
+
"""Mention un-ingested published vectors. One `stat`, and never a network call.
|
|
233
|
+
|
|
234
|
+
The published manifest is ~170 KB, so checking it inline would be cheap —
|
|
235
|
+
and cheapness is not the argument. Acting on the answer means moving taps
|
|
236
|
+
and downloading hundreds of megabytes, which cannot happen inside a
|
|
237
|
+
sub-second search, so the most an inline check could ever produce is this
|
|
238
|
+
one line: the same line, for the price of a network round trip on every
|
|
239
|
+
query and unannounced egress at that. The marker's mtime answers it for
|
|
240
|
+
free, and a machine that has never ingested a shard says nothing rather
|
|
241
|
+
than inventing an age.
|
|
242
|
+
|
|
243
|
+
Returns True when it printed, so the tap-age hint stays quiet. The remedy
|
|
244
|
+
named here moves the taps as well, and two staleness lines under one set of
|
|
245
|
+
results is how a hint turns into noise.
|
|
246
|
+
"""
|
|
247
|
+
from ..core import shards
|
|
248
|
+
age = shards.sync_age_days()
|
|
249
|
+
if age is None or age < shards.STALE_SHARDS_DAYS:
|
|
250
|
+
return False
|
|
251
|
+
from ..core import dense
|
|
252
|
+
if not dense.status().get("ready"):
|
|
253
|
+
# Vectors that are not serving queries cannot be stale in a way the
|
|
254
|
+
# user can act on; `_hint_semantic_search` owns that conversation.
|
|
255
|
+
return False
|
|
256
|
+
out.info(out.role(
|
|
257
|
+
"prebuilt vectors last refreshed %d days ago — `boost update --shards`"
|
|
258
|
+
% int(age), "muted"))
|
|
259
|
+
return True
|
|
260
|
+
|
|
261
|
+
|
|
229
262
|
def _hint_semantic_search(engine: str) -> None:
|
|
230
263
|
"""Say that a better engine exists, when BM25 answered alone.
|
|
231
264
|
|
|
@@ -315,8 +348,12 @@ def _fetch_shards(args) -> int:
|
|
|
315
348
|
hint=dense.fix_hint(dense.status().get("reason", "")))
|
|
316
349
|
commits = rag._tap_commits()
|
|
317
350
|
by_name = {t.name: commits.get(t.safe_name, "") for t in registry.list_taps()}
|
|
318
|
-
results = shards.sync(
|
|
319
|
-
|
|
351
|
+
results = shards.sync(
|
|
352
|
+
list(by_name), by_name, manifest=manifest,
|
|
353
|
+
# Progress goes to stdout, and so does the JSON: emitting both left
|
|
354
|
+
# `--json` printing "fetching ..." lines ahead of the document, which
|
|
355
|
+
# no parser can read past.
|
|
356
|
+
on_event=None if args.as_json else _shard_event)
|
|
320
357
|
if args.as_json:
|
|
321
358
|
print(json.dumps({"shards": results}, indent=2))
|
|
322
359
|
return 0
|
|
@@ -335,6 +372,12 @@ def _fetch_shards(args) -> int:
|
|
|
335
372
|
out.info(out.role("%d tap(s) without usable vectors: %s"
|
|
336
373
|
% (len(missing), ", ".join(missing[:5])
|
|
337
374
|
+ (" …" if len(missing) > 5 else "")), "muted"))
|
|
375
|
+
if any(r["status"] == "refused" for r in results):
|
|
376
|
+
# A refusal here is almost always "the tap has moved past the
|
|
377
|
+
# commit these vectors describe", which local embedding is the
|
|
378
|
+
# expensive answer to and `--shards` is the cheap one: it moves the
|
|
379
|
+
# tap back onto a published commit instead.
|
|
380
|
+
out.info("taps that moved past their vectors: `boost update --shards`")
|
|
338
381
|
out.info("embed those locally with `boost reindex --dense`")
|
|
339
382
|
return 0
|
|
340
383
|
|
|
@@ -16,7 +16,7 @@ from datetime import UTC, datetime
|
|
|
16
16
|
from itertools import chain
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
|
|
19
|
-
from .. import cliparse
|
|
19
|
+
from .. import cliparse, spin
|
|
20
20
|
from ..core import (
|
|
21
21
|
adapters,
|
|
22
22
|
agents,
|
|
@@ -878,6 +878,103 @@ def _resync_vectors(moved: list[str]) -> None:
|
|
|
878
878
|
"`boost reindex --dense`" % left, "muted"))
|
|
879
879
|
|
|
880
880
|
|
|
881
|
+
def _ingest_event(tap: str, status: str, detail: str) -> None:
|
|
882
|
+
"""Progress for one tap, quiet enough to run over four hundred of them."""
|
|
883
|
+
if status == "downloading":
|
|
884
|
+
out.info(out.role("fetching %s %s" % (tap, detail), "muted"))
|
|
885
|
+
elif status == "moving":
|
|
886
|
+
out.info(out.role("moving %s to %s" % (tap, detail), "muted"))
|
|
887
|
+
elif status == "failed":
|
|
888
|
+
out.info(out.role("%s: failed%s"
|
|
889
|
+
% (tap, " (%s)" % detail if detail else ""), "muted"))
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
def _ingest_shards(args) -> int:
|
|
893
|
+
"""`boost update --shards`: refresh vectors from the published manifest.
|
|
894
|
+
|
|
895
|
+
Its own mode rather than a step of the normal update, because the two move
|
|
896
|
+
taps toward different targets: a plain `boost update` moves each tap to its
|
|
897
|
+
branch HEAD, and this moves each tap to the commit the published vectors
|
|
898
|
+
were built from. Running both in one pass would move every tap twice and
|
|
899
|
+
leave the second answer standing, so the flag replaces the update rather
|
|
900
|
+
than extending it.
|
|
901
|
+
|
|
902
|
+
This is the ingestion path for the weekly shard run. It is a no-op on a
|
|
903
|
+
machine that already holds this week's vectors, which is what makes it
|
|
904
|
+
safe to put in a cron line — see the docs.
|
|
905
|
+
"""
|
|
906
|
+
from ..core import dense, shards
|
|
907
|
+
taps = registry.list_taps()
|
|
908
|
+
if not taps:
|
|
909
|
+
raise BoostError("no taps configured — nothing to refresh",
|
|
910
|
+
hint="`boost quickstart` taps the starters and loads "
|
|
911
|
+
"their vectors in one pass")
|
|
912
|
+
manifest = shards.fetch_manifest()
|
|
913
|
+
why = shards.incompatible(manifest)
|
|
914
|
+
if why:
|
|
915
|
+
raise BoostError("published shards cannot serve this machine — %s" % why,
|
|
916
|
+
hint=dense.fix_hint(dense.status().get("reason", "")))
|
|
917
|
+
commits = rag._tap_commits()
|
|
918
|
+
stored = dense.tap_commits()
|
|
919
|
+
# Both maps are keyed by tap name; the two sources are keyed by safe name.
|
|
920
|
+
by_name = {t.name: commits.get(t.safe_name, "") for t in taps}
|
|
921
|
+
built = {t.name: stored.get(t.safe_name, "") for t in taps}
|
|
922
|
+
results = shards.ingest(
|
|
923
|
+
list(by_name), by_name, built=built, manifest=manifest,
|
|
924
|
+
# Progress goes to stdout, which is where the JSON goes: under `--json`
|
|
925
|
+
# the two would interleave into something no parser can read.
|
|
926
|
+
on_event=None if args.as_json else _ingest_event)
|
|
927
|
+
|
|
928
|
+
imported = [r for r in results if r["status"] == "imported"]
|
|
929
|
+
current = [r for r in results if r["status"] == "current"]
|
|
930
|
+
failed = [r for r in results if r["status"] == "failed"]
|
|
931
|
+
moved = [r["tap"] for r in results if r.get("moved")]
|
|
932
|
+
# Before the output branch, never inside it: a tap that moved is describing
|
|
933
|
+
# a different tree, so its catalog cache and the keyword index both name
|
|
934
|
+
# entries that may no longer exist. Vectors are not the only thing a commit
|
|
935
|
+
# is load-bearing for, and a `--json` caller is owed the same repair.
|
|
936
|
+
for name in moved:
|
|
937
|
+
catalog.rebuild_tap(registry.get(name))
|
|
938
|
+
if moved:
|
|
939
|
+
# Spinners write to stderr, so this is safe under `--json`.
|
|
940
|
+
with spin.Spinner("rebuilding the keyword index"):
|
|
941
|
+
rag.build()
|
|
942
|
+
complete.refresh_names()
|
|
943
|
+
journal.log("update", "--shards")
|
|
944
|
+
# Nothing landed and nothing was already current: the manifest and this
|
|
945
|
+
# machine have nothing to say to each other, which a cron line should
|
|
946
|
+
# notice rather than read as a quiet success.
|
|
947
|
+
rc = 1 if failed and not imported and not current else 0
|
|
948
|
+
if args.as_json:
|
|
949
|
+
print(json.dumps({"shards": results}, indent=2))
|
|
950
|
+
return rc
|
|
951
|
+
|
|
952
|
+
if imported:
|
|
953
|
+
total = sum(int(r.get("chunks") or 0) for r in imported)
|
|
954
|
+
out.ok("imported %s (%s chunk%s)%s"
|
|
955
|
+
% (_plural(len(imported), "shard"), format(total, ","),
|
|
956
|
+
"" if total == 1 else "s",
|
|
957
|
+
", %d moved to a newer commit" % len(moved) if moved else ""))
|
|
958
|
+
if current:
|
|
959
|
+
out.info(out.role("%s already at the published commit"
|
|
960
|
+
% _plural(len(current), "tap"), "muted"))
|
|
961
|
+
if not imported and not current:
|
|
962
|
+
# Never a tick. Nothing landed, and "imported 0" with a tick reads as a
|
|
963
|
+
# job well done to the one user who most needs to know otherwise.
|
|
964
|
+
out.warn("no published vectors matched your taps")
|
|
965
|
+
unpublished = [r["tap"] for r in results if r["status"] == "unpublished"]
|
|
966
|
+
if unpublished:
|
|
967
|
+
out.info(out.role(
|
|
968
|
+
"%s not in the manifest, left where they are: %s"
|
|
969
|
+
% (_plural(len(unpublished), "tap"), ", ".join(unpublished[:5])
|
|
970
|
+
+ (" …" if len(unpublished) > 5 else "")), "muted"))
|
|
971
|
+
for r in failed:
|
|
972
|
+
out.warn("%s: %s" % (r["tap"], r.get("detail") or "failed"))
|
|
973
|
+
if failed:
|
|
974
|
+
out.info("embed those locally with `boost reindex --dense`")
|
|
975
|
+
return rc
|
|
976
|
+
|
|
977
|
+
|
|
881
978
|
def cmd_update(argv: list[str]) -> int:
|
|
882
979
|
ap = cliparse.parser(prog="boost update",
|
|
883
980
|
description="Sync taps or update installed skills")
|
|
@@ -894,7 +991,16 @@ def cmd_update(argv: list[str]) -> int:
|
|
|
894
991
|
help="skip the confirmation prompt")
|
|
895
992
|
ap.add_argument("--force", action="store_true",
|
|
896
993
|
help="move pinned taps too, clearing their pin")
|
|
994
|
+
ap.add_argument("--shards", action="store_true",
|
|
995
|
+
help="refresh prebuilt vectors from the published "
|
|
996
|
+
"manifest, moving taps to the commits it names")
|
|
997
|
+
ap.add_argument("--json", dest="as_json", action="store_true",
|
|
998
|
+
help="with --shards: print the per-tap result as JSON")
|
|
897
999
|
args = ap.parse_args(argv)
|
|
1000
|
+
if args.shards:
|
|
1001
|
+
if args.taps_only:
|
|
1002
|
+
ap.error("--shards and --taps-only move taps to different commits")
|
|
1003
|
+
return _ingest_shards(args)
|
|
898
1004
|
results, failures = registry.update(args.tap or None, force=args.force)
|
|
899
1005
|
if not results and not failures:
|
|
900
1006
|
out.info("no taps configured — start with `boost tap --defaults`")
|
|
@@ -24,6 +24,7 @@ from ..core import (
|
|
|
24
24
|
agents,
|
|
25
25
|
ai,
|
|
26
26
|
catalog,
|
|
27
|
+
claude_settings,
|
|
27
28
|
complete,
|
|
28
29
|
frontmatter,
|
|
29
30
|
gitutil,
|
|
@@ -549,6 +550,20 @@ def cmd_doctor(argv):
|
|
|
549
550
|
"left alone; yours to remove or repair"
|
|
550
551
|
% (len(foreign), _s(len(foreign))))
|
|
551
552
|
|
|
553
|
+
others = claude_settings.foreign_hooks("global")
|
|
554
|
+
if others:
|
|
555
|
+
# `out.info`, not `bad`, for the same reason as the foreign symlinks
|
|
556
|
+
# above: boost did not write these and will never remove them, so
|
|
557
|
+
# counting them would leave doctor permanently red on something no
|
|
558
|
+
# boost command can clear. Naming them is still worth a line — at
|
|
559
|
+
# 130k stars gstack is now a likely second writer of this exact file,
|
|
560
|
+
# and a user debugging a hook needs to know boost is not the only one
|
|
561
|
+
# in it.
|
|
562
|
+
events = sorted({h["event"] for h in others})
|
|
563
|
+
out.info("%d hook%s in ~/.claude/settings.json not managed by boost "
|
|
564
|
+
"(%s) — left alone; `boost hooks` only touches its own"
|
|
565
|
+
% (len(others), _s(len(others)), ", ".join(events)), wrap=True)
|
|
566
|
+
|
|
552
567
|
for dup in store.duplicate_discovery():
|
|
553
568
|
# An agent that reads the canonical store natively, holding its own
|
|
554
569
|
# entry for a skill that store already carries. Boost did not put it
|
|
@@ -200,6 +200,42 @@ def has_hook(scope: str, event: str, name: str,
|
|
|
200
200
|
return False
|
|
201
201
|
|
|
202
202
|
|
|
203
|
+
def foreign_hooks(scope: str | None = None,
|
|
204
|
+
project_dir: Path | None = None,
|
|
205
|
+
host: str = hookhost.CLAUDE) -> list[dict]:
|
|
206
|
+
"""Hooks in this host's settings that boost does not own.
|
|
207
|
+
|
|
208
|
+
The complement of :func:`list_hooks`, which skips every entry without the
|
|
209
|
+
`# boost:` marker — so boost could write this file for years and never be
|
|
210
|
+
able to say who else was writing it. That matters now that a settings.json
|
|
211
|
+
routinely has more than one writer: `garrytan/gstack`'s `./setup` registers
|
|
212
|
+
its own Stop hooks here and prunes "dead gstack entries" on every run, and
|
|
213
|
+
boost prunes its own by marker. The two namespaces are disjoint and
|
|
214
|
+
`tests/unit/test_gstack_coexistence.py` pins that they stay that way.
|
|
215
|
+
|
|
216
|
+
This exists so `boost doctor` can *report* the other tenant rather than
|
|
217
|
+
discover it by deleting something. Nothing here writes: a foreign hook is
|
|
218
|
+
not a boost problem to fix, it is context for a user reading a health
|
|
219
|
+
check — which is why doctor counts it with `out.info` rather than raising
|
|
220
|
+
the issue count.
|
|
221
|
+
"""
|
|
222
|
+
scopes = (scope,) if scope else SCOPES
|
|
223
|
+
rows: list[dict] = []
|
|
224
|
+
for sc in scopes:
|
|
225
|
+
data = load(sc, project_dir, host)
|
|
226
|
+
for event, blocks in (data.get("hooks") or {}).items():
|
|
227
|
+
for block in blocks or []:
|
|
228
|
+
if not isinstance(block, dict):
|
|
229
|
+
continue
|
|
230
|
+
for h in block.get("hooks") or []:
|
|
231
|
+
raw = str(h.get("command", ""))
|
|
232
|
+
if _hook_name(raw) is not None:
|
|
233
|
+
continue # ours
|
|
234
|
+
rows.append({"scope": sc, "event": event, "command": raw,
|
|
235
|
+
"matcher": block.get("matcher", "")})
|
|
236
|
+
return rows
|
|
237
|
+
|
|
238
|
+
|
|
203
239
|
def list_hooks(scope: str | None = None,
|
|
204
240
|
project_dir: Path | None = None,
|
|
205
241
|
host: str = hookhost.CLAUDE) -> list[dict]:
|
|
@@ -131,6 +131,31 @@ def load_registry_catalog() -> list:
|
|
|
131
131
|
return data.get("registries", [])
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
def self_installing_command(tap: str) -> str | None:
|
|
135
|
+
"""The repo's own install command, when boost must not copy its items.
|
|
136
|
+
|
|
137
|
+
Some registries are real catalogues of Markdown and some are programs that
|
|
138
|
+
happen to ship Markdown entry points. For the second kind boost's install —
|
|
139
|
+
copy the item's directory into the canonical store, symlink it out — yields
|
|
140
|
+
a skill that *looks* installed and cannot run, because the step that makes
|
|
141
|
+
it work is the repo's own build, not a fetch. Returns the upstream command
|
|
142
|
+
so the caller can name it instead of pretending; None for every other tap.
|
|
143
|
+
|
|
144
|
+
The tap may be addressed by full ``owner/repo`` or by the bare repo name a
|
|
145
|
+
clone directory carries, so both resolve.
|
|
146
|
+
"""
|
|
147
|
+
if not tap:
|
|
148
|
+
return None
|
|
149
|
+
for row in load_registry_catalog():
|
|
150
|
+
cmd = row.get("self_installing")
|
|
151
|
+
if not cmd:
|
|
152
|
+
continue
|
|
153
|
+
name = row.get("name") or ""
|
|
154
|
+
if tap in (name, name.split("/")[-1]):
|
|
155
|
+
return cmd
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
|
|
134
159
|
def _merge(base: dict, override: dict) -> dict:
|
|
135
160
|
out = deepcopy(base)
|
|
136
161
|
# `or {}`: the only caller feeds this json.loads() of config.json, so a file
|
|
@@ -289,6 +289,25 @@ def _recorded_meta(*, count: bool = False) -> dict:
|
|
|
289
289
|
con.close()
|
|
290
290
|
|
|
291
291
|
|
|
292
|
+
def tap_commits() -> dict[str, str]:
|
|
293
|
+
"""Which registry commit this store holds vectors for, per tap safe-name.
|
|
294
|
+
|
|
295
|
+
The store already records this — ``build`` writes it and ``import_shard``
|
|
296
|
+
updates it — but only as a private meta field, so every caller that wanted
|
|
297
|
+
to ask "are these vectors for the commit I have?" had to re-open the
|
|
298
|
+
database. That question is the whole basis of skipping work: a weekly shard
|
|
299
|
+
refresh is a no-op exactly when the answer is yes, and without an accessor
|
|
300
|
+
the refresh would download and re-import a store's own rows every week.
|
|
301
|
+
|
|
302
|
+
Read without sqlite-vec (see :func:`_recorded_meta`) so a machine that lost
|
|
303
|
+
the extra still gets a truthful answer rather than an empty one.
|
|
304
|
+
"""
|
|
305
|
+
commits = _recorded_meta().get("commits")
|
|
306
|
+
if not isinstance(commits, dict):
|
|
307
|
+
return {}
|
|
308
|
+
return {str(k): str(v) for k, v in commits.items() if v}
|
|
309
|
+
|
|
310
|
+
|
|
292
311
|
# Why dense retrieval isn't serving, keyed by the `reason` status() returns.
|
|
293
312
|
# Each names the ONE next action; the reason order in status() guarantees only
|
|
294
313
|
# the first missing link is ever reported, so these never chain.
|
|
@@ -113,6 +113,18 @@ def tap_refresh_marker() -> Path:
|
|
|
113
113
|
return state_dir() / "last-tap-refresh"
|
|
114
114
|
|
|
115
115
|
|
|
116
|
+
def shard_sync_marker() -> Path:
|
|
117
|
+
"""File whose mtime records when published vectors were last ingested.
|
|
118
|
+
|
|
119
|
+
Deliberately beside the tap marker and NOT under ``cache/``: `boost clean`
|
|
120
|
+
sweeps `cache/*.json` whose stem is not a tap, and a marker there would be
|
|
121
|
+
deleted on every clean — after which search would nag about vectors that
|
|
122
|
+
were refreshed this morning. Same one-`stat` contract as the tap marker,
|
|
123
|
+
for the same reason: search reads it, and search does no network.
|
|
124
|
+
"""
|
|
125
|
+
return state_dir() / "last-shard-sync"
|
|
126
|
+
|
|
127
|
+
|
|
116
128
|
def snapshots_dir() -> Path:
|
|
117
129
|
"""Return the directory for ``snap-*`` store snapshot tarballs."""
|
|
118
130
|
return state_dir() / "snapshots"
|
|
@@ -419,6 +419,27 @@ def unpin(name: str) -> Tap:
|
|
|
419
419
|
return tap
|
|
420
420
|
|
|
421
421
|
|
|
422
|
+
def retarget(name: str, commit: str) -> Tap:
|
|
423
|
+
"""Move an existing tap's clone to `commit` and pin it there.
|
|
424
|
+
|
|
425
|
+
The operation a published-vector refresh needs and no other entry point
|
|
426
|
+
offers. :func:`add` refuses a registry that is already tapped — deliberately
|
|
427
|
+
— so its ``at=`` pin only ever serves a first tap; :func:`update` moves a tap
|
|
428
|
+
to its branch HEAD and ``--force`` moves it and drops the pin. None of the
|
|
429
|
+
three can land on the commit a manifest names, and the chance that HEAD
|
|
430
|
+
happens to be that commit falls with every push upstream, which is why a
|
|
431
|
+
week-old install could see its vectors go stale with no way to act on it
|
|
432
|
+
but re-embedding locally.
|
|
433
|
+
|
|
434
|
+
Checkout first, pin second, and never the reverse: a pin recorded for a
|
|
435
|
+
tree that was not checked out is a lie :func:`update` would then honour by
|
|
436
|
+
skipping the tap forever.
|
|
437
|
+
"""
|
|
438
|
+
tap = get(name)
|
|
439
|
+
gitutil.checkout_commit(tap.path, commit)
|
|
440
|
+
return pin(name, commit)
|
|
441
|
+
|
|
442
|
+
|
|
422
443
|
def remove(name: str) -> Tap:
|
|
423
444
|
"""Deregister a tap and delete its clone and cache file.
|
|
424
445
|
|