boost-skill-cli 1.2.36__tar.gz → 1.2.38__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.36 → boost_skill_cli-1.2.38}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
- {boost_skill_cli-1.2.36/boost_skill_cli.egg-info → boost_skill_cli-1.2.38}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/cli.py +6 -1
- boost_skill_cli-1.2.38/boost_cli/cliparse.py +66 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/bmad.py +110 -22
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/discovery.py +1 -1
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/info.py +21 -8
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/intelligence.py +6 -3
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/team.py +15 -7
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/output.py +45 -7
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/bmad.md +30 -3
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/commands.html +8 -8
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/design-roadmap.html +16 -2
- boost_skill_cli-1.2.38/docs/roadmap/items/BOOST-D27.md +22 -0
- boost_skill_cli-1.2.38/docs/roadmap/items/bmad-hooks-all-hosts.md +42 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap.html +41 -2
- boost_skill_cli-1.2.38/tests/functional/test_bmad_all_hosts.py +124 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_bmad.py +15 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_discovery.py +10 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_info.py +85 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_intelligence.py +21 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_team.py +41 -0
- boost_skill_cli-1.2.38/tests/unit/test_cliparse.py +92 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_errors_and_cli_table.py +21 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_output.py +113 -0
- boost_skill_cli-1.2.36/boost_cli/cliparse.py +0 -33
- boost_skill_cli-1.2.36/tests/unit/test_cliparse.py +0 -45
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.gitattributes +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.gitignore +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/.vale.ini +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/DCO +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/LICENSE +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/Makefile +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/README.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/codecov.yml +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/index.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/README.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/examples/README.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/index.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/noxfile.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/setup.cfg +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/style/README.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/style/boost.css +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/style/boost.js +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/style/demo.html +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.36 → boost_skill_cli-1.2.38}/tests/visual/visual_check.mjs +0 -0
|
@@ -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.38'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 38)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -199,7 +199,12 @@ def print_help() -> None:
|
|
|
199
199
|
else:
|
|
200
200
|
print(head)
|
|
201
201
|
for n, s in cmds:
|
|
202
|
-
|
|
202
|
+
# accent, not a raw 16-color CYAN: every other command-name
|
|
203
|
+
# surface (search rows, info badges) resolves through this same
|
|
204
|
+
# semantic role, which is Aurora truecolor cyan with the correct
|
|
205
|
+
# 16-color/plain degradation — a raw CYAN here painted a visibly
|
|
206
|
+
# different cyan on any truecolor terminal.
|
|
207
|
+
print(" " + out.role(n.ljust(width + 2), "accent")
|
|
203
208
|
+ out.truncate(s, max(0, cols - width - 4)))
|
|
204
209
|
print()
|
|
205
210
|
print(out.c("%d commands · %d groups" % (len(COMMANDS), len(GROUPS)), out.DIM))
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Copyright the boost contributors.
|
|
2
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
3
|
+
"""A branded ArgumentParser.
|
|
4
|
+
|
|
5
|
+
Argparse's default failure output is a raw, unstyled ``usage:`` block with a
|
|
6
|
+
bare ``prog: error: …`` line — nothing like boost's branded top-level dispatch
|
|
7
|
+
(which routes through :func:`output.err` and offers a "did you mean"). This
|
|
8
|
+
subclass routes a parser's own errors through the same Aurora output layer, so
|
|
9
|
+
a wrong invocation looks as designed as a right one.
|
|
10
|
+
|
|
11
|
+
Adopt it via :func:`parser` in place of ``argparse.ArgumentParser``. Sub-parsers
|
|
12
|
+
created with ``add_subparsers()`` inherit this class automatically, so a single
|
|
13
|
+
top-level swap brands a command's whole tree.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
from .core import output as out
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class _BoostHelpFormatter(argparse.HelpFormatter):
|
|
24
|
+
"""Wraps help/description text the way :func:`output.wrap` does,
|
|
25
|
+
keeping a backtick-quoted command atomic instead of splitting it across
|
|
26
|
+
lines — the same rule every other long line in this CLI follows.
|
|
27
|
+
|
|
28
|
+
argparse's own ``HelpFormatter`` wraps with plain ``textwrap``, which
|
|
29
|
+
knows nothing about a backtick span (``doctor``/``search`` interpolate
|
|
30
|
+
hints ending in a pasteable ``pip install '...'``-style command; several
|
|
31
|
+
``help=`` strings quote a ``boost`` invocation the same way) — so a
|
|
32
|
+
narrow terminal could split one across two lines, handing the user a
|
|
33
|
+
command that does not run. Only the two text-filling hooks are
|
|
34
|
+
overridden; ``_format_usage``'s own line-splitting already treats a
|
|
35
|
+
metavar as one atomic part and is left alone.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def _split_lines(self, text: str, width: int) -> list[str]:
|
|
39
|
+
text = self._whitespace_matcher.sub(" ", text).strip()
|
|
40
|
+
return out.wrap(text, width) or [text]
|
|
41
|
+
|
|
42
|
+
def _fill_text(self, text: str, width: int, indent: str) -> str:
|
|
43
|
+
text = self._whitespace_matcher.sub(" ", text).strip()
|
|
44
|
+
lines = out.wrap(text, max(width - len(indent), 1)) or [text]
|
|
45
|
+
return "\n".join(indent + ln for ln in lines)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class BoostArgumentParser(argparse.ArgumentParser):
|
|
49
|
+
def __init__(self, *args, **kwargs):
|
|
50
|
+
# add_subparsers() creates each sub-parser via type(self)(**kwargs)
|
|
51
|
+
# without forwarding formatter_class, so defaulting it here (rather
|
|
52
|
+
# than in parser() below) is what brands every subcommand's --help
|
|
53
|
+
# too, not just the top-level one.
|
|
54
|
+
kwargs.setdefault("formatter_class", _BoostHelpFormatter)
|
|
55
|
+
super().__init__(*args, **kwargs)
|
|
56
|
+
|
|
57
|
+
def error(self, message: str):
|
|
58
|
+
"""Print a branded error + dimmed usage, then exit 2 (argparse's code)."""
|
|
59
|
+
out.err(message)
|
|
60
|
+
sys.stderr.write(out.c(self.format_usage(), out.DIM))
|
|
61
|
+
self.exit(2)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def parser(*args, **kwargs) -> BoostArgumentParser:
|
|
65
|
+
"""Drop-in replacement for ``argparse.ArgumentParser(...)``."""
|
|
66
|
+
return BoostArgumentParser(*args, **kwargs)
|
|
@@ -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
|
|
|
@@ -78,7 +92,11 @@ def cmd_bmad(argv) -> int:
|
|
|
78
92
|
p = cliparse.parser(
|
|
79
93
|
prog="boost bmad",
|
|
80
94
|
description="BMAD Method autopilot: personas, prompt routing, workflows")
|
|
81
|
-
|
|
95
|
+
# metavar="ACTION": the auto-generated {on,off,...,status} metavar (13
|
|
96
|
+
# entries) is one unbreakable token and overflowed the usage line up to
|
|
97
|
+
# 100 columns wide. The full list still shows in `help=` below.
|
|
98
|
+
p.add_argument("action", choices=_ACTIONS, metavar="ACTION",
|
|
99
|
+
help=" | ".join(_ACTIONS))
|
|
82
100
|
p.add_argument("value", nargs="?",
|
|
83
101
|
help="startup: on | off | status · route: the prompt to classify")
|
|
84
102
|
p.add_argument("-s", "--scope", choices=("project", "global"), default=None,
|
|
@@ -144,6 +162,74 @@ def _never_fails(command: str) -> str:
|
|
|
144
162
|
return command + " || true"
|
|
145
163
|
|
|
146
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
|
+
|
|
147
233
|
def _autopilot_on(scope) -> int:
|
|
148
234
|
"""The one command. Personas + orientation + router, in one idempotent pass.
|
|
149
235
|
|
|
@@ -156,11 +242,11 @@ def _autopilot_on(scope) -> int:
|
|
|
156
242
|
slugs, skipped = core.write_personas(agents)
|
|
157
243
|
|
|
158
244
|
launcher = shlex.quote(str(paths.launcher()))
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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))
|
|
164
250
|
_set_scope_state(scope, autopilot=True, startup=True, personas=len(slugs),
|
|
165
251
|
enabled_at=util.now_iso())
|
|
166
252
|
journal.log("bmad-autopilot", "on", scope=scope, personas=len(slugs))
|
|
@@ -172,8 +258,11 @@ def _autopilot_on(scope) -> int:
|
|
|
172
258
|
% (len(skipped), ", ".join(skipped)))
|
|
173
259
|
out.dim(" delete the file to let `boost bmad on` restore the stock version")
|
|
174
260
|
out.dim(" personas → %s" % paths.tilde(agents))
|
|
175
|
-
|
|
176
|
-
|
|
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")))
|
|
177
266
|
out.dim(" every substantive prompt now names its lead persona and its "
|
|
178
267
|
"definition of done; trivial asks are left alone")
|
|
179
268
|
# Claude Code only watches an agents dir that existed when the session
|
|
@@ -185,8 +274,7 @@ def _autopilot_on(scope) -> int:
|
|
|
185
274
|
|
|
186
275
|
def _autopilot_off(scope) -> int:
|
|
187
276
|
scope = scope or "global"
|
|
188
|
-
|
|
189
|
-
cs.remove_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME)
|
|
277
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK, _ROUTE_HOOK)
|
|
190
278
|
removed = core.remove_personas(_agents_dir(scope))
|
|
191
279
|
_set_scope_state(scope, autopilot=False, startup=False, personas=0)
|
|
192
280
|
journal.log("bmad-autopilot", "off", scope=scope, personas=len(removed))
|
|
@@ -370,14 +458,15 @@ def _startup(value, scope) -> int:
|
|
|
370
458
|
if value == "on":
|
|
371
459
|
cmd = "%s bmad orient --scope %s" % (
|
|
372
460
|
shlex.quote(str(paths.launcher())), scope)
|
|
373
|
-
|
|
461
|
+
started = _add_hook_everywhere(scope, _ORIENT_HOOK, cmd)
|
|
374
462
|
_set_scope_state(scope, startup=True)
|
|
375
463
|
journal.log("bmad-startup", "on", scope=scope)
|
|
376
464
|
out.ok("BMAD startup ON (%s) — new sessions get orientation" % scope)
|
|
377
|
-
|
|
465
|
+
for host in started:
|
|
466
|
+
out.dim(" hook → %s" % cs.settings_path(scope, host=host))
|
|
378
467
|
return 0
|
|
379
468
|
if value == "off":
|
|
380
|
-
|
|
469
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK)
|
|
381
470
|
_set_scope_state(scope, startup=False)
|
|
382
471
|
journal.log("bmad-startup", "off", scope=scope)
|
|
383
472
|
out.ok("BMAD startup OFF (%s) — skills stay installed" % scope)
|
|
@@ -415,8 +504,7 @@ def _uninstall(scope, yes) -> int:
|
|
|
415
504
|
scope, " + _bmad/, _bmad-output/" if scope == "project" else ""))):
|
|
416
505
|
out.info("aborted")
|
|
417
506
|
return 0
|
|
418
|
-
|
|
419
|
-
cs.remove_hook(scope, "UserPromptSubmit", ROUTE_HOOK_NAME)
|
|
507
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK, _ROUTE_HOOK)
|
|
420
508
|
removed = _rm_skills(_skills_dir(scope))
|
|
421
509
|
removed += len(core.remove_personas(_agents_dir(scope)))
|
|
422
510
|
if scope == "project":
|
|
@@ -434,7 +522,7 @@ def _uninstall(scope, yes) -> int:
|
|
|
434
522
|
def _disable(scope) -> int:
|
|
435
523
|
"""Quarantine: turn startup off and move skills aside (recoverable)."""
|
|
436
524
|
scope = scope or "project"
|
|
437
|
-
|
|
525
|
+
_remove_hook_everywhere(scope, _ORIENT_HOOK)
|
|
438
526
|
qdir = _quarantine_dir(scope)
|
|
439
527
|
qdir.mkdir(parents=True, exist_ok=True)
|
|
440
528
|
moved = 0
|
|
@@ -13,7 +13,6 @@ import re
|
|
|
13
13
|
import shlex
|
|
14
14
|
import subprocess
|
|
15
15
|
import sys
|
|
16
|
-
import textwrap
|
|
17
16
|
import webbrowser
|
|
18
17
|
from itertools import chain
|
|
19
18
|
from pathlib import Path
|
|
@@ -197,9 +196,12 @@ def _mark(installed: bool) -> str:
|
|
|
197
196
|
|
|
198
197
|
|
|
199
198
|
def _print_wrapped(text: str) -> None:
|
|
199
|
+
"""Wrap prose to the *real* pane via out.wrap(), not a hardcoded width —
|
|
200
|
+
a fixed textwrap width=76 neither shrank for a narrow terminal nor grew
|
|
201
|
+
for a wide one, and did not know a backtick span must stay whole."""
|
|
200
202
|
paras = [p for p in re.split(r"\n\s*\n", text.strip()) if p.strip()]
|
|
201
203
|
for i, para in enumerate(paras):
|
|
202
|
-
for line in
|
|
204
|
+
for line in out.wrap(" ".join(para.split()), out.term_width() - 2):
|
|
203
205
|
out.info(line)
|
|
204
206
|
if i < len(paras) - 1:
|
|
205
207
|
print()
|
|
@@ -471,10 +473,11 @@ def cmd_info(argv):
|
|
|
471
473
|
if badges:
|
|
472
474
|
out.info(" ".join(badges))
|
|
473
475
|
if desc:
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
476
|
+
# kv's own wrap=True already folds to the real terminal width and
|
|
477
|
+
# aligns continuations under the value — the hand-rolled version this
|
|
478
|
+
# replaced hardcoded width=62 (a hand copy of kv's default 16-column
|
|
479
|
+
# lead against a fixed 78-column pane) and ignored COLUMNS entirely.
|
|
480
|
+
out.kv("description", desc, wrap=True)
|
|
478
481
|
if lock:
|
|
479
482
|
inst_v = str(lock.get("version", "?"))
|
|
480
483
|
out.kv("version", inst_v)
|
|
@@ -630,9 +633,19 @@ def _render_markdown(body: str) -> None:
|
|
|
630
633
|
continue
|
|
631
634
|
m = re.match(r"^(\s*)[-*]\s+(.*)$", line)
|
|
632
635
|
if m:
|
|
633
|
-
|
|
636
|
+
prefix = "%s • " % m.group(1)
|
|
637
|
+
# Wrap the raw markdown first, THEN colorize each wrapped chunk —
|
|
638
|
+
# coloring before wrapping (the old behavior for the plain-prose
|
|
639
|
+
# branch below) would either split an inline `code` span or leave
|
|
640
|
+
# line 1's color code unterminated. A backtick span is one atomic
|
|
641
|
+
# token either way, via out.wrap().
|
|
642
|
+
wrapped = out.wrap(m.group(2), out.term_width() - len(prefix)) or [""]
|
|
643
|
+
for i, chunk in enumerate(wrapped):
|
|
644
|
+
lead = prefix if i == 0 else " " * len(prefix)
|
|
645
|
+
print(lead + _inline(chunk))
|
|
634
646
|
continue
|
|
635
|
-
|
|
647
|
+
for chunk in out.wrap(line, out.term_width()) or [""]:
|
|
648
|
+
print(_inline(chunk))
|
|
636
649
|
|
|
637
650
|
|
|
638
651
|
def cmd_preview(argv):
|
|
@@ -772,8 +772,10 @@ _CONTEXT_DEFAULT = {"enabled": False, "rules": []}
|
|
|
772
772
|
def cmd_context(argv: list[str]) -> int:
|
|
773
773
|
ap = cliparse.parser(
|
|
774
774
|
prog="boost context", description="Branch-aware skill activation")
|
|
775
|
-
|
|
776
|
-
|
|
775
|
+
# metavar="ACTION": the full "status|enable|disable|map|unmap|apply"
|
|
776
|
+
# spelling is one unbreakable token that overflowed the usage line at 60
|
|
777
|
+
# columns. Each subcommand still lists its own help= below.
|
|
778
|
+
sub = ap.add_subparsers(dest="action", metavar="ACTION")
|
|
777
779
|
sp = sub.add_parser("status", help="show rules, enabled flag & branch")
|
|
778
780
|
sp.add_argument("--json", action="store_true")
|
|
779
781
|
sub.add_parser("enable", help="turn on branch-aware activation (runs apply)")
|
|
@@ -873,7 +875,8 @@ def _context_status(state: dict, as_json: bool) -> int:
|
|
|
873
875
|
out.kv("branch", branch or "(not in a git repository)")
|
|
874
876
|
rules = state.get("rules", [])
|
|
875
877
|
if not rules:
|
|
876
|
-
out.info("no rules — add one with `boost context map 'feature/*'
|
|
878
|
+
out.info("no rules — add one with `boost context map 'feature/*' "
|
|
879
|
+
"skill1,skill2`", wrap=True)
|
|
877
880
|
return 0
|
|
878
881
|
rows = [(r.get("pattern", "?"), ", ".join(r.get("skills", [])),
|
|
879
882
|
"*" if branch and fnmatch.fnmatch(branch, r.get("pattern", "")) else "")
|
|
@@ -128,7 +128,7 @@ def cmd_cohort(argv) -> int:
|
|
|
128
128
|
raise BoostError("no cohort named %s" % args.name,
|
|
129
129
|
hint="list cohorts with `boost cohort list`")
|
|
130
130
|
if not targets:
|
|
131
|
-
out.
|
|
131
|
+
print(out.empty_state("no cohorts defined"))
|
|
132
132
|
return 0
|
|
133
133
|
applied = skipped = 0
|
|
134
134
|
for cname in targets:
|
|
@@ -174,8 +174,11 @@ def cmd_cohort(argv) -> int:
|
|
|
174
174
|
print(json.dumps(data, indent=2))
|
|
175
175
|
return 0
|
|
176
176
|
if not rows:
|
|
177
|
-
out.
|
|
178
|
-
|
|
177
|
+
print(out.empty_state(
|
|
178
|
+
"no cohorts defined",
|
|
179
|
+
hint="create one: `boost cohort create pilot --skills "
|
|
180
|
+
"tdd-workflow --percent 50`",
|
|
181
|
+
wrap=True))
|
|
179
182
|
return 0
|
|
180
183
|
out.table(rows, headers=("COHORT", "SKILLS", "ROLLOUT", "YOU"))
|
|
181
184
|
print()
|
|
@@ -518,7 +521,9 @@ def cmd_pulse(argv) -> int:
|
|
|
518
521
|
print(json.dumps(events, indent=2))
|
|
519
522
|
return 0
|
|
520
523
|
if not events:
|
|
521
|
-
out.
|
|
524
|
+
print(out.empty_state(
|
|
525
|
+
"no activity yet — events appear as you install and manage skills",
|
|
526
|
+
wrap=True))
|
|
522
527
|
return 0
|
|
523
528
|
for e in events:
|
|
524
529
|
action = e.get("action", "?")
|
|
@@ -557,7 +562,9 @@ def cmd_replay(argv) -> int:
|
|
|
557
562
|
print(json.dumps(history, indent=2))
|
|
558
563
|
return 0
|
|
559
564
|
if not history:
|
|
560
|
-
out.
|
|
565
|
+
print(out.empty_state(
|
|
566
|
+
"no lock history yet — every install/uninstall snapshots "
|
|
567
|
+
"the lock file", wrap=True))
|
|
561
568
|
return 0
|
|
562
569
|
rows = []
|
|
563
570
|
prev_items = None
|
|
@@ -693,8 +700,9 @@ def cmd_who(argv) -> int:
|
|
|
693
700
|
|
|
694
701
|
events = journal.events(subject=args.skill) if args.skill else journal.events()
|
|
695
702
|
if not events:
|
|
696
|
-
out.
|
|
697
|
-
|
|
703
|
+
print(out.empty_state(
|
|
704
|
+
"no journal activity yet — expertise builds as people install, "
|
|
705
|
+
"edit, and evolve skills", wrap=True))
|
|
698
706
|
return 0
|
|
699
707
|
|
|
700
708
|
if args.skill:
|
|
@@ -16,6 +16,7 @@ import os
|
|
|
16
16
|
import re
|
|
17
17
|
import shutil
|
|
18
18
|
import sys
|
|
19
|
+
import unicodedata
|
|
19
20
|
from collections.abc import Sequence
|
|
20
21
|
from dataclasses import dataclass
|
|
21
22
|
|
|
@@ -336,9 +337,30 @@ def badge(label: str, hue: str = "cyan") -> str:
|
|
|
336
337
|
_ANSI_RE = re.compile(r"\033\[[0-9;]*m")
|
|
337
338
|
|
|
338
339
|
|
|
340
|
+
def _char_width(ch: str) -> int:
|
|
341
|
+
"""Terminal display width of one character: 2 for wide/fullwidth CJK and
|
|
342
|
+
most emoji, 0 for a combining mark, 1 otherwise.
|
|
343
|
+
|
|
344
|
+
A pure-stdlib approximation of wcwidth via ``unicodedata`` — no dependency
|
|
345
|
+
to earn just for column math, and the two classes it distinguishes
|
|
346
|
+
(``unicodedata.east_asian_width`` returning "W"/"F") are exactly the ones
|
|
347
|
+
that render two columns wide in every terminal this CLI targets.
|
|
348
|
+
"""
|
|
349
|
+
if unicodedata.combining(ch):
|
|
350
|
+
return 0
|
|
351
|
+
return 2 if unicodedata.east_asian_width(ch) in ("W", "F") else 1
|
|
352
|
+
|
|
353
|
+
|
|
339
354
|
def visible_len(s: str) -> int:
|
|
340
|
-
"""
|
|
341
|
-
|
|
355
|
+
"""Column width of a string: ANSI escapes cost nothing, a wide character
|
|
356
|
+
(CJK, most emoji) costs 2, everything else costs 1.
|
|
357
|
+
|
|
358
|
+
``len()`` alone undercounts any string holding a double-width character,
|
|
359
|
+
which is what silently misaligned a table the moment a cell held an emoji
|
|
360
|
+
or CJK text — the column budget was measured a codepoint short of what
|
|
361
|
+
the terminal actually draws.
|
|
362
|
+
"""
|
|
363
|
+
return sum(_char_width(ch) for ch in _ANSI_RE.sub("", s))
|
|
342
364
|
|
|
343
365
|
|
|
344
366
|
_CODE_SPAN_RE = re.compile(r"`[^`]*`")
|
|
@@ -457,13 +479,26 @@ _TRAFFIC = ((0xff, 0x5f, 0x57, RED), (0xfe, 0xbc, 0x2e, YELLOW),
|
|
|
457
479
|
(0x28, 0xc8, 0x40, GREEN))
|
|
458
480
|
|
|
459
481
|
|
|
460
|
-
def empty_state(message: str, hint: str | None = None) -> str:
|
|
482
|
+
def empty_state(message: str, hint: str | None = None, wrap: bool = False) -> str:
|
|
461
483
|
"""A standardized empty-state: a muted ○ bullet + message, with an optional
|
|
462
484
|
dim → hint on the next line. One affordance so 'nothing here' always reads
|
|
463
|
-
the same across commands.
|
|
464
|
-
|
|
485
|
+
the same across commands.
|
|
486
|
+
|
|
487
|
+
``wrap`` as in :func:`warn`: opt-in, folding each block to the pane rather
|
|
488
|
+
than always-on, so a call site with an atomic backtick-quoted command
|
|
489
|
+
(e.g. cohort's create hint) still gets that command whole rather than
|
|
490
|
+
split across lines. Both markers ("○ " / "→ ") are two visible columns,
|
|
491
|
+
matching the module's other 4-column-lead emitters (2-space indent + a
|
|
492
|
+
2-wide marker), so message and hint wrap to the same budget.
|
|
493
|
+
"""
|
|
494
|
+
def _block(marker: str, text: str) -> list[str]:
|
|
495
|
+
body = _wrap_lines(text, 4) if wrap else [text]
|
|
496
|
+
return ([" " + c(marker + body[0], DIM)]
|
|
497
|
+
+ [" " + c(ln, DIM) for ln in body[1:]])
|
|
498
|
+
|
|
499
|
+
out_lines = _block("○ ", message)
|
|
465
500
|
if hint:
|
|
466
|
-
out_lines
|
|
501
|
+
out_lines += _block("→ ", hint)
|
|
467
502
|
return "\n".join(out_lines)
|
|
468
503
|
|
|
469
504
|
|
|
@@ -676,8 +711,11 @@ def _clip_visible(s: str, width: int, ellipsis: str = "…") -> str:
|
|
|
676
711
|
had_escape = True
|
|
677
712
|
i = m.end()
|
|
678
713
|
continue
|
|
714
|
+
w = _char_width(s[i])
|
|
715
|
+
if vis + w > keep:
|
|
716
|
+
break # a wide character never gets cut in half for the ellipsis
|
|
679
717
|
out_chars.append(s[i])
|
|
680
|
-
vis +=
|
|
718
|
+
vis += w
|
|
681
719
|
i += 1
|
|
682
720
|
result = "".join(out_chars) + ellipsis
|
|
683
721
|
if had_escape and not result.endswith(RESET):
|
|
@@ -196,6 +196,7 @@ docs/roadmap/items/BOOST-D23.md
|
|
|
196
196
|
docs/roadmap/items/BOOST-D24.md
|
|
197
197
|
docs/roadmap/items/BOOST-D25.md
|
|
198
198
|
docs/roadmap/items/BOOST-D26.md
|
|
199
|
+
docs/roadmap/items/BOOST-D27.md
|
|
199
200
|
docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md
|
|
200
201
|
docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
|
|
201
202
|
docs/roadmap/items/actionlint-skips-shellcheck-silently.md
|
|
@@ -209,6 +210,7 @@ docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
|
|
|
209
210
|
docs/roadmap/items/bm25-has-no-stemming.md
|
|
210
211
|
docs/roadmap/items/bm25-index-is-one-json-blob.md
|
|
211
212
|
docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
|
|
213
|
+
docs/roadmap/items/bmad-hooks-all-hosts.md
|
|
212
214
|
docs/roadmap/items/boost-first-carried-the-losing-trigger.md
|
|
213
215
|
docs/roadmap/items/boost-first-rule.md
|
|
214
216
|
docs/roadmap/items/boost-langchain-publishing.md
|
|
@@ -573,6 +575,7 @@ tests/eval/golden.jsonl
|
|
|
573
575
|
tests/eval/recommend.jsonl
|
|
574
576
|
tests/eval/taps-scale.txt
|
|
575
577
|
tests/eval/taps.txt
|
|
578
|
+
tests/functional/test_bmad_all_hosts.py
|
|
576
579
|
tests/functional/test_capabilities_policy.py
|
|
577
580
|
tests/functional/test_cli_adapt.py
|
|
578
581
|
tests/functional/test_cli_bmad.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
|