boost-skill-cli 1.2.38__tar.gz → 1.2.39__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.2.38/boost_skill_cli.egg-info → boost_skill_cli-1.2.39}/PKG-INFO +9 -4
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/README.md +8 -3
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/ai.py +49 -24
- boost_skill_cli-1.2.39/boost_cli/core/aihost.py +154 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39/boost_skill_cli.egg-info}/PKG-INFO +9 -4
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- boost_skill_cli-1.2.39/docs/roadmap/items/ai-backend-fanout.md +42 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap.html +41 -2
- boost_skill_cli-1.2.39/tests/unit/test_aihost.py +109 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_hardening.py +26 -3
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.gitattributes +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.gitignore +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/.vale.ini +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/DCO +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/LICENSE +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/Makefile +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/codecov.yml +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/index.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/README.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/examples/README.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/index.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/noxfile.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/setup.cfg +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/style/README.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/style/boost.css +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/style/boost.js +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/style/demo.html +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.38 → boost_skill_cli-1.2.39}/tests/visual/visual_check.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.39
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -1000,9 +1000,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
|
|
|
1000
1000
|
| Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
|
|
1001
1001
|
|
|
1002
1002
|
The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
|
|
1003
|
-
`absorb`, `evolve`, `simulate`)
|
|
1004
|
-
|
|
1005
|
-
available.
|
|
1003
|
+
`absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
|
|
1004
|
+
`claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
|
|
1005
|
+
heuristics when none is available. boost handles the differences: Gemini takes
|
|
1006
|
+
no separate system prompt, so it is folded into the message, and a model id
|
|
1007
|
+
belonging to another vendor is never passed through.
|
|
1008
|
+
|
|
1009
|
+
The retrieval and faithfulness evals were measured against Claude, so treat
|
|
1010
|
+
those floors as Claude-measured rather than a claim about every backend.
|
|
1006
1011
|
|
|
1007
1012
|
## boost as an MCP server
|
|
1008
1013
|
|
|
@@ -282,9 +282,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
|
|
|
282
282
|
| Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
|
|
283
283
|
|
|
284
284
|
The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
|
|
285
|
-
`absorb`, `evolve`, `simulate`)
|
|
286
|
-
|
|
287
|
-
available.
|
|
285
|
+
`absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
|
|
286
|
+
`claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
|
|
287
|
+
heuristics when none is available. boost handles the differences: Gemini takes
|
|
288
|
+
no separate system prompt, so it is folded into the message, and a model id
|
|
289
|
+
belonging to another vendor is never passed through.
|
|
290
|
+
|
|
291
|
+
The retrieval and faithfulness evals were measured against Claude, so treat
|
|
292
|
+
those floors as Claude-measured rather than a claim about every backend.
|
|
288
293
|
|
|
289
294
|
## boost as an MCP server
|
|
290
295
|
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.39'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 39)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -2,9 +2,21 @@
|
|
|
2
2
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
3
3
|
"""Optional AI bridge for the Intelligence commands and --smart ranking.
|
|
4
4
|
|
|
5
|
-
Strategy:
|
|
6
|
-
|
|
7
|
-
degrades to its
|
|
5
|
+
Strategy: use the first assistant CLI on PATH that `core/aihost.py` knows —
|
|
6
|
+
Claude first, then Gemini — else the Anthropic API via urllib when
|
|
7
|
+
ANTHROPIC_API_KEY is set, else return None so every caller degrades to its
|
|
8
|
+
non-AI fallback.
|
|
9
|
+
|
|
10
|
+
The second CLI is why `aihost` exists. Before it, a user running Gemini got the
|
|
11
|
+
heuristic fallback from every AI-assisted command even with a perfectly good
|
|
12
|
+
assistant installed, because this module only ever spelled "claude". The
|
|
13
|
+
per-backend differences that would otherwise be bugs — Gemini has no
|
|
14
|
+
`--append-system-prompt`, and `ai.model` holds a Claude id that `gemini -m`
|
|
15
|
+
would reject — are handled there, as data.
|
|
16
|
+
|
|
17
|
+
The direct-API path stays Anthropic-only. Someone using Gemini CLI has the
|
|
18
|
+
binary by definition, so the CLI route is the one that matters; a second HTTP
|
|
19
|
+
client is a separate change with its own wire format and error taxonomy.
|
|
8
20
|
"""
|
|
9
21
|
from __future__ import annotations
|
|
10
22
|
|
|
@@ -15,7 +27,7 @@ import subprocess
|
|
|
15
27
|
import urllib.error
|
|
16
28
|
import urllib.request
|
|
17
29
|
|
|
18
|
-
from . import config, logs, nethttp
|
|
30
|
+
from . import aihost, config, logs, nethttp
|
|
19
31
|
|
|
20
32
|
API_URL = "https://api.anthropic.com/v1/messages"
|
|
21
33
|
|
|
@@ -30,22 +42,33 @@ def enabled() -> bool:
|
|
|
30
42
|
|
|
31
43
|
|
|
32
44
|
def available() -> bool:
|
|
33
|
-
"""Return True when AI is enabled and
|
|
34
|
-
|
|
35
|
-
CLI on PATH or ANTHROPIC_API_KEY set.
|
|
36
|
-
"""
|
|
45
|
+
"""Return True when AI is enabled and some backend exists."""
|
|
37
46
|
return enabled() and (has_cli() or bool(os.environ.get("ANTHROPIC_API_KEY")))
|
|
38
47
|
|
|
39
48
|
|
|
49
|
+
def cli_backend() -> str | None:
|
|
50
|
+
"""The first assistant CLI on PATH, in `aihost` preference order."""
|
|
51
|
+
for name in aihost.backends():
|
|
52
|
+
if shutil.which(aihost.cli(name)):
|
|
53
|
+
return name
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
|
|
40
57
|
def has_cli() -> bool:
|
|
41
|
-
"""Return True when
|
|
42
|
-
return
|
|
58
|
+
"""Return True when any assistant CLI `aihost` knows is on PATH."""
|
|
59
|
+
return cli_backend() is not None
|
|
43
60
|
|
|
44
61
|
|
|
45
62
|
def fallback_note() -> str:
|
|
46
|
-
"""Return the one-line hint shown when a command degrades to heuristics.
|
|
47
|
-
|
|
48
|
-
|
|
63
|
+
"""Return the one-line hint shown when a command degrades to heuristics.
|
|
64
|
+
|
|
65
|
+
Names every CLI that would work, not just Claude's — telling a Gemini user
|
|
66
|
+
to install Claude is a worse answer than telling them boost could not find
|
|
67
|
+
either.
|
|
68
|
+
"""
|
|
69
|
+
clis = " or ".join("`%s`" % aihost.cli(n) for n in aihost.backends())
|
|
70
|
+
return ("AI features need one of %s on PATH, or ANTHROPIC_API_KEY set "
|
|
71
|
+
"— using the heuristic fallback" % clis)
|
|
49
72
|
|
|
50
73
|
|
|
51
74
|
def ask(prompt: str, system: str | None = None, model: str | None = None,
|
|
@@ -54,8 +77,9 @@ def ask(prompt: str, system: str | None = None, model: str | None = None,
|
|
|
54
77
|
if not enabled():
|
|
55
78
|
return None
|
|
56
79
|
model = model or str(config.get("ai.model"))
|
|
57
|
-
|
|
58
|
-
|
|
80
|
+
backend = cli_backend()
|
|
81
|
+
if backend:
|
|
82
|
+
text = _ask_cli(backend, prompt, system, model, timeout)
|
|
59
83
|
if text:
|
|
60
84
|
return text
|
|
61
85
|
if os.environ.get("ANTHROPIC_API_KEY"):
|
|
@@ -88,26 +112,27 @@ def _stderr_excerpt(text: str | None) -> str:
|
|
|
88
112
|
return (s[:STDERR_LOG_CHARS] + "...") if len(s) > STDERR_LOG_CHARS else s
|
|
89
113
|
|
|
90
114
|
|
|
91
|
-
def _ask_cli(prompt: str, system: str | None, model: str,
|
|
115
|
+
def _ask_cli(backend: str, prompt: str, system: str | None, model: str,
|
|
92
116
|
timeout: int) -> str | None:
|
|
93
|
-
cmd =
|
|
94
|
-
|
|
95
|
-
|
|
117
|
+
cmd = aihost.argv(backend, model, system)
|
|
118
|
+
# A backend with no system flag takes the text folded into the prompt.
|
|
119
|
+
body = aihost.fold_system(backend, system, prompt)
|
|
120
|
+
who = "%s CLI" % aihost.cli(backend)
|
|
96
121
|
try:
|
|
97
|
-
proc = subprocess.run(cmd, input=
|
|
122
|
+
proc = subprocess.run(cmd, input=body, capture_output=True,
|
|
98
123
|
text=True, timeout=timeout)
|
|
99
124
|
except (subprocess.TimeoutExpired, OSError) as e:
|
|
100
125
|
# The exception TYPE only, never str(e): TimeoutExpired stringifies the
|
|
101
|
-
# whole argv, which carries the
|
|
102
|
-
_log_failure(
|
|
126
|
+
# whole argv, which carries the system-prompt text with it.
|
|
127
|
+
_log_failure(who, type(e).__name__)
|
|
103
128
|
return None
|
|
104
129
|
if proc.returncode != 0:
|
|
105
|
-
_log_failure(
|
|
130
|
+
_log_failure(who, "exit %d: %s"
|
|
106
131
|
% (proc.returncode, _stderr_excerpt(proc.stderr)))
|
|
107
132
|
return None
|
|
108
133
|
out = proc.stdout.strip()
|
|
109
134
|
if not out:
|
|
110
|
-
_log_failure(
|
|
135
|
+
_log_failure(who, "empty reply")
|
|
111
136
|
return None
|
|
112
137
|
return out
|
|
113
138
|
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright the boost contributors.
|
|
3
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
4
|
+
"""Per-assistant-CLI facts for the AI bridge — a pure table, like `hookhost`.
|
|
5
|
+
|
|
6
|
+
`core/ai.py` knew exactly one backend: the `claude` CLI, or the Anthropic API
|
|
7
|
+
via ANTHROPIC_API_KEY. Every AI-assisted command therefore degraded to its
|
|
8
|
+
heuristic fallback for a user running Gemini CLI, even though Gemini exposes
|
|
9
|
+
the same headless contract. Skills, MCP, rules, workflows and hooks all fan out
|
|
10
|
+
across hosts; this was the last surface that did not, and it is the one a user
|
|
11
|
+
notices, because the fallback is visibly worse prose.
|
|
12
|
+
|
|
13
|
+
Three per-backend facts do the work, and each is a difference that would
|
|
14
|
+
otherwise be a bug:
|
|
15
|
+
|
|
16
|
+
* **The system prompt.** Claude takes `--append-system-prompt`. Gemini has no
|
|
17
|
+
equivalent, so the system text has to be folded into the prompt body. Passing
|
|
18
|
+
an unknown flag would make every call fail with a usage error rather than
|
|
19
|
+
degrade — the one outcome worse than having no AI at all.
|
|
20
|
+
* **The model id.** `ai.model` defaults to a Claude model name, and handing
|
|
21
|
+
that to `gemini -m` is an error, not a fallback. A backend only receives a
|
|
22
|
+
model id it owns; otherwise the flag is omitted and the CLI picks its own
|
|
23
|
+
default.
|
|
24
|
+
* **Order.** Claude is first, and that is behaviour rather than taste: someone
|
|
25
|
+
with both CLIs installed had Claude answering before this table existed, and
|
|
26
|
+
reordering would silently change every result they get.
|
|
27
|
+
|
|
28
|
+
The direct-API path in `ai.py` stays Anthropic-only. A user of Gemini CLI has
|
|
29
|
+
the `gemini` binary by definition, so the CLI route is the one that matters
|
|
30
|
+
here; a second HTTP client is a separate, larger change with its own wire
|
|
31
|
+
format and error taxonomy.
|
|
32
|
+
"""
|
|
33
|
+
from __future__ import annotations
|
|
34
|
+
|
|
35
|
+
from ..errors import BoostError
|
|
36
|
+
|
|
37
|
+
CLAUDE = "claude"
|
|
38
|
+
GEMINI = "gemini"
|
|
39
|
+
|
|
40
|
+
#: Ordered: the first installed backend wins. See the module docstring on why
|
|
41
|
+
#: Claude must stay at the front.
|
|
42
|
+
BACKENDS: dict[str, dict] = {
|
|
43
|
+
CLAUDE: {
|
|
44
|
+
"cli": "claude",
|
|
45
|
+
"label": "Claude Code",
|
|
46
|
+
"prompt_flag": "-p",
|
|
47
|
+
"model_flag": "--model",
|
|
48
|
+
# Model ids this backend accepts. `ai.model` is a Claude id today, so
|
|
49
|
+
# this is what keeps it from being handed to another CLI.
|
|
50
|
+
"model_prefixes": ("claude", "sonnet", "opus", "haiku"),
|
|
51
|
+
"output_flags": ("--output-format", "text"),
|
|
52
|
+
"system_flag": "--append-system-prompt",
|
|
53
|
+
"key_env": "ANTHROPIC_API_KEY",
|
|
54
|
+
},
|
|
55
|
+
GEMINI: {
|
|
56
|
+
"cli": "gemini",
|
|
57
|
+
"label": "Gemini CLI",
|
|
58
|
+
"prompt_flag": "-p",
|
|
59
|
+
"model_flag": "-m",
|
|
60
|
+
"model_prefixes": ("gemini",),
|
|
61
|
+
"output_flags": ("-o", "text"),
|
|
62
|
+
# No equivalent flag. `fold_system` puts the text in the prompt.
|
|
63
|
+
"system_flag": "",
|
|
64
|
+
"key_env": "GEMINI_API_KEY",
|
|
65
|
+
},
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def backends() -> list[str]:
|
|
70
|
+
"""Known backend ids, in preference order."""
|
|
71
|
+
return list(BACKENDS)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def spec(name: str) -> dict:
|
|
75
|
+
"""The table row for ``name``, or a BoostError naming the alternatives."""
|
|
76
|
+
try:
|
|
77
|
+
return BACKENDS[name]
|
|
78
|
+
except KeyError:
|
|
79
|
+
raise BoostError(
|
|
80
|
+
"unknown AI backend %r" % name,
|
|
81
|
+
hint="use one of: %s" % ", ".join(backends())) from None
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def cli(name: str) -> str:
|
|
85
|
+
"""The executable to run for ``name``."""
|
|
86
|
+
return str(spec(name)["cli"])
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def label(name: str) -> str:
|
|
90
|
+
"""Display name for ``name`` (``gemini`` -> "Gemini CLI")."""
|
|
91
|
+
return str(spec(name)["label"])
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def key_env(name: str) -> str:
|
|
95
|
+
"""The API-key environment variable ``name`` reads."""
|
|
96
|
+
return str(spec(name)["key_env"])
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def takes_system_flag(name: str) -> bool:
|
|
100
|
+
"""Whether ``name`` accepts a separate system prompt."""
|
|
101
|
+
return bool(spec(name)["system_flag"])
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def owns_model(name: str, model: str | None) -> bool:
|
|
105
|
+
"""Whether ``model`` is an id ``name`` clearly owns."""
|
|
106
|
+
if not model:
|
|
107
|
+
return False
|
|
108
|
+
return model.lower().startswith(tuple(spec(name)["model_prefixes"]))
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def accepts_model(name: str, model: str | None) -> bool:
|
|
112
|
+
"""Whether to hand ``model`` to ``name``.
|
|
113
|
+
|
|
114
|
+
The rule is "not another vendor's", not "one of mine". An id that no
|
|
115
|
+
backend claims — a custom alias, a pinned snapshot, anything a user passes
|
|
116
|
+
to `--model` — goes through untouched, because refusing it would silently
|
|
117
|
+
drop an override the user asked for. Only an id another backend plainly
|
|
118
|
+
owns is withheld: `ai.model` defaults to a Claude name, and `gemini -m
|
|
119
|
+
claude-sonnet-4-5` is an error rather than a fallback.
|
|
120
|
+
"""
|
|
121
|
+
if not model:
|
|
122
|
+
return False
|
|
123
|
+
if owns_model(name, model):
|
|
124
|
+
return True
|
|
125
|
+
return not any(owns_model(other, model)
|
|
126
|
+
for other in backends() if other != name)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def fold_system(name: str, system: str | None, prompt: str) -> str:
|
|
130
|
+
"""The prompt to send, with ``system`` folded in when there is no flag.
|
|
131
|
+
|
|
132
|
+
Returned unchanged for a backend that takes a system flag, so Claude's
|
|
133
|
+
request is byte-for-byte what it has always been.
|
|
134
|
+
"""
|
|
135
|
+
if not system or takes_system_flag(name):
|
|
136
|
+
return prompt
|
|
137
|
+
return "%s\n\n%s" % (system, prompt)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def argv(name: str, model: str | None, system: str | None) -> list[str]:
|
|
141
|
+
"""The command line for ``name``, minus the prompt (which goes on stdin).
|
|
142
|
+
|
|
143
|
+
``model`` is passed unless another backend plainly owns the id (see
|
|
144
|
+
`accepts_model`), and ``system`` only when this backend has a flag for one
|
|
145
|
+
— `fold_system` handles the other case.
|
|
146
|
+
"""
|
|
147
|
+
row = spec(name)
|
|
148
|
+
cmd = [str(row["cli"]), str(row["prompt_flag"])]
|
|
149
|
+
if accepts_model(name, model):
|
|
150
|
+
cmd += [str(row["model_flag"]), str(model)]
|
|
151
|
+
cmd += [str(x) for x in row["output_flags"]]
|
|
152
|
+
if system and row["system_flag"]:
|
|
153
|
+
cmd += [str(row["system_flag"]), system]
|
|
154
|
+
return cmd
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.39
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -1000,9 +1000,14 @@ the C4 diagrams in [`docs/architecture/`](docs/architecture/README.md).
|
|
|
1000
1000
|
| Team & Collaboration | cohort · profile · protocol · pulse · replay · who |
|
|
1001
1001
|
|
|
1002
1002
|
The AI-assisted commands (`search --smart`, `explain`, `distill`, `infer`,
|
|
1003
|
-
`absorb`, `evolve`, `simulate`)
|
|
1004
|
-
|
|
1005
|
-
available.
|
|
1003
|
+
`absorb`, `evolve`, `simulate`) use whichever assistant CLI you already have —
|
|
1004
|
+
`claude` first, then `gemini` — or `ANTHROPIC_API_KEY`, and fall back to plain
|
|
1005
|
+
heuristics when none is available. boost handles the differences: Gemini takes
|
|
1006
|
+
no separate system prompt, so it is folded into the message, and a model id
|
|
1007
|
+
belonging to another vendor is never passed through.
|
|
1008
|
+
|
|
1009
|
+
The retrieval and faithfulness evals were measured against Claude, so treat
|
|
1010
|
+
those floors as Claude-measured rather than a claim about every backend.
|
|
1006
1011
|
|
|
1007
1012
|
## boost as an MCP server
|
|
1008
1013
|
|
|
@@ -56,6 +56,7 @@ boost_cli/core/__init__.py
|
|
|
56
56
|
boost_cli/core/adapters.py
|
|
57
57
|
boost_cli/core/agents.py
|
|
58
58
|
boost_cli/core/ai.py
|
|
59
|
+
boost_cli/core/aihost.py
|
|
59
60
|
boost_cli/core/bmad.py
|
|
60
61
|
boost_cli/core/bootstrap.py
|
|
61
62
|
boost_cli/core/browse.py
|
|
@@ -202,6 +203,7 @@ docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md
|
|
|
202
203
|
docs/roadmap/items/actionlint-skips-shellcheck-silently.md
|
|
203
204
|
docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md
|
|
204
205
|
docs/roadmap/items/agents-field-records-the-request-not-the-links.md
|
|
206
|
+
docs/roadmap/items/ai-backend-fanout.md
|
|
205
207
|
docs/roadmap/items/ai-bridge-silent-failure-logging.md
|
|
206
208
|
docs/roadmap/items/ambiguous-tap-short-name-resolution.md
|
|
207
209
|
docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
|
|
@@ -637,6 +639,7 @@ tests/unit/test_adapters_multi.py
|
|
|
637
639
|
tests/unit/test_adapters_runner.py
|
|
638
640
|
tests/unit/test_agents.py
|
|
639
641
|
tests/unit/test_ai.py
|
|
642
|
+
tests/unit/test_aihost.py
|
|
640
643
|
tests/unit/test_bmad_core.py
|
|
641
644
|
tests/unit/test_boost_first_offer.py
|
|
642
645
|
tests/unit/test_bootstrap.py
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: ai-backend-fanout
|
|
3
|
+
board: code
|
|
4
|
+
section: shipped
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Agents · Parity
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: the last surface that only spoke Claude — and the one a user can see
|
|
11
|
+
order: 13
|
|
12
|
+
owner: loop/ai-backends
|
|
13
|
+
pr:
|
|
14
|
+
title: A Gemini user got the heuristic fallback from every AI command
|
|
15
|
+
---
|
|
16
|
+
Skills, MCP, rules, workflows and hooks all fan out across agents. <code>core/ai.py</code>
|
|
17
|
+
did not: it knew the <code>claude</code> CLI, or <code>ANTHROPIC_API_KEY</code>, and nothing
|
|
18
|
+
else. So <code>explain</code>, <code>search --smart</code>, <code>distill</code>,
|
|
19
|
+
<code>infer</code>, <code>absorb</code>, <code>evolve</code> and <code>simulate</code> all
|
|
20
|
+
degraded to their heuristic fallbacks for a user running Gemini CLI — with a perfectly good
|
|
21
|
+
assistant installed. <b>This was the last Claude-only surface, and the one a user actually
|
|
22
|
+
sees</b>, because the difference between the two paths is the difference between synthesised
|
|
23
|
+
prose and a structural summary.
|
|
24
|
+
<code>core/aihost.py</code> is the table, built like <code>hookhost</code>: per-backend facts
|
|
25
|
+
as data, testable without spending a token or running a subprocess. Three of those facts are
|
|
26
|
+
differences that would otherwise be bugs. <b>Gemini has no
|
|
27
|
+
<code>--append-system-prompt</code></b>, so the system text is folded into the prompt body —
|
|
28
|
+
passing an unknown flag would make every call fail with a usage error rather than degrade,
|
|
29
|
+
which is the one outcome worse than having no AI at all. <b><code>ai.model</code> holds a
|
|
30
|
+
Claude id</b>, and <code>gemini -m claude-sonnet-4-5</code> is an error, not a fallback. And
|
|
31
|
+
<b>Claude stays first</b>, which is behaviour rather than taste: anyone with both CLIs had
|
|
32
|
+
Claude answering before this existed, and reordering would silently change every result.
|
|
33
|
+
<b>An existing test caught a real regression.</b> The first model rule asked "does this backend
|
|
34
|
+
own the id", which quietly dropped an explicit <code>--model m-x</code> override on Claude.
|
|
35
|
+
<code>test_cli_explicit_model_and_timeout</code> went red and was right to. The corrected rule
|
|
36
|
+
is <b>"not another vendor's"</b>, not "one of mine": an id no backend claims — a custom alias, a
|
|
37
|
+
pinned snapshot — goes through untouched, and only an id another backend plainly owns is
|
|
38
|
+
withheld.
|
|
39
|
+
<b>Scoped honestly.</b> The direct-API path stays Anthropic-only; someone using Gemini CLI has
|
|
40
|
+
the binary by definition, and a second HTTP client is a separate change with its own wire
|
|
41
|
+
format and error taxonomy. The eval floors were measured against Claude, and the README now
|
|
42
|
+
says so rather than implying the numbers describe every backend.
|
|
@@ -130,10 +130,10 @@
|
|
|
130
130
|
<section class="block reveal">
|
|
131
131
|
<div class="stats">
|
|
132
132
|
<!-- ROADMAP:stats -->
|
|
133
|
-
<div class="stat"><b>
|
|
133
|
+
<div class="stat"><b>19</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>282</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -465,6 +465,45 @@ had quietly stopped being true; it says what is actually so now.</p></details>
|
|
|
465
465
|
</div>
|
|
466
466
|
</article>
|
|
467
467
|
|
|
468
|
+
<article class="cap rcard" id="ai-backend-fanout">
|
|
469
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Agents · Parity</span></div>
|
|
470
|
+
<h3>A Gemini user got the heuristic fallback from every AI command</h3>
|
|
471
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
472
|
+
<p>Skills, MCP, rules, workflows and hooks all fan out across agents. <code>core/ai.py</code>
|
|
473
|
+
did not: it knew the <code>claude</code> CLI, or <code>ANTHROPIC_API_KEY</code>, and nothing
|
|
474
|
+
else. So <code>explain</code>, <code>search --smart</code>, <code>distill</code>,
|
|
475
|
+
<code>infer</code>, <code>absorb</code>, <code>evolve</code> and <code>simulate</code> all
|
|
476
|
+
degraded to their heuristic fallbacks for a user running Gemini CLI — with a perfectly good
|
|
477
|
+
assistant installed. <b>This was the last Claude-only surface, and the one a user actually
|
|
478
|
+
sees</b>, because the difference between the two paths is the difference between synthesised
|
|
479
|
+
prose and a structural summary.
|
|
480
|
+
<code>core/aihost.py</code> is the table, built like <code>hookhost</code>: per-backend facts
|
|
481
|
+
as data, testable without spending a token or running a subprocess. Three of those facts are
|
|
482
|
+
differences that would otherwise be bugs. <b>Gemini has no
|
|
483
|
+
<code>--append-system-prompt</code></b>, so the system text is folded into the prompt body —
|
|
484
|
+
passing an unknown flag would make every call fail with a usage error rather than degrade,
|
|
485
|
+
which is the one outcome worse than having no AI at all. <b><code>ai.model</code> holds a
|
|
486
|
+
Claude id</b>, and <code>gemini -m claude-sonnet-4-5</code> is an error, not a fallback. And
|
|
487
|
+
<b>Claude stays first</b>, which is behaviour rather than taste: anyone with both CLIs had
|
|
488
|
+
Claude answering before this existed, and reordering would silently change every result.
|
|
489
|
+
<b>An existing test caught a real regression.</b> The first model rule asked "does this backend
|
|
490
|
+
own the id", which quietly dropped an explicit <code>--model m-x</code> override on Claude.
|
|
491
|
+
<code>test_cli_explicit_model_and_timeout</code> went red and was right to. The corrected rule
|
|
492
|
+
is <b>"not another vendor's"</b>, not "one of mine": an id no backend claims — a custom alias, a
|
|
493
|
+
pinned snapshot — goes through untouched, and only an id another backend plainly owns is
|
|
494
|
+
withheld.
|
|
495
|
+
<b>Scoped honestly.</b> The direct-API path stays Anthropic-only; someone using Gemini CLI has
|
|
496
|
+
the binary by definition, and a second HTTP client is a separate change with its own wire
|
|
497
|
+
format and error taxonomy. The eval floors were measured against Claude, and the README now
|
|
498
|
+
says so rather than implying the numbers describe every backend.</p></details>
|
|
499
|
+
<div class="meta">
|
|
500
|
+
<span class="m">Complexity <b>S</b></span>
|
|
501
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
502
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
503
|
+
<span class="m">the last surface that only spoke Claude — and the one a user can see</span>
|
|
504
|
+
</div>
|
|
505
|
+
</article>
|
|
506
|
+
|
|
468
507
|
<article class="cap rcard" id="reuse-helpers-kill-minor-dead-work">
|
|
469
508
|
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Tech-debt</span></div>
|
|
470
509
|
<h3>Reuse helpers; kill minor dead work</h3>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Copyright the boost contributors.
|
|
2
|
+
# SPDX-License-Identifier: GPL-3.0-only
|
|
3
|
+
"""The AI bridge must reach whichever assistant CLI the user actually has.
|
|
4
|
+
|
|
5
|
+
`core/ai.py` knew one backend: the `claude` CLI, or ANTHROPIC_API_KEY. Every
|
|
6
|
+
AI-assisted command -- `explain`, `search --smart`, `distill`, `infer`,
|
|
7
|
+
`absorb`, `evolve`, `simulate` -- therefore degraded to its heuristic fallback
|
|
8
|
+
for someone running Gemini CLI, even though Gemini exposes the same headless
|
|
9
|
+
contract (`-p`, `-m`, `-o text`). Skills, MCP, rules, workflows and hooks all
|
|
10
|
+
fan out across hosts; this was the last surface that did not, and it is the one
|
|
11
|
+
a user notices, because the fallback is visibly worse prose.
|
|
12
|
+
|
|
13
|
+
The table lives apart from the calling code for the same reason `hookhost` does:
|
|
14
|
+
a per-backend fact is data, and a test can assert on data without running a
|
|
15
|
+
subprocess or spending a token.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
from boost_cli.core import aihost
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TestTable:
|
|
25
|
+
def test_claude_is_first(self):
|
|
26
|
+
"""Preference order is behaviour: Claude must keep winning.
|
|
27
|
+
|
|
28
|
+
Someone with both CLIs installed had Claude answering before this
|
|
29
|
+
existed. Reordering would silently change every AI result they get.
|
|
30
|
+
"""
|
|
31
|
+
assert aihost.backends()[0] == aihost.CLAUDE
|
|
32
|
+
|
|
33
|
+
def test_every_backend_is_complete(self):
|
|
34
|
+
for name in aihost.backends():
|
|
35
|
+
spec = aihost.spec(name)
|
|
36
|
+
assert spec["cli"], name
|
|
37
|
+
assert spec["prompt_flag"], name
|
|
38
|
+
assert spec["label"], name
|
|
39
|
+
|
|
40
|
+
def test_unknown_backend_names_the_alternatives(self):
|
|
41
|
+
with pytest.raises(Exception) as e:
|
|
42
|
+
aihost.spec("copilot")
|
|
43
|
+
# BoostError keeps the actionable half in `hint`, not in str(); a test
|
|
44
|
+
# that only reads str() would pass on an error with no way forward.
|
|
45
|
+
hint = getattr(e.value, "hint", "") or ""
|
|
46
|
+
assert "claude" in hint and "gemini" in hint, hint
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class TestArgv:
|
|
50
|
+
def test_claude_argv_is_byte_for_byte_what_it_always_was(self):
|
|
51
|
+
"""The existing command line is a contract; a refactor must not move it."""
|
|
52
|
+
argv = aihost.argv(aihost.CLAUDE, model="sonnet", system="SYS")
|
|
53
|
+
assert argv[:2] == ["claude", "-p"]
|
|
54
|
+
assert "--model" in argv and "sonnet" in argv
|
|
55
|
+
assert "--output-format" in argv and "text" in argv
|
|
56
|
+
assert "--append-system-prompt" in argv and "SYS" in argv
|
|
57
|
+
|
|
58
|
+
def test_gemini_argv_uses_its_own_flags(self):
|
|
59
|
+
argv = aihost.argv(aihost.GEMINI, model=None, system=None)
|
|
60
|
+
assert argv[0] == "gemini"
|
|
61
|
+
assert "-p" in argv
|
|
62
|
+
assert "-o" in argv and "text" in argv
|
|
63
|
+
|
|
64
|
+
def test_a_backend_without_a_system_flag_never_invents_one(self):
|
|
65
|
+
"""Gemini has no --append-system-prompt; the caller must fold it in.
|
|
66
|
+
|
|
67
|
+
Passing an unknown flag would make every call fail with a usage error
|
|
68
|
+
rather than degrade, which is the one outcome worse than no AI at all.
|
|
69
|
+
"""
|
|
70
|
+
argv = aihost.argv(aihost.GEMINI, model=None, system="SYS")
|
|
71
|
+
assert "--append-system-prompt" not in argv
|
|
72
|
+
assert "SYS" not in argv
|
|
73
|
+
|
|
74
|
+
def test_a_claude_model_id_is_never_handed_to_gemini(self):
|
|
75
|
+
"""`ai.model` defaults to a Claude id; passing it to gemini is an error."""
|
|
76
|
+
argv = aihost.argv(aihost.GEMINI, model="claude-sonnet-4-5", system=None)
|
|
77
|
+
assert "claude-sonnet-4-5" not in argv
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class TestFolding:
|
|
81
|
+
def test_system_is_folded_into_the_prompt_when_unsupported(self):
|
|
82
|
+
folded = aihost.fold_system(aihost.GEMINI, "SYS", "ASK")
|
|
83
|
+
assert "SYS" in folded and "ASK" in folded
|
|
84
|
+
assert folded.index("SYS") < folded.index("ASK")
|
|
85
|
+
|
|
86
|
+
def test_system_is_left_alone_when_the_backend_takes_a_flag(self):
|
|
87
|
+
assert aihost.fold_system(aihost.CLAUDE, "SYS", "ASK") == "ASK"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class TestModelRule:
|
|
91
|
+
""""Not another vendor's", not "one of mine" — an override must survive."""
|
|
92
|
+
|
|
93
|
+
def test_an_unknown_id_reaches_the_backend(self):
|
|
94
|
+
"""A custom alias or pinned snapshot is the user's business, not ours.
|
|
95
|
+
|
|
96
|
+
The first version of this rule asked "does this backend own the id",
|
|
97
|
+
which silently dropped `--model m-x` on Claude. An existing test caught
|
|
98
|
+
it; this pins the corrected rule.
|
|
99
|
+
"""
|
|
100
|
+
assert aihost.accepts_model(aihost.CLAUDE, "m-x") is True
|
|
101
|
+
assert "m-x" in aihost.argv(aihost.CLAUDE, model="m-x", system=None)
|
|
102
|
+
|
|
103
|
+
def test_another_vendors_id_is_withheld(self):
|
|
104
|
+
assert aihost.accepts_model(aihost.GEMINI, "claude-sonnet-4-5") is False
|
|
105
|
+
assert aihost.accepts_model(aihost.CLAUDE, "gemini-2.5-pro") is False
|
|
106
|
+
|
|
107
|
+
def test_its_own_id_is_accepted(self):
|
|
108
|
+
assert aihost.accepts_model(aihost.GEMINI, "gemini-2.5-pro") is True
|
|
109
|
+
assert aihost.accepts_model(aihost.CLAUDE, "claude-opus-4") is True
|
|
@@ -13,7 +13,16 @@ from datetime import UTC, datetime, timedelta
|
|
|
13
13
|
|
|
14
14
|
import pytest
|
|
15
15
|
|
|
16
|
-
from boost_cli.core import
|
|
16
|
+
from boost_cli.core import (
|
|
17
|
+
ai,
|
|
18
|
+
aihost,
|
|
19
|
+
catalog,
|
|
20
|
+
frontmatter,
|
|
21
|
+
gitutil,
|
|
22
|
+
journal,
|
|
23
|
+
store,
|
|
24
|
+
util,
|
|
25
|
+
)
|
|
17
26
|
from boost_cli.core import output as out
|
|
18
27
|
from boost_cli.errors import BoostError
|
|
19
28
|
|
|
@@ -82,9 +91,23 @@ class TestExactStrings:
|
|
|
82
91
|
"""Kills string-literal mutants in user-facing messages."""
|
|
83
92
|
|
|
84
93
|
def test_ai_fallback_note_verbatim(self):
|
|
94
|
+
# The note names every CLI that would work, built from `aihost`'s
|
|
95
|
+
# table rather than hardcoded: telling a Gemini user to install Claude
|
|
96
|
+
# is a worse answer than saying boost could not find either. Still
|
|
97
|
+
# asserted verbatim, because the point of this class is to kill
|
|
98
|
+
# string-literal mutants in what the user actually reads.
|
|
85
99
|
assert ai.fallback_note() == (
|
|
86
|
-
"AI features need
|
|
87
|
-
"set — using the heuristic fallback")
|
|
100
|
+
"AI features need one of `claude` or `gemini` on PATH, or "
|
|
101
|
+
"ANTHROPIC_API_KEY set — using the heuristic fallback")
|
|
102
|
+
|
|
103
|
+
def test_fallback_note_names_every_backend(self):
|
|
104
|
+
"""A backend added to the table must appear in the note, not silently.
|
|
105
|
+
|
|
106
|
+
The verbatim assertion above would still pass if the note were
|
|
107
|
+
hardcoded; this one fails if the sentence stops being derived.
|
|
108
|
+
"""
|
|
109
|
+
for name in aihost.backends():
|
|
110
|
+
assert "`%s`" % aihost.cli(name) in ai.fallback_note(), name
|
|
88
111
|
|
|
89
112
|
def test_missing_git_hint_verbatim(self, monkeypatch):
|
|
90
113
|
monkeypatch.setattr(gitutil.shutil, "which", lambda _: None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|