boost-skill-cli 1.2.59__tar.gz → 1.2.61__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.59 → boost_skill_cli-1.2.61}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/CLAUDE.md +35 -0
- {boost_skill_cli-1.2.59/boost_skill_cli.egg-info → boost_skill_cli-1.2.61}/PKG-INFO +24 -4
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/README.md +23 -3
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/discovery.py +45 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/pkg.py +107 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/dense.py +19 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/paths.py +12 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/registry.py +21 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/shards.py +133 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61/boost_skill_cli.egg-info}/PKG-INFO +24 -4
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/commands.html +5 -3
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/index.html +4 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bm25-has-no-stemming.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/branch-current-gate.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/browse-could-not-search-two-words.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cli-output-ignored-the-terminal.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-search-rescans-every-vector.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-hooks-host-aware.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-mcp-parity.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-gold-ceiling.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-silver.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/osps-baseline-levels.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/readme-prune-and-search-guide.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/search-and-browse-visual-refresh.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/serve-404-reflected-the-request.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +2 -1
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +2 -2
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +2 -2
- boost_skill_cli-1.2.61/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +62 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap.html +132 -49
- boost_skill_cli-1.2.61/tests/unit/test_cli_update_shards.py +154 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shards.py +7 -1
- boost_skill_cli-1.2.61/tests/unit/test_shards_ingest.py +289 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.gitattributes +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.gitignore +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/.vale.ini +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/DCO +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/LICENSE +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/Makefile +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/codecov.yml +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/README.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/examples/README.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/index.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/noxfile.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/eval_tools.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/setup.cfg +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/README.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/boost.css +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/boost.js +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/style/demo.html +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/eval/tool_calls.jsonl +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_bot_pr_dco.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_eval_tools.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_gstack_coexistence.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcp_read.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.59 → boost_skill_cli-1.2.61}/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.61
|
|
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.61'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 61)
|
|
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`")
|
|
@@ -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
|
|
|
@@ -34,9 +34,11 @@ from __future__ import annotations
|
|
|
34
34
|
import hashlib
|
|
35
35
|
import json
|
|
36
36
|
import os
|
|
37
|
+
import time
|
|
37
38
|
import urllib.error
|
|
38
39
|
import urllib.parse
|
|
39
40
|
import urllib.request
|
|
41
|
+
from contextlib import suppress
|
|
40
42
|
from pathlib import Path
|
|
41
43
|
|
|
42
44
|
from ..errors import BoostError
|
|
@@ -328,6 +330,13 @@ def sync(taps: list[str], commits: dict[str, str],
|
|
|
328
330
|
results.append({"tap": tap, "status": status, "detail": reason,
|
|
329
331
|
"chunks": int(row.get("chunks") or 0)})
|
|
330
332
|
_emit(on_event, tap, status, reason)
|
|
333
|
+
if any(r["status"] == "imported" for r in results):
|
|
334
|
+
# Stamped here as well as in `ingest`, because this is the path a new
|
|
335
|
+
# machine takes: `boost quickstart` imports through `sync`, so without
|
|
336
|
+
# this the marker stays unset for exactly the users the staleness hint
|
|
337
|
+
# is written for, and the one surface that teaches `boost update
|
|
338
|
+
# --shards` exists would never fire on the onboarding path.
|
|
339
|
+
mark_synced()
|
|
331
340
|
return results
|
|
332
341
|
|
|
333
342
|
|
|
@@ -343,3 +352,127 @@ def _size_label(row: dict) -> str:
|
|
|
343
352
|
if not isinstance(size, int) or size <= 0:
|
|
344
353
|
return ""
|
|
345
354
|
return util.human_size(size)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
#: How long published vectors may go un-ingested before `boost search` says so.
|
|
358
|
+
#: The publish cadence is weekly, so this is two missed runs — a hint that fires
|
|
359
|
+
#: the morning after every run is one users learn to read past, and the remedy
|
|
360
|
+
#: it names moves taps, which is not a thing to nag anyone into hourly.
|
|
361
|
+
STALE_SHARDS_DAYS = 14
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def mark_synced() -> None:
|
|
365
|
+
"""Stamp "published vectors were ingested just now"; never fails a run."""
|
|
366
|
+
with suppress(OSError):
|
|
367
|
+
paths.ensure_dirs()
|
|
368
|
+
paths.shard_sync_marker().write_text("", encoding="utf-8")
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def sync_age_days() -> float | None:
|
|
372
|
+
"""Days since published vectors were last ingested, or None if never.
|
|
373
|
+
|
|
374
|
+
None is not zero and not infinity, the same distinction
|
|
375
|
+
``registry.refresh_age_days`` draws: a machine that embedded everything
|
|
376
|
+
locally has never ingested a shard and must not be nagged about the age of
|
|
377
|
+
something it does not use.
|
|
378
|
+
"""
|
|
379
|
+
try:
|
|
380
|
+
age = time.time() - paths.shard_sync_marker().stat().st_mtime
|
|
381
|
+
except OSError:
|
|
382
|
+
return None
|
|
383
|
+
return max(0.0, age / 86400.0)
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
def ingest(taps: list[str], commits: dict[str, str],
|
|
387
|
+
built: dict[str, str] | None = None, manifest: dict | None = None,
|
|
388
|
+
cache_dir: Path | None = None, on_event=None,
|
|
389
|
+
retarget=None) -> list[dict]:
|
|
390
|
+
"""Bring `taps` to the state the published manifest describes.
|
|
391
|
+
|
|
392
|
+
WHICH SIDE IS AUTHORITATIVE is the whole difference from :func:`sync`.
|
|
393
|
+
`sync` takes this machine's commits as given and asks whether a published
|
|
394
|
+
shard happens to match. That is right on the day a machine is set up, and
|
|
395
|
+
wrong a week later: the weekly run republishes against whatever the
|
|
396
|
+
registries have moved to, so for most taps the answer becomes "no", and the
|
|
397
|
+
user is told their vectors are stale with no way to act on it but hours of
|
|
398
|
+
local CPU. `ingest` reads the manifest as the *target*: a row for a tap this
|
|
399
|
+
machine holds at another commit is a reason to move the tap, because the
|
|
400
|
+
commit was pinned to match the vectors in the first place.
|
|
401
|
+
|
|
402
|
+
`built` maps tap name -> the commit this machine's vector store holds for
|
|
403
|
+
it (``dense.tap_commits``), and it is what makes the weekly case free: a tap
|
|
404
|
+
already at the row's commit *with vectors already built there* is skipped
|
|
405
|
+
without downloading anything. Passing only `commits` would re-download a
|
|
406
|
+
store's own rows every week.
|
|
407
|
+
|
|
408
|
+
ORDER IS LOAD-BEARING: download and verify the bytes, and only then move the
|
|
409
|
+
tap. Moving first and failing the download leaves the clone on a commit
|
|
410
|
+
whose vectors are stale but still present — the failure that looks like
|
|
411
|
+
nothing at all, and the one this module exists to refuse. `retarget` is
|
|
412
|
+
injected so the ordering can be tested without a git remote; it defaults to
|
|
413
|
+
``registry.retarget``.
|
|
414
|
+
|
|
415
|
+
Never raises for one tap. A registry that dropped out of the manifest is
|
|
416
|
+
reported "unpublished" and left pinned exactly where it sits — falling back
|
|
417
|
+
to moving it to HEAD would be inventing a target no vectors describe.
|
|
418
|
+
"""
|
|
419
|
+
from . import dense
|
|
420
|
+
manifest = manifest if manifest is not None else fetch_manifest()
|
|
421
|
+
why = incompatible(manifest)
|
|
422
|
+
if why:
|
|
423
|
+
return [{"tap": t, "status": "incompatible", "detail": why,
|
|
424
|
+
"moved": False} for t in taps]
|
|
425
|
+
if retarget is None:
|
|
426
|
+
from . import registry
|
|
427
|
+
retarget = registry.retarget
|
|
428
|
+
index = rows(manifest)
|
|
429
|
+
cache_dir = cache_dir or (paths.cache_dir() / "shards")
|
|
430
|
+
built = built or {}
|
|
431
|
+
results: list[dict] = []
|
|
432
|
+
for tap in taps:
|
|
433
|
+
row = index.get(tap)
|
|
434
|
+
if row is None:
|
|
435
|
+
results.append({"tap": tap, "status": "unpublished", "moved": False})
|
|
436
|
+
_emit(on_event, tap, "unpublished", "")
|
|
437
|
+
continue
|
|
438
|
+
want = str(row.get("commit") or "")
|
|
439
|
+
local = commits.get(tap, "")
|
|
440
|
+
if want and local == want == built.get(tap, ""):
|
|
441
|
+
results.append({"tap": tap, "status": "current", "moved": False})
|
|
442
|
+
_emit(on_event, tap, "current", "")
|
|
443
|
+
continue
|
|
444
|
+
dest = cache_dir / (tap.replace("/", "__") + ".shard.json")
|
|
445
|
+
moved = False
|
|
446
|
+
try:
|
|
447
|
+
_emit(on_event, tap, "downloading", _size_label(row))
|
|
448
|
+
download(row, dest, manifest)
|
|
449
|
+
shard = json.loads(dest.read_text(encoding="utf-8"))
|
|
450
|
+
if local != want:
|
|
451
|
+
_emit(on_event, tap, "moving", want[:7])
|
|
452
|
+
retarget(tap, want)
|
|
453
|
+
moved = True
|
|
454
|
+
ok, reason = dense.import_shard(shard, commit=want)
|
|
455
|
+
except BoostError as exc:
|
|
456
|
+
results.append({"tap": tap, "status": "failed", "moved": moved,
|
|
457
|
+
"detail": exc.message})
|
|
458
|
+
_emit(on_event, tap, "failed", exc.message)
|
|
459
|
+
continue
|
|
460
|
+
except (OSError, json.JSONDecodeError) as exc:
|
|
461
|
+
results.append({"tap": tap, "status": "failed", "moved": moved,
|
|
462
|
+
"detail": str(exc)})
|
|
463
|
+
_emit(on_event, tap, "failed", str(exc))
|
|
464
|
+
continue
|
|
465
|
+
finally:
|
|
466
|
+
# The shard is a transfer format, not a cache — see `sync`.
|
|
467
|
+
dest.unlink(missing_ok=True)
|
|
468
|
+
status = "imported" if ok else "failed"
|
|
469
|
+
results.append({"tap": tap, "status": status, "detail": reason,
|
|
470
|
+
"moved": moved, "chunks": int(row.get("chunks") or 0)})
|
|
471
|
+
_emit(on_event, tap, status, reason)
|
|
472
|
+
if any(r["status"] in ("imported", "current") for r in results):
|
|
473
|
+
# Stamped for "the manifest was read and acted on", not for "something
|
|
474
|
+
# changed": a run where every tap was already current is the successful
|
|
475
|
+
# weekly case, and leaving the marker cold would make search nag about
|
|
476
|
+
# vectors refreshed this morning.
|
|
477
|
+
mark_synced()
|
|
478
|
+
return results
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.61
|
|
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.
|
|
@@ -479,6 +479,7 @@ docs/roadmap/items/update-refreshes-rules-and-workflows.md
|
|
|
479
479
|
docs/roadmap/items/update-reinstall-widens-agent-scope.md
|
|
480
480
|
docs/roadmap/items/vex-openvex-feed.md
|
|
481
481
|
docs/roadmap/items/visual-regression-pass-on-the-guide.md
|
|
482
|
+
docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md
|
|
482
483
|
docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md
|
|
483
484
|
docs/roadmap/items/windows-in-the-ci-matrix.md
|
|
484
485
|
docs/roadmap/items/wire-bdd-suite-into-ci.md
|
|
@@ -672,6 +673,7 @@ tests/unit/test_check_licenses.py
|
|
|
672
673
|
tests/unit/test_check_reproducible.py
|
|
673
674
|
tests/unit/test_claude_settings.py
|
|
674
675
|
tests/unit/test_clean_internal_cache.py
|
|
676
|
+
tests/unit/test_cli_update_shards.py
|
|
675
677
|
tests/unit/test_cliparse.py
|
|
676
678
|
tests/unit/test_codeql_analysis_key.py
|
|
677
679
|
tests/unit/test_command_reference_fresh.py
|
|
@@ -792,6 +794,7 @@ tests/unit/test_serve_docs.py
|
|
|
792
794
|
tests/unit/test_shard_plan.py
|
|
793
795
|
tests/unit/test_shards.py
|
|
794
796
|
tests/unit/test_shards_incremental.py
|
|
797
|
+
tests/unit/test_shards_ingest.py
|
|
795
798
|
tests/unit/test_shards_matrix.py
|
|
796
799
|
tests/unit/test_smoke_covers_every_command.py
|
|
797
800
|
tests/unit/test_spdx_headers.py
|