boost-skill-cli 1.2.37__tar.gz → 1.2.39__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
- {boost_skill_cli-1.2.37/boost_skill_cli.egg-info → boost_skill_cli-1.2.39}/PKG-INFO +9 -4
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/README.md +8 -3
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/bmad.py +105 -21
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/ai.py +49 -24
- boost_skill_cli-1.2.39/boost_cli/core/aihost.py +154 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39/boost_skill_cli.egg-info}/PKG-INFO +9 -4
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/bmad.md +30 -3
- boost_skill_cli-1.2.39/docs/roadmap/items/ai-backend-fanout.md +42 -0
- boost_skill_cli-1.2.39/docs/roadmap/items/bmad-hooks-all-hosts.md +42 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap.html +80 -2
- boost_skill_cli-1.2.39/tests/functional/test_bmad_all_hosts.py +124 -0
- boost_skill_cli-1.2.39/tests/unit/test_aihost.py +109 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_hardening.py +26 -3
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.gitattributes +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.gitignore +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/.vale.ini +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/DCO +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/LICENSE +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/Makefile +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/codecov.yml +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/index.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/README.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/examples/README.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/index.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/noxfile.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/setup.cfg +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/README.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/boost.css +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/boost.js +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/style/demo.html +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.37 → boost_skill_cli-1.2.39}/tests/visual/visual_check.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.39
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -1000,9 +1000,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
|
|
|
1000
1000
|
| Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
|
|
1001
1001
|
|
|
1002
1002
|
The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
|
|
1003
|
-
`absorb`, `evolve`, `simulate`)
|
|
1004
|
-
|
|
1005
|
-
available.
|
|
1003
|
+
`absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
|
|
1004
|
+
`claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
|
|
1005
|
+
heuristics when none is available. boost handles the differences: Gemini takes
|
|
1006
|
+
no separate system prompt, so it is folded into the message, and a model id
|
|
1007
|
+
belonging to another vendor is never passed through.
|
|
1008
|
+
|
|
1009
|
+
The retrieval and faithfulness evals were measured against Claude, so treat
|
|
1010
|
+
those floors as Claude-measured rather than a claim about every backend.
|
|
1006
1011
|
|
|
1007
1012
|
## boost as an MCP server
|
|
1008
1013
|
|
|
@@ -282,9 +282,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
|
|
|
282
282
|
| Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
|
|
283
283
|
|
|
284
284
|
The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
|
|
285
|
-
`absorb`, `evolve`, `simulate`)
|
|
286
|
-
|
|
287
|
-
available.
|
|
285
|
+
`absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
|
|
286
|
+
`claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
|
|
287
|
+
heuristics when none is available. boost handles the differences: Gemini takes
|
|
288
|
+
no separate system prompt, so it is folded into the message, and a model id
|
|
289
|
+
belonging to another vendor is never passed through.
|
|
290
|
+
|
|
291
|
+
The retrieval and faithfulness evals were measured against Claude, so treat
|
|
292
|
+
those floors as Claude-measured rather than a claim about every backend.
|
|
288
293
|
|
|
289
294
|
## boost as an MCP server
|
|
290
295
|
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.39'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 39)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -38,11 +38,25 @@ stage the installer in a temp dir and copy only the `bmad-*` skills into
|
|
|
38
38
|
~/.claude/skills, so $HOME never gets a stray `_bmad/`; the runtime is
|
|
39
39
|
per-project by design.
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
The **hooks fan out; the personas do not**, and the split is not arbitrary.
|
|
42
|
+
|
|
43
|
+
A subagent definition is a Claude Code contract, and BMAD's own installer takes
|
|
44
|
+
`--tools claude-code`, so personas stay in `~/.claude/agents/`. Copying them
|
|
45
|
+
into Gemini's `agents/` slot would also ship files its schema rejects — that
|
|
46
|
+
slot validates, and a Claude-dialect persona fails it.
|
|
47
|
+
|
|
48
|
+
The hooks are a different case, and an earlier version of this docstring got it
|
|
49
|
+
wrong by lumping them together: it claimed `SessionStart` and
|
|
50
|
+
`UserPromptSubmit` had "no equivalent in the other three agents", which stopped
|
|
51
|
+
being true when `core/hookhost.py` learned Gemini's vocabulary. They map to
|
|
52
|
+
`SessionStart` and `BeforeAgent`, so `bmad on` now installs them on every host
|
|
53
|
+
with evidence of use, translating the event names and the timeout units on the
|
|
54
|
+
way. Matchers are *not* translated — `hookhost` passes them through
|
|
55
|
+
host-native — so Claude's `startup|resume|clear` source matcher is applied only
|
|
56
|
+
on Claude.
|
|
57
|
+
|
|
58
|
+
What that buys on a second host is prompt shaping, not full parity: the routing
|
|
59
|
+
banner names personas Gemini cannot spawn.
|
|
46
60
|
"""
|
|
47
61
|
from __future__ import annotations
|
|
48
62
|
|
|
@@ -61,7 +75,7 @@ from pathlib import Path
|
|
|
61
75
|
from .. import cliparse
|
|
62
76
|
from ..core import bmad as core
|
|
63
77
|
from ..core import claude_settings as cs
|
|
64
|
-
from ..core import journal, paths, util
|
|
78
|
+
from ..core import hookhost, journal, paths, util
|
|
65
79
|
from ..core import output as out
|
|
66
80
|
from ..errors import BoostError
|
|
67
81
|
|
|
@@ -148,6 +162,74 @@ def _never_fails(command: str) -> str:
|
|
|
148
162
|
return command + " || true"
|
|
149
163
|
|
|
150
164
|
|
|
165
|
+
def _hook_hosts(scope: str) -> list[str]:
|
|
166
|
+
"""Hosts to write hooks into: Claude always, others on evidence of use.
|
|
167
|
+
|
|
168
|
+
Claude is unconditional. It is boost's primary host and the behaviour every
|
|
169
|
+
release before this one had, and the check cannot be `shutil.which` the way
|
|
170
|
+
`boost mcp register`'s is: that command *shells out* to `claude mcp add` and
|
|
171
|
+
genuinely cannot work without the binary, while this one only writes a
|
|
172
|
+
settings.json. A user running inside Claude Code whose launcher is not on
|
|
173
|
+
boost's PATH would otherwise silently get no hooks at all.
|
|
174
|
+
|
|
175
|
+
A second host earns its hooks by evidence that it is actually in use —
|
|
176
|
+
its CLI on PATH, or its dotdir already present. Writing into
|
|
177
|
+
`~/.gemini/settings.json` for someone who has never run Gemini is litter in
|
|
178
|
+
a file boost does not own. A host that appears later is picked up by the
|
|
179
|
+
next `boost bmad on`, which is idempotent.
|
|
180
|
+
"""
|
|
181
|
+
chosen = [hookhost.CLAUDE]
|
|
182
|
+
for host in hookhost.hosts():
|
|
183
|
+
if host == hookhost.CLAUDE:
|
|
184
|
+
continue
|
|
185
|
+
dotdir = cs.settings_path(scope, host=host).parent
|
|
186
|
+
if shutil.which(hookhost.cli(host)) or dotdir.is_dir():
|
|
187
|
+
chosen.append(host)
|
|
188
|
+
return chosen
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
#: (Claude event, hook name, matcher). The matcher is Claude's own
|
|
192
|
+
#: `SessionStart` source vocabulary, and `hookhost` deliberately does not
|
|
193
|
+
#: translate matchers — they pass through host-native — so it is applied only
|
|
194
|
+
#: on the host it was written for. Omitting it elsewhere means "every start",
|
|
195
|
+
#: which is what a session briefing wants anyway.
|
|
196
|
+
_ORIENT_HOOK = ("SessionStart", HOOK_NAME, HOOK_MATCHER)
|
|
197
|
+
_ROUTE_HOOK = ("UserPromptSubmit", ROUTE_HOOK_NAME, None)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _add_hook_everywhere(scope: str, spec: tuple, command: str) -> list[str]:
|
|
201
|
+
"""Install one hook on every installed host. Returns the hosts written."""
|
|
202
|
+
event, name, matcher = spec
|
|
203
|
+
written = []
|
|
204
|
+
for host in _hook_hosts(scope):
|
|
205
|
+
target = hookhost.translate(host, event)
|
|
206
|
+
if target is None:
|
|
207
|
+
# Refused out loud rather than dropped: a hook the user asked for
|
|
208
|
+
# and silently never got is worse than one that cannot exist.
|
|
209
|
+
out.warn("%s has no counterpart for %s — skipped"
|
|
210
|
+
% (hookhost.label(host), event))
|
|
211
|
+
continue
|
|
212
|
+
cs.add_hook(scope, target, name, command,
|
|
213
|
+
matcher=matcher if host == hookhost.CLAUDE else None,
|
|
214
|
+
host=host)
|
|
215
|
+
written.append(host)
|
|
216
|
+
return written
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _remove_hook_everywhere(scope: str, *specs: tuple) -> None:
|
|
220
|
+
"""Remove hooks from every host, installed or not.
|
|
221
|
+
|
|
222
|
+
Unlike install this does not filter on `shutil.which`: someone who removed
|
|
223
|
+
an agent CLI still wants boost's hooks gone from its settings.json, and
|
|
224
|
+
`remove_hook` against a file that was never written is a no-op.
|
|
225
|
+
"""
|
|
226
|
+
for host in hookhost.hosts():
|
|
227
|
+
for event, name, _matcher in specs:
|
|
228
|
+
target = hookhost.translate(host, event)
|
|
229
|
+
if target is not None:
|
|
230
|
+
cs.remove_hook(scope, target, name, host=host)
|
|
231
|
+
|
|
232
|
+
|
|
151
233
|
def _autopilot_on(scope) -> int:
|
|
152
234
|
"""The one command. Personas + orientation + router, in one idempotent pass.
|
|
153
235
|
|
|
@@ -160,11 +242,11 @@ def _autopilot_on(scope) -> int:
|
|
|
160
242
|
slugs, skipped = core.write_personas(agents)
|
|
161
243
|
|
|
162
244
|
launcher = shlex.quote(str(paths.launcher()))
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
245
|
+
hosts = _add_hook_everywhere(
|
|
246
|
+
scope, _ORIENT_HOOK,
|
|
247
|
+
_never_fails("%s bmad orient --scope %s" % (launcher, scope)))
|
|
248
|
+
_add_hook_everywhere(scope, _ROUTE_HOOK,
|
|
249
|
+
_never_fails("%s bmad route" % launcher))
|
|
168
250
|
_set_scope_state(scope, autopilot=True, startup=True, personas=len(slugs),
|
|
169
251
|
enabled_at=util.now_iso())
|
|
170
252
|
journal.log("bmad-autopilot", "on", scope=scope, personas=len(slugs))
|
|
@@ -176,8 +258,11 @@ def _autopilot_on(scope) -> int:
|
|
|
176
258
|
% (len(skipped), ", ".join(skipped)))
|
|
177
259
|
out.dim(" delete the file to let `boost bmad on` restore the stock version")
|
|
178
260
|
out.dim(" personas → %s" % paths.tilde(agents))
|
|
179
|
-
|
|
180
|
-
|
|
261
|
+
for host in hosts:
|
|
262
|
+
out.dim(" hooks → %s (%s + %s)"
|
|
263
|
+
% (paths.tilde(cs.settings_path(scope, host=host)),
|
|
264
|
+
hookhost.translate(host, "SessionStart"),
|
|
265
|
+
hookhost.translate(host, "UserPromptSubmit")))
|
|
181
266
|
out.dim(" every substantive prompt now names its lead persona and its "
|
|
182
267
|
"definition of done; trivial asks are left alone")
|
|
183
268
|
# Claude Code only watches an agents dir that existed when the session
|
|
@@ -189,8 +274,7 @@ def _autopilot_on(scope) -> int:
|
|
|
189
274
|
|
|
190
275
|
def _autopilot_off(scope) -> int:
|
|
191
276
|
scope = scope or "global"
|
|
192
|
-
|
|
193
|
-
cs.remove_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME)
|
|
277
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK, _ROUTE_HOOK)
|
|
194
278
|
removed = core.remove_personas(_agents_dir(scope))
|
|
195
279
|
_set_scope_state(scope, autopilot=False, startup=False, personas=0)
|
|
196
280
|
journal.log("bmad-autopilot", "off", scope=scope, personas=len(removed))
|
|
@@ -374,14 +458,15 @@ def _startup(value, scope) -> int:
|
|
|
374
458
|
if value == "on":
|
|
375
459
|
cmd = "%s bmad orient --scope %s" % (
|
|
376
460
|
shlex.quote(str(paths.launcher())), scope)
|
|
377
|
-
|
|
461
|
+
started = _add_hook_everywhere(scope, _ORIENT_HOOK, cmd)
|
|
378
462
|
_set_scope_state(scope, startup=True)
|
|
379
463
|
journal.log("bmad-startup", "on", scope=scope)
|
|
380
464
|
out.ok("BMAD startup ON (%s) — new sessions get orientation" % scope)
|
|
381
|
-
|
|
465
|
+
for host in started:
|
|
466
|
+
out.dim(" hook → %s" % cs.settings_path(scope, host=host))
|
|
382
467
|
return 0
|
|
383
468
|
if value == "off":
|
|
384
|
-
|
|
469
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK)
|
|
385
470
|
_set_scope_state(scope, startup=False)
|
|
386
471
|
journal.log("bmad-startup", "off", scope=scope)
|
|
387
472
|
out.ok("BMAD startup OFF (%s) — skills stay installed" % scope)
|
|
@@ -419,8 +504,7 @@ def _uninstall(scope, yes) -> int:
|
|
|
419
504
|
scope, " + _bmad/, _bmad-output/" if scope == "project" else ""))):
|
|
420
505
|
out.info("aborted")
|
|
421
506
|
return 0
|
|
422
|
-
|
|
423
|
-
cs.remove_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME)
|
|
507
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK, _ROUTE_HOOK)
|
|
424
508
|
removed = _rm_skills(_skills_dir(scope))
|
|
425
509
|
removed += len(core.remove_personas(_agents_dir(scope)))
|
|
426
510
|
if scope == "project":
|
|
@@ -438,7 +522,7 @@ def _uninstall(scope, yes) -> int:
|
|
|
438
522
|
def _disable(scope) -> int:
|
|
439
523
|
"""Quarantine: turn startup off and move skills aside (recoverable)."""
|
|
440
524
|
scope = scope or "project"
|
|
441
|
-
|
|
525
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK)
|
|
442
526
|
qdir = _quarantine_dir(scope)
|
|
443
527
|
qdir.mkdir(parents=True, exist_ok=True)
|
|
444
528
|
moved = 0
|
|
@@ -2,9 +2,21 @@
|
|
|
2
2
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
3
3
|
"""Optional AI bridge for the Intelligence commands and --smart ranking.
|
|
4
4
|
|
|
5
|
-
Strategy:
|
|
6
|
-
|
|
7
|
-
degrades to its
|
|
5
|
+
Strategy: use the first assistant CLI on PATH that `core/aihost.py` knows —
|
|
6
|
+
Claude first, then Gemini — else the Anthropic API via urllib when
|
|
7
|
+
ANTHROPIC_API_KEY is set, else return None so every caller degrades to its
|
|
8
|
+
non-AI fallback.
|
|
9
|
+
|
|
10
|
+
The second CLI is why `aihost` exists. Before it, a user running Gemini got the
|
|
11
|
+
heuristic fallback from every AI-assisted command even with a perfectly good
|
|
12
|
+
assistant installed, because this module only ever spelled "claude". The
|
|
13
|
+
per-backend differences that would otherwise be bugs — Gemini has no
|
|
14
|
+
`--append-system-prompt`, and `ai.model` holds a Claude id that `gemini -m`
|
|
15
|
+
would reject — are handled there, as data.
|
|
16
|
+
|
|
17
|
+
The direct-API path stays Anthropic-only. Someone using Gemini CLI has the
|
|
18
|
+
binary by definition, so the CLI route is the one that matters; a second HTTP
|
|
19
|
+
client is a separate change with its own wire format and error taxonomy.
|
|
8
20
|
"""
|
|
9
21
|
from __future__ import annotations
|
|
10
22
|
|
|
@@ -15,7 +27,7 @@ import subprocess
|
|
|
15
27
|
import urllib.error
|
|
16
28
|
import urllib.request
|
|
17
29
|
|
|
18
|
-
from . import config, logs, nethttp
|
|
30
|
+
from . import aihost, config, logs, nethttp
|
|
19
31
|
|
|
20
32
|
API_URL = "https://api.anthropic.com/v1/messages"
|
|
21
33
|
|
|
@@ -30,22 +42,33 @@ def enabled() -> bool:
|
|
|
30
42
|
|
|
31
43
|
|
|
32
44
|
def available() -> bool:
|
|
33
|
-
"""Return True when AI is enabled and
|
|
34
|
-
|
|
35
|
-
CLI on PATH or ANTHROPIC_API_KEY set.
|
|
36
|
-
"""
|
|
45
|
+
"""Return True when AI is enabled and some backend exists."""
|
|
37
46
|
return enabled() and (has_cli() or bool(os.environ.get("ANTHROPIC_API_KEY")))
|
|
38
47
|
|
|
39
48
|
|
|
49
|
+
def cli_backend() -> str | None:
|
|
50
|
+
"""The first assistant CLI on PATH, in `aihost` preference order."""
|
|
51
|
+
for name in aihost.backends():
|
|
52
|
+
if shutil.which(aihost.cli(name)):
|
|
53
|
+
return name
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
|
|
40
57
|
def has_cli() -> bool:
|
|
41
|
-
"""Return True when
|
|
42
|
-
return
|
|
58
|
+
"""Return True when any assistant CLI `aihost` knows is on PATH."""
|
|
59
|
+
return cli_backend() is not None
|
|
43
60
|
|
|
44
61
|
|
|
45
62
|
def fallback_note() -> str:
|
|
46
|
-
"""Return the one-line hint shown when a command degrades to heuristics.
|
|
47
|
-
|
|
48
|
-
|
|
63
|
+
"""Return the one-line hint shown when a command degrades to heuristics.
|
|
64
|
+
|
|
65
|
+
Names every CLI that would work, not just Claude's — telling a Gemini user
|
|
66
|
+
to install Claude is a worse answer than telling them boost could not find
|
|
67
|
+
either.
|
|
68
|
+
"""
|
|
69
|
+
clis = " or ".join("`%s`" % aihost.cli(n) for n in aihost.backends())
|
|
70
|
+
return ("AI features need one of %s on PATH, or ANTHROPIC_API_KEY set "
|
|
71
|
+
"— using the heuristic fallback" % clis)
|
|
49
72
|
|
|
50
73
|
|
|
51
74
|
def ask(prompt: str, system: str | None = None, model: str | None = None,
|
|
@@ -54,8 +77,9 @@ def ask(prompt: str, system: str | None = None, model: str | None = None,
|
|
|
54
77
|
if not enabled():
|
|
55
78
|
return None
|
|
56
79
|
model = model or str(config.get("ai.model"))
|
|
57
|
-
|
|
58
|
-
|
|
80
|
+
backend = cli_backend()
|
|
81
|
+
if backend:
|
|
82
|
+
text = _ask_cli(backend, prompt, system, model, timeout)
|
|
59
83
|
if text:
|
|
60
84
|
return text
|
|
61
85
|
if os.environ.get("ANTHROPIC_API_KEY"):
|
|
@@ -88,26 +112,27 @@ def _stderr_excerpt(text: str | None) -> str:
|
|
|
88
112
|
return (s[:STDERR_LOG_CHARS] + "...") if len(s) > STDERR_LOG_CHARS else s
|
|
89
113
|
|
|
90
114
|
|
|
91
|
-
def _ask_cli(prompt: str, system: str | None, model: str,
|
|
115
|
+
def _ask_cli(backend: str, prompt: str, system: str | None, model: str,
|
|
92
116
|
timeout: int) -> str | None:
|
|
93
|
-
cmd =
|
|
94
|
-
|
|
95
|
-
|
|
117
|
+
cmd = aihost.argv(backend, model, system)
|
|
118
|
+
# A backend with no system flag takes the text folded into the prompt.
|
|
119
|
+
body = aihost.fold_system(backend, system, prompt)
|
|
120
|
+
who = "%s CLI" % aihost.cli(backend)
|
|
96
121
|
try:
|
|
97
|
-
proc = subprocess.run(cmd, input=
|
|
122
|
+
proc = subprocess.run(cmd, input=body, capture_output=True,
|
|
98
123
|
text=True, timeout=timeout)
|
|
99
124
|
except (subprocess.TimeoutExpired, OSError) as e:
|
|
100
125
|
# The exception TYPE only, never str(e): TimeoutExpired stringifies the
|
|
101
|
-
# whole argv, which carries the
|
|
102
|
-
_log_failure(
|
|
126
|
+
# whole argv, which carries the system-prompt text with it.
|
|
127
|
+
_log_failure(who, type(e).__name__)
|
|
103
128
|
return None
|
|
104
129
|
if proc.returncode != 0:
|
|
105
|
-
_log_failure(
|
|
130
|
+
_log_failure(who, "exit %d: %s"
|
|
106
131
|
% (proc.returncode, _stderr_excerpt(proc.stderr)))
|
|
107
132
|
return None
|
|
108
133
|
out = proc.stdout.strip()
|
|
109
134
|
if not out:
|
|
110
|
-
_log_failure(
|
|
135
|
+
_log_failure(who, "empty reply")
|
|
111
136
|
return None
|
|
112
137
|
return out
|
|
113
138
|
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright the boost contributors.
|
|
3
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
4
|
+
"""Per-assistant-CLI facts for the AI bridge — a pure table, like `hookhost`.
|
|
5
|
+
|
|
6
|
+
`core/ai.py` knew exactly one backend: the `claude` CLI, or the Anthropic API
|
|
7
|
+
via ANTHROPIC_API_KEY. Every AI-assisted command therefore degraded to its
|
|
8
|
+
heuristic fallback for a user running Gemini CLI, even though Gemini exposes
|
|
9
|
+
the same headless contract. Skills, MCP, rules, workflows and hooks all fan out
|
|
10
|
+
across hosts; this was the last surface that did not, and it is the one a user
|
|
11
|
+
notices, because the fallback is visibly worse prose.
|
|
12
|
+
|
|
13
|
+
Three per-backend facts do the work, and each is a difference that would
|
|
14
|
+
otherwise be a bug:
|
|
15
|
+
|
|
16
|
+
* **The system prompt.** Claude takes `--append-system-prompt`. Gemini has no
|
|
17
|
+
equivalent, so the system text has to be folded into the prompt body. Passing
|
|
18
|
+
an unknown flag would make every call fail with a usage error rather than
|
|
19
|
+
degrade — the one outcome worse than having no AI at all.
|
|
20
|
+
* **The model id.** `ai.model` defaults to a Claude model name, and handing
|
|
21
|
+
that to `gemini -m` is an error, not a fallback. A backend only receives a
|
|
22
|
+
model id it owns; otherwise the flag is omitted and the CLI picks its own
|
|
23
|
+
default.
|
|
24
|
+
* **Order.** Claude is first, and that is behaviour rather than taste: someone
|
|
25
|
+
with both CLIs installed had Claude answering before this table existed, and
|
|
26
|
+
reordering would silently change every result they get.
|
|
27
|
+
|
|
28
|
+
The direct-API path in `ai.py` stays Anthropic-only. A user of Gemini CLI has
|
|
29
|
+
the `gemini` binary by definition, so the CLI route is the one that matters
|
|
30
|
+
here; a second HTTP client is a separate, larger change with its own wire
|
|
31
|
+
format and error taxonomy.
|
|
32
|
+
"""
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from ..errors import BoostError
|
|
36
|
+
|
|
37
|
+
CLAUDE = "claude"
|
|
38
|
+
GEMINI = "gemini"
|
|
39
|
+
|
|
40
|
+
#: Ordered: the first installed backend wins. See the module docstring on why
|
|
41
|
+
#: Claude must stay at the front.
|
|
42
|
+
BACKENDS: dict[str, dict] = {
|
|
43
|
+
CLAUDE: {
|
|
44
|
+
"cli": "claude",
|
|
45
|
+
"label": "Claude Code",
|
|
46
|
+
"prompt_flag": "-p",
|
|
47
|
+
"model_flag": "--model",
|
|
48
|
+
# Model ids this backend accepts. `ai.model` is a Claude id today, so
|
|
49
|
+
# this is what keeps it from being handed to another CLI.
|
|
50
|
+
"model_prefixes": ("claude", "sonnet", "opus", "haiku"),
|
|
51
|
+
"output_flags": ("--output-format", "text"),
|
|
52
|
+
"system_flag": "--append-system-prompt",
|
|
53
|
+
"key_env": "ANTHROPIC_API_KEY",
|
|
54
|
+
},
|
|
55
|
+
GEMINI: {
|
|
56
|
+
"cli": "gemini",
|
|
57
|
+
"label": "Gemini CLI",
|
|
58
|
+
"prompt_flag": "-p",
|
|
59
|
+
"model_flag": "-m",
|
|
60
|
+
"model_prefixes": ("gemini",),
|
|
61
|
+
"output_flags": ("-o", "text"),
|
|
62
|
+
# No equivalent flag. `fold_system` puts the text in the prompt.
|
|
63
|
+
"system_flag": "",
|
|
64
|
+
"key_env": "GEMINI_API_KEY",
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def backends() -> list[str]:
|
|
70
|
+
"""Known backend ids, in preference order."""
|
|
71
|
+
return list(BACKENDS)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def spec(name: str) -> dict:
|
|
75
|
+
"""The table row for ``name``, or a BoostError naming the alternatives."""
|
|
76
|
+
try:
|
|
77
|
+
return BACKENDS[name]
|
|
78
|
+
except KeyError:
|
|
79
|
+
raise BoostError(
|
|
80
|
+
"unknown AI backend %r" % name,
|
|
81
|
+
hint="use one of: %s" % ", ".join(backends())) from None
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def cli(name: str) -> str:
|
|
85
|
+
"""The executable to run for ``name``."""
|
|
86
|
+
return str(spec(name)["cli"])
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def label(name: str) -> str:
|
|
90
|
+
"""Display name for ``name`` (``gemini`` -> "Gemini CLI")."""
|
|
91
|
+
return str(spec(name)["label"])
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def key_env(name: str) -> str:
|
|
95
|
+
"""The API-key environment variable ``name`` reads."""
|
|
96
|
+
return str(spec(name)["key_env"])
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def takes_system_flag(name: str) -> bool:
|
|
100
|
+
"""Whether ``name`` accepts a separate system prompt."""
|
|
101
|
+
return bool(spec(name)["system_flag"])
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def owns_model(name: str, model: str | None) -> bool:
|
|
105
|
+
"""Whether ``model`` is an id ``name`` clearly owns."""
|
|
106
|
+
if not model:
|
|
107
|
+
return False
|
|
108
|
+
return model.lower().startswith(tuple(spec(name)["model_prefixes"]))
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def accepts_model(name: str, model: str | None) -> bool:
|
|
112
|
+
"""Whether to hand ``model`` to ``name``.
|
|
113
|
+
|
|
114
|
+
The rule is "not another vendor's", not "one of mine". An id that no
|
|
115
|
+
backend claims — a custom alias, a pinned snapshot, anything a user passes
|
|
116
|
+
to `--model` — goes through untouched, because refusing it would silently
|
|
117
|
+
drop an override the user asked for. Only an id another backend plainly
|
|
118
|
+
owns is withheld: `ai.model` defaults to a Claude name, and `gemini -m
|
|
119
|
+
claude-sonnet-4-5` is an error rather than a fallback.
|
|
120
|
+
"""
|
|
121
|
+
if not model:
|
|
122
|
+
return False
|
|
123
|
+
if owns_model(name, model):
|
|
124
|
+
return True
|
|
125
|
+
return not any(owns_model(other, model)
|
|
126
|
+
for other in backends() if other != name)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def fold_system(name: str, system: str | None, prompt: str) -> str:
|
|
130
|
+
"""The prompt to send, with ``system`` folded in when there is no flag.
|
|
131
|
+
|
|
132
|
+
Returned unchanged for a backend that takes a system flag, so Claude's
|
|
133
|
+
request is byte-for-byte what it has always been.
|
|
134
|
+
"""
|
|
135
|
+
if not system or takes_system_flag(name):
|
|
136
|
+
return prompt
|
|
137
|
+
return "%s\n\n%s" % (system, prompt)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def argv(name: str, model: str | None, system: str | None) -> list[str]:
|
|
141
|
+
"""The command line for ``name``, minus the prompt (which goes on stdin).
|
|
142
|
+
|
|
143
|
+
``model`` is passed unless another backend plainly owns the id (see
|
|
144
|
+
`accepts_model`), and ``system`` only when this backend has a flag for one
|
|
145
|
+
— `fold_system` handles the other case.
|
|
146
|
+
"""
|
|
147
|
+
row = spec(name)
|
|
148
|
+
cmd = [str(row["cli"]), str(row["prompt_flag"])]
|
|
149
|
+
if accepts_model(name, model):
|
|
150
|
+
cmd += [str(row["model_flag"]), str(model)]
|
|
151
|
+
cmd += [str(x) for x in row["output_flags"]]
|
|
152
|
+
if system and row["system_flag"]:
|
|
153
|
+
cmd += [str(row["system_flag"]), system]
|
|
154
|
+
return cmd
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.39
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -1000,9 +1000,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
|
|
|
1000
1000
|
| Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
|
|
1001
1001
|
|
|
1002
1002
|
The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
|
|
1003
|
-
`absorb`, `evolve`, `simulate`)
|
|
1004
|
-
|
|
1005
|
-
available.
|
|
1003
|
+
`absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
|
|
1004
|
+
`claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
|
|
1005
|
+
heuristics when none is available. boost handles the differences: Gemini takes
|
|
1006
|
+
no separate system prompt, so it is folded into the message, and a model id
|
|
1007
|
+
belonging to another vendor is never passed through.
|
|
1008
|
+
|
|
1009
|
+
The retrieval and faithfulness evals were measured against Claude, so treat
|
|
1010
|
+
those floors as Claude-measured rather than a claim about every backend.
|
|
1006
1011
|
|
|
1007
1012
|
## boost as an MCP server
|
|
1008
1013
|
|
|
@@ -56,6 +56,7 @@ boost_cli/core/__init__.py
|
|
|
56
56
|
boost_cli/core/adapters.py
|
|
57
57
|
boost_cli/core/agents.py
|
|
58
58
|
boost_cli/core/ai.py
|
|
59
|
+
boost_cli/core/aihost.py
|
|
59
60
|
boost_cli/core/bmad.py
|
|
60
61
|
boost_cli/core/bootstrap.py
|
|
61
62
|
boost_cli/core/browse.py
|
|
@@ -202,6 +203,7 @@ docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
|
|
|
202
203
|
docs/roadmap/items/actionlint-skips-shellcheck-silently.md
|
|
203
204
|
docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md
|
|
204
205
|
docs/roadmap/items/agents-field-records-the-request-not-the-links.md
|
|
206
|
+
docs/roadmap/items/ai-backend-fanout.md
|
|
205
207
|
docs/roadmap/items/ai-bridge-silent-failure-logging.md
|
|
206
208
|
docs/roadmap/items/ambiguous-tap-short-name-resolution.md
|
|
207
209
|
docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
|
|
@@ -210,6 +212,7 @@ docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
|
|
|
210
212
|
docs/roadmap/items/bm25-has-no-stemming.md
|
|
211
213
|
docs/roadmap/items/bm25-index-is-one-json-blob.md
|
|
212
214
|
docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
|
|
215
|
+
docs/roadmap/items/bmad-hooks-all-hosts.md
|
|
213
216
|
docs/roadmap/items/boost-first-carried-the-losing-trigger.md
|
|
214
217
|
docs/roadmap/items/boost-first-rule.md
|
|
215
218
|
docs/roadmap/items/boost-langchain-publishing.md
|
|
@@ -574,6 +577,7 @@ tests/eval/golden.jsonl
|
|
|
574
577
|
tests/eval/recommend.jsonl
|
|
575
578
|
tests/eval/taps-scale.txt
|
|
576
579
|
tests/eval/taps.txt
|
|
580
|
+
tests/functional/test_bmad_all_hosts.py
|
|
577
581
|
tests/functional/test_capabilities_policy.py
|
|
578
582
|
tests/functional/test_cli_adapt.py
|
|
579
583
|
tests/functional/test_cli_bmad.py
|
|
@@ -635,6 +639,7 @@ tests/unit/test_adapters_multi.py
|
|
|
635
639
|
tests/unit/test_adapters_runner.py
|
|
636
640
|
tests/unit/test_agents.py
|
|
637
641
|
tests/unit/test_ai.py
|
|
642
|
+
tests/unit/test_aihost.py
|
|
638
643
|
tests/unit/test_bmad_core.py
|
|
639
644
|
tests/unit/test_boost_first_offer.py
|
|
640
645
|
tests/unit/test_bootstrap.py
|
|
@@ -48,9 +48,9 @@ boost bmad on
|
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
It writes seven BMAD persona subagents into `~/.claude/agents/` and installs two
|
|
51
|
-
hooks. A `SessionStart` hook briefs the session on the
|
|
52
|
-
`UserPromptSubmit` hook classifies each incoming prompt and prefixes
|
|
53
|
-
short routing banner:
|
|
51
|
+
hooks on every host it finds. A `SessionStart` hook briefs the session on the
|
|
52
|
+
roster. A `UserPromptSubmit` hook classifies each incoming prompt and prefixes
|
|
53
|
+
it with a short routing banner:
|
|
54
54
|
|
|
55
55
|
```text
|
|
56
56
|
[BMAD autopilot] track: build
|
|
@@ -92,6 +92,33 @@ contents, so the moment you edit one it stops being boost's. `boost bmad on`
|
|
|
92
92
|
reports it as kept rather than overwriting it, and `boost bmad off` leaves it
|
|
93
93
|
alone. Delete the file if you want the stock version back.
|
|
94
94
|
|
|
95
|
+
### Which hosts get the hooks
|
|
96
|
+
|
|
97
|
+
`boost bmad on` writes its two hooks into every host it has evidence you use,
|
|
98
|
+
and re-running it changes nothing that is already correct.
|
|
99
|
+
|
|
100
|
+
- **Claude always.** It is boost's primary host, and the check deliberately is
|
|
101
|
+
not "is the `claude` binary on `PATH`" — `bmad on` only writes a
|
|
102
|
+
settings.json, so someone running inside Claude Code whose launcher is not on
|
|
103
|
+
boost's `PATH` would otherwise silently get no hooks. (`boost mcp register`
|
|
104
|
+
does gate on the binary, because it shells out to `claude mcp add` and
|
|
105
|
+
genuinely cannot work without it.)
|
|
106
|
+
- **Any other host on evidence of use** — its CLI on `PATH`, or its dotdir
|
|
107
|
+
already there. Writing into `~/.gemini/settings.json` for someone who has
|
|
108
|
+
never run Gemini is litter in a file boost does not own. Install that agent
|
|
109
|
+
later and the next `boost bmad on` picks it up.
|
|
110
|
+
|
|
111
|
+
boost translates on the way in. `UserPromptSubmit` is written as Gemini's
|
|
112
|
+
`BeforeAgent`, and `--timeout 10` means ten seconds on both hosts even though
|
|
113
|
+
Gemini's field is milliseconds. Matchers are **not** translated — they pass
|
|
114
|
+
through host-native — so Claude's `startup|resume|clear` source matcher is
|
|
115
|
+
applied only on Claude, where that vocabulary exists.
|
|
116
|
+
|
|
117
|
+
**The personas stay Claude-only.** A subagent definition is a Claude Code
|
|
118
|
+
contract, and Gemini's `agents/` slot validates its input, so a Claude-dialect
|
|
119
|
+
persona would be rejected. What a second host gets is prompt shaping: the
|
|
120
|
+
routing banner arrives and names a lead persona, but Gemini cannot spawn it.
|
|
121
|
+
|
|
95
122
|
## The full BMAD method
|
|
96
123
|
|
|
97
124
|
The method itself is a separate, heavier install. `boost bmad install` delegates
|