boost-skill-cli 1.0.450__tar.gz → 1.0.451__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.0.450 → boost_skill_cli-1.0.451}/.vale/styles/config/vocabularies/boost/accept.txt +1 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/CLAUDE.md +1 -1
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/PKG-INFO +29 -4
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/README.md +28 -3
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/cli.py +1 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/taps.py +64 -0
- boost_skill_cli-1.0.451/boost_cli/core/catalogbundle.py +265 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_skill_cli.egg-info/PKG-INFO +29 -4
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_skill_cli.egg-info/SOURCES.txt +4 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel.html +2 -2
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/commands.html +15 -2
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/index.html +4 -3
- boost_skill_cli-1.0.451/docs/roadmap/items/shareable-catalogue-bundle.md +65 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap.html +63 -1
- boost_skill_cli-1.0.451/tests/functional/test_cli_catalog.py +190 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_everyday_loop.py +1 -1
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/smoke.sh +1 -0
- boost_skill_cli-1.0.451/tests/unit/test_catalogbundle.py +405 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_errors_and_cli_table.py +6 -6
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.gitattributes +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.gitignore +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/.vale.ini +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/LICENSE +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/Makefile +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/codecov.yml +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/langchain.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/README.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/examples/README.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/index.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/noxfile.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/setup.cfg +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/style/README.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/style/boost.css +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/style/boost.js +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/style/demo.html +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.450 → boost_skill_cli-1.0.451}/tests/visual/visual_check.mjs +0 -0
|
@@ -233,7 +233,7 @@ for both — edit items, run `build_roadmap.py`, never touch the HTML by hand.
|
|
|
233
233
|
## Architecture
|
|
234
234
|
|
|
235
235
|
**CLI dispatch.** `boost_cli/cli.py` holds `COMMANDS`, the single
|
|
236
|
-
source-of-truth list of `(name, group, module, summary)` for all
|
|
236
|
+
source-of-truth list of `(name, group, module, summary)` for all 79 commands.
|
|
237
237
|
Each command is implemented as `def cmd_<name_with_underscores>(argv) -> int`
|
|
238
238
|
inside `boost_cli/commands/<module>.py`, and `_dispatch` imports that module
|
|
239
239
|
lazily on invocation — so `boost --help` stays instant and command modules are
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.451
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -854,6 +854,31 @@ boost tap --catalog --category rag # RAG / vector-search skill packs
|
|
|
854
854
|
boost tap --catalog --category security # filter by category
|
|
855
855
|
```
|
|
856
856
|
|
|
857
|
+
### Share the catalogue instead of re-tapping it
|
|
858
|
+
|
|
859
|
+
Tapping is the slowest thing a new install does, and the expensive artifact is
|
|
860
|
+
not the valuable one. On a machine with **458 registries** tapped, the shallow
|
|
861
|
+
clones are **12 GB** — while the catalogue they produce, the JSON boost actually
|
|
862
|
+
searches, is **10.9 MB** gzipped. So hand someone the catalogue:
|
|
863
|
+
|
|
864
|
+
```bash
|
|
865
|
+
boost catalog --export catalogue.tgz # 458 taps · 59,972 entries · 10.9 MB
|
|
866
|
+
boost catalog --show catalogue.tgz # what is in it, without importing
|
|
867
|
+
boost catalog --import catalogue.tgz # on the other machine
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
Measured on a fresh `HOME`: import takes **0.3 s**, `boost reindex` a further
|
|
871
|
+
**3.8 s**, and `boost search` then returns real hits over all 59,972 items with
|
|
872
|
+
**zero repositories cloned**. `install` still clones — but only the one registry
|
|
873
|
+
the skill you chose actually lives in, instead of all 458 up front.
|
|
874
|
+
|
|
875
|
+
Bundles carry catalogue JSON and nothing else. The derived indexes are excluded
|
|
876
|
+
(they are 3.8 GB of a 3.9 GB cache directory and rebuild in seconds), and
|
|
877
|
+
vectors are excluded because they are only valid inside the embedding space that
|
|
878
|
+
made them — `boost reindex --export-shard` is the path for those, with the
|
|
879
|
+
provenance checks a bundle deliberately does not try to carry. Import **merges**,
|
|
880
|
+
so it never silently drops taps the receiving machine already had.
|
|
881
|
+
|
|
857
882
|
boost indexes three item kinds out of the same registries: `SKILL.md` **skills**,
|
|
858
883
|
`.mdc`/`.cursorrules`/`.windsurfrules` **rules**, and command/agent **workflows**
|
|
859
884
|
(Markdown under `commands/`·`agents/`·`workflows/`, or carrying subagent
|
|
@@ -946,7 +971,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
|
|
|
946
971
|
boost bundle dump > Boostfile # everyone else runs: boost bundle install
|
|
947
972
|
```
|
|
948
973
|
|
|
949
|
-
##
|
|
974
|
+
## 79 commands, organized into 8 groups
|
|
950
975
|
|
|
951
976
|
`boost --help` prints the full grouped command list; for a visual tour see
|
|
952
977
|
[`docs/index.html`](docs/index.html), and for every flag of every command see
|
|
@@ -1160,8 +1185,8 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
|
|
|
1160
1185
|
|
|
1161
1186
|
| Layer | What it does | Gate |
|
|
1162
1187
|
|---|---|---|
|
|
1163
|
-
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all
|
|
1164
|
-
| `make smoke` | `tests/smoke.sh` —
|
|
1188
|
+
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
1189
|
+
| `make smoke` | `tests/smoke.sh` — 175 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
1165
1190
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
1166
1191
|
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
1167
1192
|
|
|
@@ -136,6 +136,31 @@ boost tap --catalog --category rag # RAG / vector-search skill packs
|
|
|
136
136
|
boost tap --catalog --category security # filter by category
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
+
### Share the catalogue instead of re-tapping it
|
|
140
|
+
|
|
141
|
+
Tapping is the slowest thing a new install does, and the expensive artifact is
|
|
142
|
+
not the valuable one. On a machine with **458 registries** tapped, the shallow
|
|
143
|
+
clones are **12 GB** — while the catalogue they produce, the JSON boost actually
|
|
144
|
+
searches, is **10.9 MB** gzipped. So hand someone the catalogue:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
boost catalog --export catalogue.tgz # 458 taps · 59,972 entries · 10.9 MB
|
|
148
|
+
boost catalog --show catalogue.tgz # what is in it, without importing
|
|
149
|
+
boost catalog --import catalogue.tgz # on the other machine
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Measured on a fresh `HOME`: import takes **0.3 s**, `boost reindex` a further
|
|
153
|
+
**3.8 s**, and `boost search` then returns real hits over all 59,972 items with
|
|
154
|
+
**zero repositories cloned**. `install` still clones — but only the one registry
|
|
155
|
+
the skill you chose actually lives in, instead of all 458 up front.
|
|
156
|
+
|
|
157
|
+
Bundles carry catalogue JSON and nothing else. The derived indexes are excluded
|
|
158
|
+
(they are 3.8 GB of a 3.9 GB cache directory and rebuild in seconds), and
|
|
159
|
+
vectors are excluded because they are only valid inside the embedding space that
|
|
160
|
+
made them — `boost reindex --export-shard` is the path for those, with the
|
|
161
|
+
provenance checks a bundle deliberately does not try to carry. Import **merges**,
|
|
162
|
+
so it never silently drops taps the receiving machine already had.
|
|
163
|
+
|
|
139
164
|
boost indexes three item kinds out of the same registries: `SKILL.md` **skills**,
|
|
140
165
|
`.mdc`/`.cursorrules`/`.windsurfrules` **rules**, and command/agent **workflows**
|
|
141
166
|
(Markdown under `commands/`·`agents/`·`workflows/`, or carrying subagent
|
|
@@ -228,7 +253,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
|
|
|
228
253
|
boost bundle dump > Boostfile # everyone else runs: boost bundle install
|
|
229
254
|
```
|
|
230
255
|
|
|
231
|
-
##
|
|
256
|
+
## 79 commands, organized into 8 groups
|
|
232
257
|
|
|
233
258
|
`boost --help` prints the full grouped command list; for a visual tour see
|
|
234
259
|
[`docs/index.html`](docs/index.html), and for every flag of every command see
|
|
@@ -442,8 +467,8 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
|
|
|
442
467
|
|
|
443
468
|
| Layer | What it does | Gate |
|
|
444
469
|
|---|---|---|
|
|
445
|
-
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all
|
|
446
|
-
| `make smoke` | `tests/smoke.sh` —
|
|
470
|
+
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
471
|
+
| `make smoke` | `tests/smoke.sh` — 175 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
447
472
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
448
473
|
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
449
474
|
|
|
@@ -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.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.451'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 451)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -87,6 +87,7 @@ COMMANDS = [
|
|
|
87
87
|
("untap", "tap", "taps", "Remove a registry tap"),
|
|
88
88
|
("taps", "tap", "taps", "List all configured registry taps"),
|
|
89
89
|
("outdated", "tap", "taps", "Show skills with available updates"),
|
|
90
|
+
("catalog", "tap", "taps", "Share the tapped catalogue so others skip the clone"),
|
|
90
91
|
# Intelligence (8)
|
|
91
92
|
("chat", "ai", "intelligence", "Ask about skills in plain language (RAG-grounded)"),
|
|
92
93
|
("distill", "ai", "intelligence", "Merge multiple skills into one deduplicated skill"),
|
|
@@ -5,6 +5,7 @@ import argparse
|
|
|
5
5
|
import hashlib
|
|
6
6
|
import json
|
|
7
7
|
from contextlib import suppress
|
|
8
|
+
from pathlib import Path
|
|
8
9
|
|
|
9
10
|
from .. import cliparse, spin
|
|
10
11
|
from ..core import (
|
|
@@ -317,3 +318,66 @@ def cmd_outdated(argv) -> int:
|
|
|
317
318
|
out.dim("%d outdated · `boost update` upgrades (pinned items stay put)"
|
|
318
319
|
% len(results))
|
|
319
320
|
return 0
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def cmd_catalog(argv) -> int:
|
|
324
|
+
"""boost catalog --export FILE | --import FILE [--json]"""
|
|
325
|
+
p = cliparse.parser(
|
|
326
|
+
prog="boost catalog",
|
|
327
|
+
description="Share the tapped catalogue so others skip the clone")
|
|
328
|
+
mode = p.add_mutually_exclusive_group(required=True)
|
|
329
|
+
mode.add_argument("--export", metavar="FILE",
|
|
330
|
+
help="write every tapped registry's catalogue to FILE")
|
|
331
|
+
mode.add_argument("--import", metavar="FILE", dest="import_",
|
|
332
|
+
help="merge a catalogue bundle into this machine")
|
|
333
|
+
mode.add_argument("--show", metavar="FILE",
|
|
334
|
+
help="describe a bundle without importing it")
|
|
335
|
+
p.add_argument("--json", action="store_true", dest="as_json",
|
|
336
|
+
help="machine-readable output")
|
|
337
|
+
args = p.parse_args(argv)
|
|
338
|
+
|
|
339
|
+
from ..core import catalogbundle
|
|
340
|
+
|
|
341
|
+
if args.show:
|
|
342
|
+
manifest = catalogbundle.read_manifest(Path(args.show))
|
|
343
|
+
if args.as_json:
|
|
344
|
+
print(json.dumps(manifest, indent=2))
|
|
345
|
+
return 0
|
|
346
|
+
out.heading("catalogue bundle %s" % args.show)
|
|
347
|
+
out.info("built %s · %d taps · %s entries"
|
|
348
|
+
% (manifest.get("generated", "?"),
|
|
349
|
+
len(manifest.get("taps") or []),
|
|
350
|
+
"{:,}".format(int(manifest.get("entries") or 0))))
|
|
351
|
+
rows = [(t.get("name", "?"), str(t.get("entries", "?")),
|
|
352
|
+
(t.get("commit") or "")[:7])
|
|
353
|
+
for t in (manifest.get("taps") or [])[:20]]
|
|
354
|
+
if rows:
|
|
355
|
+
out.table(rows, headers=("TAP", "ENTRIES", "COMMIT"))
|
|
356
|
+
return 0
|
|
357
|
+
|
|
358
|
+
if args.export:
|
|
359
|
+
stats = catalogbundle.export_bundle(Path(args.export))
|
|
360
|
+
if args.as_json:
|
|
361
|
+
print(json.dumps(stats, indent=2))
|
|
362
|
+
return 0
|
|
363
|
+
out.ok("packed %d taps · %s entries · %.1f MB → %s"
|
|
364
|
+
% (stats["taps"], "{:,}".format(stats["entries"]),
|
|
365
|
+
stats["bytes"] / 1e6, stats["path"]))
|
|
366
|
+
if stats["skipped"]:
|
|
367
|
+
# Configured but not yet built. Named rather than counted: the
|
|
368
|
+
# reader needs to know WHICH registry the receiver will not get.
|
|
369
|
+
out.warn("skipped %d tap(s) with no built catalogue: %s"
|
|
370
|
+
% (len(stats["skipped"]), ", ".join(stats["skipped"][:5])))
|
|
371
|
+
out.dim("the receiver runs `boost catalog --import <file>` — no clone, "
|
|
372
|
+
"no re-tap")
|
|
373
|
+
return 0
|
|
374
|
+
|
|
375
|
+
stats = catalogbundle.import_bundle(Path(args.import_))
|
|
376
|
+
if args.as_json:
|
|
377
|
+
print(json.dumps(stats, indent=2))
|
|
378
|
+
return 0
|
|
379
|
+
out.ok("imported %d catalogue file(s) · %s entries · %d new tap(s)"
|
|
380
|
+
% (stats["files"], "{:,}".format(stats["entries"]), stats["added"]))
|
|
381
|
+
out.dim("`boost search` works now; `boost install` clones just the one "
|
|
382
|
+
"registry it needs")
|
|
383
|
+
return 0
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"""A portable catalogue bundle: everything `boost tap` produces, minus the clone.
|
|
2
|
+
|
|
3
|
+
WHY THIS EXISTS. `boost tap --defaults` is the slowest thing a new install does,
|
|
4
|
+
and almost none of the cost is the part anyone needs. Measured on a real
|
|
5
|
+
machine with **459 registries tapped**: the shallow clones are **12 GB**, while
|
|
6
|
+
the catalogue they produce — the JSON boost actually searches — is **101.1 MB**,
|
|
7
|
+
and **11.1 MB** gzipped. Search works from that catalogue with no clone present
|
|
8
|
+
at all.
|
|
9
|
+
|
|
10
|
+
So the expensive artifact is not the valuable one, and the valuable one fits in
|
|
11
|
+
an email. This module packs it.
|
|
12
|
+
|
|
13
|
+
WHAT IS DELIBERATELY NOT IN IT.
|
|
14
|
+
|
|
15
|
+
* The **derived indexes**. `rag_index.json`, `rag_postings.sqlite` and
|
|
16
|
+
`rag_vectors.sqlite` are 3.8 GB of that machine's 3.9 GB cache directory, and
|
|
17
|
+
they rebuild from the catalogue in seconds. Vectors additionally are only
|
|
18
|
+
meaningful inside the embedding space that produced them, which is why
|
|
19
|
+
`dense.export_shard` carries provider/model/dim/commit and `import_shard`
|
|
20
|
+
refuses a mismatch. This format carries none of that and must not pretend to:
|
|
21
|
+
shards are the reviewed path for vectors.
|
|
22
|
+
* The **repositories**. A bundle makes a catalogue searchable, not installable —
|
|
23
|
+
`install` copies files out of a clone. Every tap's URL rides in the manifest
|
|
24
|
+
precisely so the receiving machine can clone the one repo it ends up wanting,
|
|
25
|
+
instead of all 459 up front.
|
|
26
|
+
|
|
27
|
+
The archive is a gzipped tar of `manifest.json` plus `catalog/<safe_name>.json`,
|
|
28
|
+
one per tap, byte-identical to what `catalog.build_cache` wrote.
|
|
29
|
+
|
|
30
|
+
SECURITY. A bundle is a file people send each other, which makes it untrusted
|
|
31
|
+
input in the most ordinary way there is, and tar member names are the classic
|
|
32
|
+
path-traversal vector. Extraction here never lets the archive choose a
|
|
33
|
+
destination: member names are validated, then the bytes are written to a path
|
|
34
|
+
this module builds from the basename. See `_safe_members`.
|
|
35
|
+
"""
|
|
36
|
+
from __future__ import annotations
|
|
37
|
+
|
|
38
|
+
import json
|
|
39
|
+
import tarfile
|
|
40
|
+
import time
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
|
|
43
|
+
from ..errors import BoostError
|
|
44
|
+
from . import config, paths, registry
|
|
45
|
+
|
|
46
|
+
#: Bump when the layout changes incompatibly. An importer that cannot say what
|
|
47
|
+
#: it is looking at cannot refuse anything.
|
|
48
|
+
BUNDLE_FORMAT = 1
|
|
49
|
+
|
|
50
|
+
MANIFEST_NAME = "manifest.json"
|
|
51
|
+
#: Every catalogue file lives under this prefix; anything else is refused.
|
|
52
|
+
CATALOG_PREFIX = "catalog/"
|
|
53
|
+
|
|
54
|
+
#: Caps, so a hostile archive cannot exhaust the disk. Both are generous
|
|
55
|
+
#: against real data — the 459-tap export is 460 members and its largest
|
|
56
|
+
#: catalogue file is 14 MB — and both are monkeypatched low in the tests,
|
|
57
|
+
#: because a limit nothing ever reaches is a limit nothing has tested.
|
|
58
|
+
MAX_MEMBERS = 5000
|
|
59
|
+
MAX_MEMBER_BYTES = 256 * 1024 * 1024
|
|
60
|
+
|
|
61
|
+
def export_bundle(dest: Path) -> dict:
|
|
62
|
+
"""Pack every tapped registry's catalogue into ``dest``. Returns stats.
|
|
63
|
+
|
|
64
|
+
Driven by the **tap list**, not by a scan of the cache directory, and that
|
|
65
|
+
is what keeps the derived indexes out rather than any filename filter: a
|
|
66
|
+
file only becomes a candidate by being named ``<safe_name>.json`` for a
|
|
67
|
+
configured tap, so ``rag_vectors.sqlite`` is never considered in the first
|
|
68
|
+
place. It also means a stale catalogue left behind by an untapped registry
|
|
69
|
+
is not exported. An earlier revision carried an ``_is_catalogue_file``
|
|
70
|
+
predicate for this and never called it — dead code that made the
|
|
71
|
+
accompanying test pass for a reason that had nothing to do with the filter.
|
|
72
|
+
|
|
73
|
+
A configured tap with no cache file yet is **skipped, not fatal**: taps are
|
|
74
|
+
built one at a time, and refusing to export the other 458 because one is
|
|
75
|
+
mid-build would make this unusable exactly when it is most wanted. The
|
|
76
|
+
skipped names come back in the stats so the caller can say so.
|
|
77
|
+
|
|
78
|
+
Exporting nothing raises instead, because an empty bundle is
|
|
79
|
+
indistinguishable from a working one until someone imports it.
|
|
80
|
+
"""
|
|
81
|
+
dest = Path(dest)
|
|
82
|
+
taps = registry.list_taps()
|
|
83
|
+
packed: list[dict] = []
|
|
84
|
+
skipped: list[str] = []
|
|
85
|
+
entries = 0
|
|
86
|
+
|
|
87
|
+
for tap in taps:
|
|
88
|
+
cache_file = paths.cache_dir() / ("%s.json" % tap.safe_name)
|
|
89
|
+
if not cache_file.is_file():
|
|
90
|
+
skipped.append(tap.name)
|
|
91
|
+
continue
|
|
92
|
+
try:
|
|
93
|
+
data = json.loads(cache_file.read_text(encoding="utf-8"))
|
|
94
|
+
except (OSError, json.JSONDecodeError):
|
|
95
|
+
skipped.append(tap.name)
|
|
96
|
+
continue
|
|
97
|
+
count = len(data.get("skills") or [])
|
|
98
|
+
entries += count
|
|
99
|
+
packed.append({"name": tap.name, "url": tap.url,
|
|
100
|
+
"curated": tap.curated,
|
|
101
|
+
"commit": str(data.get("commit") or ""),
|
|
102
|
+
"entries": count,
|
|
103
|
+
"file": "%s.json" % tap.safe_name})
|
|
104
|
+
|
|
105
|
+
if not packed:
|
|
106
|
+
raise BoostError(
|
|
107
|
+
"nothing to export — no tapped registry has a built catalogue",
|
|
108
|
+
hint="tap a registry first, e.g. `boost tap --defaults`")
|
|
109
|
+
|
|
110
|
+
manifest = {
|
|
111
|
+
"format": BUNDLE_FORMAT,
|
|
112
|
+
"generated": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
|
|
113
|
+
"taps": packed,
|
|
114
|
+
"entries": entries,
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
118
|
+
try:
|
|
119
|
+
with tarfile.open(dest, "w:gz") as tar:
|
|
120
|
+
_add_bytes(tar, MANIFEST_NAME,
|
|
121
|
+
json.dumps(manifest, indent=1).encode("utf-8"))
|
|
122
|
+
for row in packed:
|
|
123
|
+
src = paths.cache_dir() / row["file"]
|
|
124
|
+
tar.add(str(src), arcname=CATALOG_PREFIX + row["file"])
|
|
125
|
+
except OSError as exc:
|
|
126
|
+
raise BoostError("cannot write bundle %s: %s" % (dest, exc)) from exc
|
|
127
|
+
|
|
128
|
+
return {"path": str(dest), "taps": len(packed), "entries": entries,
|
|
129
|
+
"skipped": skipped, "bytes": dest.stat().st_size}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _add_bytes(tar: tarfile.TarFile, name: str, data: bytes) -> None:
|
|
133
|
+
"""Add an in-memory file to ``tar`` (used for the manifest)."""
|
|
134
|
+
import io
|
|
135
|
+
info = tarfile.TarInfo(name)
|
|
136
|
+
info.size = len(data)
|
|
137
|
+
info.mtime = 0 # reproducible: same catalogue, same bytes
|
|
138
|
+
tar.addfile(info, io.BytesIO(data))
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def read_manifest(src: Path) -> dict:
|
|
142
|
+
"""The manifest of ``src``, without extracting anything else."""
|
|
143
|
+
src = Path(src)
|
|
144
|
+
if not src.is_file():
|
|
145
|
+
raise BoostError("no such bundle: %s" % src)
|
|
146
|
+
try:
|
|
147
|
+
with tarfile.open(src, "r:gz") as tar:
|
|
148
|
+
member = tar.getmember(MANIFEST_NAME)
|
|
149
|
+
if not member.isfile():
|
|
150
|
+
raise BoostError("bundle manifest is not a file: %s" % src)
|
|
151
|
+
handle = tar.extractfile(member)
|
|
152
|
+
if handle is None:
|
|
153
|
+
raise BoostError("bundle manifest is unreadable: %s" % src)
|
|
154
|
+
return json.loads(handle.read().decode("utf-8"))
|
|
155
|
+
except KeyError as exc:
|
|
156
|
+
raise BoostError(
|
|
157
|
+
"%s is not a boost catalogue bundle (no %s)" % (src, MANIFEST_NAME),
|
|
158
|
+
hint="create one with `boost catalog --export <file>`") from exc
|
|
159
|
+
except (tarfile.TarError, OSError) as exc:
|
|
160
|
+
raise BoostError("cannot read bundle %s: %s" % (src, exc)) from exc
|
|
161
|
+
except (json.JSONDecodeError, UnicodeDecodeError) as exc:
|
|
162
|
+
raise BoostError("bundle manifest is malformed: %s" % exc) from exc
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _safe_members(tar: tarfile.TarFile) -> list[tarfile.TarInfo]:
|
|
166
|
+
"""The catalogue members of ``tar``, or raise naming what was rejected.
|
|
167
|
+
|
|
168
|
+
The archive never chooses a destination. A member is accepted only when it
|
|
169
|
+
is a regular file directly under ``catalog/`` whose name is a plain
|
|
170
|
+
basename — no separators, no ``..``, no leading ``/``, no symlink or device
|
|
171
|
+
entry — and the caller then writes it to a path built from that basename.
|
|
172
|
+
Validating the name and *also* discarding it is deliberate: a check that
|
|
173
|
+
feeds its input forward is one refactor away from being decorative.
|
|
174
|
+
"""
|
|
175
|
+
members = tar.getmembers()
|
|
176
|
+
if len(members) > MAX_MEMBERS:
|
|
177
|
+
raise BoostError(
|
|
178
|
+
"bundle has %d members, over the %d cap"
|
|
179
|
+
% (len(members), MAX_MEMBERS),
|
|
180
|
+
hint="this is not a catalogue export — check where it came from")
|
|
181
|
+
|
|
182
|
+
picked: list[tarfile.TarInfo] = []
|
|
183
|
+
for member in members:
|
|
184
|
+
if member.name == MANIFEST_NAME:
|
|
185
|
+
continue
|
|
186
|
+
if not member.isfile():
|
|
187
|
+
# Symlinks and hardlinks are how an archive writes outside its own
|
|
188
|
+
# tree without any name containing "..".
|
|
189
|
+
raise BoostError(
|
|
190
|
+
"bundle contains a non-regular entry: %s" % member.name,
|
|
191
|
+
hint="a catalogue bundle holds only JSON files")
|
|
192
|
+
if not member.name.startswith(CATALOG_PREFIX):
|
|
193
|
+
raise BoostError(
|
|
194
|
+
"bundle contains an entry outside %s: %s"
|
|
195
|
+
% (CATALOG_PREFIX, member.name))
|
|
196
|
+
leaf = member.name[len(CATALOG_PREFIX):]
|
|
197
|
+
if (not leaf or leaf != Path(leaf).name or leaf.startswith(".")
|
|
198
|
+
or "/" in leaf or "\\" in leaf or not leaf.endswith(".json")):
|
|
199
|
+
raise BoostError(
|
|
200
|
+
"bundle contains an unsafe member name: %s" % member.name)
|
|
201
|
+
if member.size > MAX_MEMBER_BYTES:
|
|
202
|
+
raise BoostError(
|
|
203
|
+
"bundle member %s is %d bytes, over the %d cap"
|
|
204
|
+
% (member.name, member.size, MAX_MEMBER_BYTES))
|
|
205
|
+
picked.append(member)
|
|
206
|
+
return picked
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def import_bundle(src: Path) -> dict:
|
|
210
|
+
"""Restore a catalogue bundle into this machine. Returns stats.
|
|
211
|
+
|
|
212
|
+
**Merges, never replaces.** The receiving machine may already have taps of
|
|
213
|
+
its own, and silently dropping them would be a worse outcome than the slow
|
|
214
|
+
tap this feature exists to avoid. A tap already configured keeps its
|
|
215
|
+
existing entry; its catalogue file is overwritten, which is the point.
|
|
216
|
+
"""
|
|
217
|
+
src = Path(src)
|
|
218
|
+
manifest = read_manifest(src)
|
|
219
|
+
|
|
220
|
+
fmt = manifest.get("format")
|
|
221
|
+
if fmt != BUNDLE_FORMAT:
|
|
222
|
+
raise BoostError(
|
|
223
|
+
"bundle format %r is not supported (this boost reads %d)"
|
|
224
|
+
% (fmt, BUNDLE_FORMAT),
|
|
225
|
+
hint="upgrade boost, or re-export the bundle with this version")
|
|
226
|
+
|
|
227
|
+
paths.ensure_dirs()
|
|
228
|
+
written = 0
|
|
229
|
+
try:
|
|
230
|
+
with tarfile.open(src, "r:gz") as tar:
|
|
231
|
+
members = _safe_members(tar)
|
|
232
|
+
for member in members:
|
|
233
|
+
handle = tar.extractfile(member)
|
|
234
|
+
if handle is None:
|
|
235
|
+
continue
|
|
236
|
+
leaf = Path(member.name).name
|
|
237
|
+
# The destination is built here, from the basename, so the
|
|
238
|
+
# archive cannot influence it even if a check above is wrong.
|
|
239
|
+
target = paths.cache_dir() / leaf
|
|
240
|
+
target.write_bytes(handle.read(MAX_MEMBER_BYTES + 1))
|
|
241
|
+
written += 1
|
|
242
|
+
except (tarfile.TarError, OSError) as exc:
|
|
243
|
+
raise BoostError("cannot read bundle %s: %s" % (src, exc)) from exc
|
|
244
|
+
|
|
245
|
+
cfg = config.load()
|
|
246
|
+
existing = cfg.get("taps") or []
|
|
247
|
+
if not isinstance(existing, list):
|
|
248
|
+
existing = []
|
|
249
|
+
known = {t.get("name") for t in existing if isinstance(t, dict)}
|
|
250
|
+
added = 0
|
|
251
|
+
for row in manifest.get("taps") or []:
|
|
252
|
+
name = row.get("name")
|
|
253
|
+
if not name or name in known:
|
|
254
|
+
continue
|
|
255
|
+
existing.append({"name": name, "url": row.get("url", ""),
|
|
256
|
+
"curated": bool(row.get("curated"))})
|
|
257
|
+
known.add(name)
|
|
258
|
+
added += 1
|
|
259
|
+
cfg["taps"] = existing
|
|
260
|
+
config.save(cfg)
|
|
261
|
+
|
|
262
|
+
return {"path": str(src), "taps": len(manifest.get("taps") or []),
|
|
263
|
+
"added": added, "files": written,
|
|
264
|
+
"entries": int(manifest.get("entries") or 0),
|
|
265
|
+
"generated": manifest.get("generated", "")}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.451
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -854,6 +854,31 @@ boost tap --catalog --category rag # RAG / vector-search skill packs
|
|
|
854
854
|
boost tap --catalog --category security # filter by category
|
|
855
855
|
```
|
|
856
856
|
|
|
857
|
+
### Share the catalogue instead of re-tapping it
|
|
858
|
+
|
|
859
|
+
Tapping is the slowest thing a new install does, and the expensive artifact is
|
|
860
|
+
not the valuable one. On a machine with **458 registries** tapped, the shallow
|
|
861
|
+
clones are **12 GB** — while the catalogue they produce, the JSON boost actually
|
|
862
|
+
searches, is **10.9 MB** gzipped. So hand someone the catalogue:
|
|
863
|
+
|
|
864
|
+
```bash
|
|
865
|
+
boost catalog --export catalogue.tgz # 458 taps · 59,972 entries · 10.9 MB
|
|
866
|
+
boost catalog --show catalogue.tgz # what is in it, without importing
|
|
867
|
+
boost catalog --import catalogue.tgz # on the other machine
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
Measured on a fresh `HOME`: import takes **0.3 s**, `boost reindex` a further
|
|
871
|
+
**3.8 s**, and `boost search` then returns real hits over all 59,972 items with
|
|
872
|
+
**zero repositories cloned**. `install` still clones — but only the one registry
|
|
873
|
+
the skill you chose actually lives in, instead of all 458 up front.
|
|
874
|
+
|
|
875
|
+
Bundles carry catalogue JSON and nothing else. The derived indexes are excluded
|
|
876
|
+
(they are 3.8 GB of a 3.9 GB cache directory and rebuild in seconds), and
|
|
877
|
+
vectors are excluded because they are only valid inside the embedding space that
|
|
878
|
+
made them — `boost reindex --export-shard` is the path for those, with the
|
|
879
|
+
provenance checks a bundle deliberately does not try to carry. Import **merges**,
|
|
880
|
+
so it never silently drops taps the receiving machine already had.
|
|
881
|
+
|
|
857
882
|
boost indexes three item kinds out of the same registries: `SKILL.md` **skills**,
|
|
858
883
|
`.mdc`/`.cursorrules`/`.windsurfrules` **rules**, and command/agent **workflows**
|
|
859
884
|
(Markdown under `commands/`·`agents/`·`workflows/`, or carrying subagent
|
|
@@ -946,7 +971,7 @@ boost doctor # sanity check: broken links, lock drift, stale taps
|
|
|
946
971
|
boost bundle dump > Boostfile # everyone else runs: boost bundle install
|
|
947
972
|
```
|
|
948
973
|
|
|
949
|
-
##
|
|
974
|
+
## 79 commands, organized into 8 groups
|
|
950
975
|
|
|
951
976
|
`boost --help` prints the full grouped command list; for a visual tour see
|
|
952
977
|
[`docs/index.html`](docs/index.html), and for every flag of every command see
|
|
@@ -1160,8 +1185,8 @@ Four layers, all enforced (`make check` runs the full set; CI runs the same thin
|
|
|
1160
1185
|
|
|
1161
1186
|
| Layer | What it does | Gate |
|
|
1162
1187
|
|---|---|---|
|
|
1163
|
-
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all
|
|
1164
|
-
| `make smoke` | `tests/smoke.sh` —
|
|
1188
|
+
| `make test` | pytest across `tests/unit/` (every core module) and `tests/functional/` (drives all 79 commands in-process against sandboxed homes) | **≥80% line coverage** of `boost_cli` (`fail_under` in pyproject.toml) |
|
|
1189
|
+
| `make smoke` | `tests/smoke.sh` — 175 checks run through the actual `./boost` shim (`--online` also hits real registries) | all pass |
|
|
1165
1190
|
| `make mutation` | [mutmut] mutates `boost_cli/core` (~9,900 mutants) and reruns the unit suite against each one | **≥80% killed** (`scripts/mutation_gate.py`) |
|
|
1166
1191
|
| `make evals` | scores the search ranker on a graded golden set — recall@5/@10, MRR, nDCG@5/@10 | **metric floors + no statistically significant regression** (`scripts/eval_gate.py`) |
|
|
1167
1192
|
|
|
@@ -56,6 +56,7 @@ boost_cli/core/bootstrap.py
|
|
|
56
56
|
boost_cli/core/builtin.py
|
|
57
57
|
boost_cli/core/capabilities.py
|
|
58
58
|
boost_cli/core/catalog.py
|
|
59
|
+
boost_cli/core/catalogbundle.py
|
|
59
60
|
boost_cli/core/chat.py
|
|
60
61
|
boost_cli/core/claude_settings.py
|
|
61
62
|
boost_cli/core/complete.py
|
|
@@ -387,6 +388,7 @@ docs/roadmap/items/serve-404-reflected-the-request.md
|
|
|
387
388
|
docs/roadmap/items/serve-is-a-searchable-catalogue.md
|
|
388
389
|
docs/roadmap/items/serve-py-traversal-guards-untested.md
|
|
389
390
|
docs/roadmap/items/shards-pipeline-never-produced-a-shard.md
|
|
391
|
+
docs/roadmap/items/shareable-catalogue-bundle.md
|
|
390
392
|
docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md
|
|
391
393
|
docs/roadmap/items/single-imperative-rule-extractor.md
|
|
392
394
|
docs/roadmap/items/single-tech-stack-prober.md
|
|
@@ -511,6 +513,7 @@ tests/eval/taps.txt
|
|
|
511
513
|
tests/functional/test_capabilities_policy.py
|
|
512
514
|
tests/functional/test_cli_adapt.py
|
|
513
515
|
tests/functional/test_cli_bmad.py
|
|
516
|
+
tests/functional/test_cli_catalog.py
|
|
514
517
|
tests/functional/test_cli_chat.py
|
|
515
518
|
tests/functional/test_cli_configuration.py
|
|
516
519
|
tests/functional/test_cli_discovery.py
|
|
@@ -569,6 +572,7 @@ tests/unit/test_bootstrap.py
|
|
|
569
572
|
tests/unit/test_builtin.py
|
|
570
573
|
tests/unit/test_capabilities.py
|
|
571
574
|
tests/unit/test_catalog.py
|
|
575
|
+
tests/unit/test_catalogbundle.py
|
|
572
576
|
tests/unit/test_chat.py
|
|
573
577
|
tests/unit/test_check_anchors.py
|
|
574
578
|
tests/unit/test_check_licenses.py
|
|
@@ -250,9 +250,9 @@
|
|
|
250
250
|
committing to one. Once tapped, everything inside becomes searchable and
|
|
251
251
|
installable.</p>
|
|
252
252
|
<div class="tags">
|
|
253
|
-
<code>untap</code><code>taps</code><code>outdated</code>
|
|
253
|
+
<code>untap</code><code>taps</code><code>outdated</code><code>catalog</code>
|
|
254
254
|
</div>
|
|
255
|
-
<p class="group-note">
|
|
255
|
+
<p class="group-note">5 commands in this group.</p>
|
|
256
256
|
<p class="regen">regenerate: <code>vhs docs/carousel/tapes/tap.tape</code></p>
|
|
257
257
|
</div>
|
|
258
258
|
</div>
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
<aside>
|
|
99
99
|
<div class="brand"><b>✦ boost</b><span>commands</span></div>
|
|
100
100
|
<a class="home" href="index.html">← back to overview</a>
|
|
101
|
-
<input id="q" type="search" placeholder="Filter
|
|
101
|
+
<input id="q" type="search" placeholder="Filter 79 commands…" autocomplete="off" aria-label="Filter commands">
|
|
102
102
|
<div class="group" data-group="pkg">
|
|
103
103
|
<div class="group-h">Install & lifecycle</div>
|
|
104
104
|
<a class="cmd-link" href="#cmd-install" data-search="install install a skill from a tap registry --force --path p --agent a --scope {user,project} --local --global --dry-run --no-deps --no-mcp name">install</a>
|
|
@@ -146,6 +146,7 @@
|
|
|
146
146
|
<a class="cmd-link" href="#cmd-untap" data-search="untap remove a registry tap -f, --force name">untap</a>
|
|
147
147
|
<a class="cmd-link" href="#cmd-taps" data-search="taps list all configured registry taps --json">taps</a>
|
|
148
148
|
<a class="cmd-link" href="#cmd-outdated" data-search="outdated show skills with available updates --json">outdated</a>
|
|
149
|
+
<a class="cmd-link" href="#cmd-catalog" data-search="catalog share the tapped catalogue so others skip the clone --export file --import file --show file --json">catalog</a>
|
|
149
150
|
</div>
|
|
150
151
|
<div class="group" data-group="ai">
|
|
151
152
|
<div class="group-h">AI-assisted</div>
|
|
@@ -205,7 +206,7 @@
|
|
|
205
206
|
</aside>
|
|
206
207
|
<main id="top">
|
|
207
208
|
<h1>boost <b>command reference</b></h1>
|
|
208
|
-
<p class="lead">All <b>
|
|
209
|
+
<p class="lead">All <b>79</b> commands, generated from the CLI itself —
|
|
209
210
|
run <code>boost <command> --help</code> for the same in your terminal.</p>
|
|
210
211
|
<h2 class="group-h" id="grp-pkg">Install & lifecycle</h2>
|
|
211
212
|
<section class="cmd" id="cmd-install" data-search="install install a skill from a tap registry --force --path p --agent a --scope {user,project} --local --global --dry-run --no-deps --no-mcp name">
|
|
@@ -671,6 +672,18 @@
|
|
|
671
672
|
<div class="arg"><code>--json</code><span>machine-readable output</span></div>
|
|
672
673
|
</div>
|
|
673
674
|
</section>
|
|
675
|
+
<section class="cmd" id="cmd-catalog" data-search="catalog share the tapped catalogue so others skip the clone --export file --import file --show file --json">
|
|
676
|
+
<h3><span class="cname">catalog</span><span class="gtag">tap</span></h3>
|
|
677
|
+
<p class="summary">Share the tapped catalogue so others skip the clone</p>
|
|
678
|
+
<pre class="syn">boost catalog [--export FILE] [--import FILE] [--show FILE] [--json]</pre>
|
|
679
|
+
<div class="args-h">Options</div>
|
|
680
|
+
<div class="args">
|
|
681
|
+
<div class="arg"><code>--export FILE</code><span>write every tapped registry's catalogue to FILE</span></div>
|
|
682
|
+
<div class="arg"><code>--import FILE</code><span>merge a catalogue bundle into this machine</span></div>
|
|
683
|
+
<div class="arg"><code>--show FILE</code><span>describe a bundle without importing it</span></div>
|
|
684
|
+
<div class="arg"><code>--json</code><span>machine-readable output</span></div>
|
|
685
|
+
</div>
|
|
686
|
+
</section>
|
|
674
687
|
<h2 class="group-h" id="grp-ai">AI-assisted</h2>
|
|
675
688
|
<section class="cmd" id="cmd-chat" data-search="chat ask about skills in plain language (rag-grounded) ask about skills in plain language -k, --limit n --no-sources --json question">
|
|
676
689
|
<h3><span class="cname">chat</span><span class="gtag">ai</span></h3>
|