boost-skill-cli 1.0.421__tar.gz → 1.0.423__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.0.421/boost_skill_cli.egg-info → boost_skill_cli-1.0.423}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/configuration.py +152 -14
- boost_skill_cli-1.0.423/boost_cli/core/builtin.py +114 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/catalog.py +22 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/mcp.py +128 -1
- boost_skill_cli-1.0.423/boost_cli/data/rules/boost-first.mdc +35 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/SOURCES.txt +6 -0
- boost_skill_cli-1.0.423/docs/demo.gif +0 -0
- boost_skill_cli-1.0.423/docs/roadmap/items/boost-first-rule.md +73 -0
- boost_skill_cli-1.0.423/docs/roadmap/items/mcp-already-covered-defeater.md +77 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap.html +145 -1
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/pyproject.toml +1 -1
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/environment.py +3 -1
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/conftest.py +5 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_configuration.py +8 -1
- boost_skill_cli-1.0.423/tests/unit/test_boost_first_offer.py +179 -0
- boost_skill_cli-1.0.423/tests/unit/test_builtin.py +169 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_catalog.py +38 -0
- boost_skill_cli-1.0.423/tests/unit/test_mcp.py +1100 -0
- boost_skill_cli-1.0.421/docs/demo.gif +0 -0
- boost_skill_cli-1.0.421/tests/unit/test_mcp.py +0 -584
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.gitattributes +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.gitignore +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/.vale.ini +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/LICENSE +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/Makefile +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/README.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/codecov.yml +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/index.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/langchain.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/README.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/examples/README.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/index.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/noxfile.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/setup.cfg +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/README.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/boost.css +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/boost.js +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/style/demo.html +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.421 → boost_skill_cli-1.0.423}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.423'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 423)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -11,12 +11,14 @@ import subprocess
|
|
|
11
11
|
import sys
|
|
12
12
|
import time
|
|
13
13
|
from datetime import datetime, timedelta
|
|
14
|
+
from itertools import chain
|
|
14
15
|
from pathlib import Path
|
|
15
16
|
|
|
16
17
|
from .. import __version__, cliparse
|
|
17
18
|
from ..core import (
|
|
18
19
|
agents,
|
|
19
20
|
bootstrap,
|
|
21
|
+
builtin,
|
|
20
22
|
catalog,
|
|
21
23
|
complete,
|
|
22
24
|
config,
|
|
@@ -32,6 +34,7 @@ from ..core import (
|
|
|
32
34
|
policy,
|
|
33
35
|
rag,
|
|
34
36
|
registry,
|
|
37
|
+
rules,
|
|
35
38
|
selfupdate,
|
|
36
39
|
serve,
|
|
37
40
|
store,
|
|
@@ -862,6 +865,15 @@ def _ranking_note(ranker: str) -> str:
|
|
|
862
865
|
"enable it.)" % ranker)
|
|
863
866
|
|
|
864
867
|
|
|
868
|
+
# The label for the pre-RAG fallback below. `_ranking_note` needs a name for
|
|
869
|
+
# whatever produced the order, and this branch is neither engine it knows
|
|
870
|
+
# about: `catalog.search` scores names and descriptions from the tap caches
|
|
871
|
+
# because no index exists yet. `rag.rerank`'s own comment is the rule being
|
|
872
|
+
# followed — naming a specific wrong engine is worse than naming none, since
|
|
873
|
+
# the label is the only signal about which retrieval answered.
|
|
874
|
+
FRONTMATTER_RANKER = "frontmatter match, no index built yet"
|
|
875
|
+
|
|
876
|
+
|
|
865
877
|
def _tool_search(args: dict):
|
|
866
878
|
query = str(args.get("query", ""))
|
|
867
879
|
rag.ensure() # build the full-content index on first use (BM25 by default)
|
|
@@ -882,27 +894,54 @@ def _tool_search(args: dict):
|
|
|
882
894
|
# miss apart from a machine that has never been tapped — the two used to
|
|
883
895
|
# share one sentence, and the fresh-install case is the one an agent reads
|
|
884
896
|
# first and learns the most from.
|
|
885
|
-
tapped =
|
|
897
|
+
tapped = builtin.configured_tap_count()
|
|
898
|
+
# The two retrieval branches converge on ONE render. They used to diverge:
|
|
899
|
+
# the RAG branch appended `_ranking_note`, and the frontmatter fallback
|
|
900
|
+
# appended nothing at all — so an agent on that path got ten lines with the
|
|
901
|
+
# exact shape of a reranked ten, and no way to tell. Both now carry the
|
|
902
|
+
# kind marker, the [installed] marker, the overlap note and a ranking note.
|
|
886
903
|
if rag_result is not None: # full-content index is built
|
|
887
904
|
hits, ranker = rag_result
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
if not scored:
|
|
905
|
+
entries = [h["entry"] for h in hits]
|
|
906
|
+
else: # no index yet -> today's frontmatter search, so nothing regresses
|
|
907
|
+
entries = [e for e, _score in catalog.search(query)[:10]]
|
|
908
|
+
ranker = FRONTMATTER_RANKER
|
|
909
|
+
if not entries:
|
|
910
|
+
# mcp.no_results owns the empty reply on both paths, including the
|
|
911
|
+
# untapped-machine branch that must not read as a genuine miss.
|
|
896
912
|
return mcp.no_results(query, tapped=tapped), False
|
|
897
|
-
|
|
913
|
+
# Name-keyed, the same test `lockfile.find_any` and `store.install` apply —
|
|
914
|
+
# those are the tools this marker is advising about. mcp.hit_line's
|
|
915
|
+
# docstring records why the imprecision is disclosed rather than removed,
|
|
916
|
+
# and mcp.overlap_note is where the agent is told.
|
|
917
|
+
#
|
|
918
|
+
# One lock read for the whole reply, not one per hit: `find_any` re-reads
|
|
919
|
+
# and re-parses the file on every call, so the obvious `find_any(name)`
|
|
920
|
+
# inside this comprehension is ten reads of the same bytes. The union of
|
|
921
|
+
# the three sections is that same predicate, once.
|
|
922
|
+
installed_names = set(chain.from_iterable(lockfile.all_installed().values()))
|
|
923
|
+
marks = [e.get("name", "") in installed_names for e in entries]
|
|
924
|
+
lines = [mcp.hit_line(e, installed=m)
|
|
925
|
+
for e, m in zip(entries, marks, strict=True)]
|
|
926
|
+
note = mcp.overlap_note(sum(marks), len(entries))
|
|
927
|
+
if note:
|
|
928
|
+
lines.append(note)
|
|
929
|
+
lines.append(_ranking_note(ranker))
|
|
930
|
+
return "\n".join(lines), False
|
|
898
931
|
|
|
899
932
|
|
|
900
933
|
def _tool_list(args: dict):
|
|
901
934
|
# All three lock sections: "no skills installed" while `boost list` shows
|
|
902
935
|
# a rule is the exact disagreement this surface must not have.
|
|
903
936
|
everything = lockfile.all_installed()
|
|
937
|
+
# The footer reads the lock file and the tap list and nothing else — no
|
|
938
|
+
# catalog scan — so boost_list stays the instant, threshold-free tool that
|
|
939
|
+
# INSTRUCTIONS and its own description both promise. It lands in the empty
|
|
940
|
+
# state too: a machine with nothing installed is exactly where "what do I
|
|
941
|
+
# have" is least useful on its own.
|
|
942
|
+
footer = mcp.coverage_line(everything, tapped=builtin.configured_tap_count())
|
|
904
943
|
if not any(everything.values()):
|
|
905
|
-
return "nothing installed", False
|
|
944
|
+
return "nothing installed\n" + footer, False
|
|
906
945
|
lines = []
|
|
907
946
|
for kind, section in everything.items():
|
|
908
947
|
for n, e in sorted(section.items()):
|
|
@@ -910,6 +949,7 @@ def _tool_list(args: dict):
|
|
|
910
949
|
% (n, e.get("version", "?"), e.get("tap", "?"),
|
|
911
950
|
"" if kind == "skill" else " [%s]" % kind,
|
|
912
951
|
" [pinned]" if e.get("pinned") else ""))
|
|
952
|
+
lines.append(footer)
|
|
913
953
|
return "\n".join(lines), False
|
|
914
954
|
|
|
915
955
|
|
|
@@ -991,7 +1031,13 @@ def _tool_doctor(args: dict):
|
|
|
991
1031
|
# "items", not "skills": the default taps now carry rules and
|
|
992
1032
|
# workflows too, so counting all of them as skills overstates one
|
|
993
1033
|
# kind and hides the other two in the same breath.
|
|
994
|
-
|
|
1034
|
+
#
|
|
1035
|
+
# Counted rather than measured off a list. `len(all_entries())`
|
|
1036
|
+
# concatenated every tap's cache — 71,655 entries on a real
|
|
1037
|
+
# install — to produce this one integer; `kind_counts` does the
|
|
1038
|
+
# same reads without the accumulation.
|
|
1039
|
+
"taps: %d (%d items available)"
|
|
1040
|
+
% (len(taps), sum(catalog.kind_counts().values()))]
|
|
995
1041
|
for key, vals in plan.items():
|
|
996
1042
|
if vals:
|
|
997
1043
|
lines.append("%s: %s" % (key, ", ".join(str(v) for v in vals)))
|
|
@@ -1080,7 +1126,21 @@ REGISTRY.register(
|
|
|
1080
1126
|
"locked in for everything after it: a new project or subsystem, an "
|
|
1081
1127
|
"architecture decision, environment and tooling config, a linter or "
|
|
1082
1128
|
"formatter, tests, CI. Also before writing a skill, subagent, "
|
|
1083
|
-
"slash-command or rule from scratch.
|
|
1129
|
+
"slash-command or rule from scratch. "
|
|
1130
|
+
# The defeater, sitting against the trigger list it defends rather than in
|
|
1131
|
+
# a paragraph of its own. A Gemini CLI session paraphrased that list back
|
|
1132
|
+
# — "a new project or subsystem, an architecture decision, environment and
|
|
1133
|
+
# tooling config" — and had still skipped the call, because two
|
|
1134
|
+
# pre-installed skills had already activated. The trigger fired and lost to
|
|
1135
|
+
# a predicate over the model's own context that boost had never written
|
|
1136
|
+
# down. It is a description, not a denial: an agent told "an active skill
|
|
1137
|
+
# is never enough" has been handed a standing order to search, which is the
|
|
1138
|
+
# capture the skip list and the stated cost exist to prevent.
|
|
1139
|
+
"What is already loaded is a different question: "
|
|
1140
|
+
"a skill that activated here was installed before this request existed, "
|
|
1141
|
+
"matched on its own description, and is one kind of three. Hits you "
|
|
1142
|
+
"already have come back marked [installed], so the reply keeps the two "
|
|
1143
|
+
"apart. Read-only where it counts: it "
|
|
1084
1144
|
"installs nothing and touches nothing you are working on, though the first "
|
|
1085
1145
|
"search builds a local index under ~/.boost. A hit commits you to nothing "
|
|
1086
1146
|
"either: take what fits, discard the rest, the task stays yours. It costs "
|
|
@@ -1103,7 +1163,11 @@ REGISTRY.register(
|
|
|
1103
1163
|
"The skills, rules and workflows already installed on this machine and "
|
|
1104
1164
|
"usable this second — capability you own and may not know you own. "
|
|
1105
1165
|
"Returns one line each: name, version, tap, a [rule] or [workflow] marker "
|
|
1106
|
-
"where it is not a skill, and [pinned] where the version is held
|
|
1166
|
+
"where it is not a skill, and [pinned] where the version is held, then a "
|
|
1167
|
+
"closing count per kind. That count is the other half of the answer: it is "
|
|
1168
|
+
"what this machine holds, not what exists, and a kind sitting at zero is a "
|
|
1169
|
+
"kind nothing here could have loaded. boost_search is what reads the "
|
|
1170
|
+
"registries themselves. "
|
|
1107
1171
|
"Read-only, instant, installs nothing — so unlike boost_search there is "
|
|
1108
1172
|
"no threshold worth applying: call it whenever you are about to plan "
|
|
1109
1173
|
"something. Planning from memory while "
|
|
@@ -1250,6 +1314,78 @@ def _seed_catalog_for_mcp(force: bool) -> None:
|
|
|
1250
1314
|
out.warn(res.summary())
|
|
1251
1315
|
|
|
1252
1316
|
|
|
1317
|
+
#: Escape hatch, same shape as BOOST_NO_MCP_OFFER and BOOST_NO_SEED. It is
|
|
1318
|
+
#: checked BEFORE `out.confirm`, which is load-bearing: confirm returns True
|
|
1319
|
+
#: under BOOST_ASSUME_YES or a bare `--yes` anywhere in argv, and the test
|
|
1320
|
+
#: fixtures set BOOST_ASSUME_YES=1 — so without this guard every existing
|
|
1321
|
+
#: `boost mcp register` test, and every provisioning script, would silently
|
|
1322
|
+
#: write a standing block into a real CLAUDE.md.
|
|
1323
|
+
NO_RULE_ENV = "BOOST_NO_RULE"
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
def _offer_boost_first(hosts: list[str]) -> None:
|
|
1327
|
+
"""Offer to install boost's own rule into the agent's standing instructions.
|
|
1328
|
+
|
|
1329
|
+
This is the most invasive thing boost can propose, and the only text it
|
|
1330
|
+
asks to put in a file the user reads every session, in every project — so
|
|
1331
|
+
the consent has to be real rather than procedural. The body is printed in
|
|
1332
|
+
full BEFORE the question, the target paths are named, the answer defaults
|
|
1333
|
+
to NO, and the reversal command is shown whether or not they accept.
|
|
1334
|
+
|
|
1335
|
+
Why it exists at all: Gemini never delivers MCP server `instructions` in
|
|
1336
|
+
interactive mode, and in an untrusted folder — which a brand-new project
|
|
1337
|
+
directory is by default — it does not start the server, so boost has no
|
|
1338
|
+
tools there either. `~/.gemini/GEMINI.md` is loaded unconditionally and is
|
|
1339
|
+
the only boost surface that survives both. Declining is a perfectly good
|
|
1340
|
+
answer; the tool descriptions still carry the trigger on every host that
|
|
1341
|
+
delivers them.
|
|
1342
|
+
|
|
1343
|
+
Non-fatal by construction. The user asked to register an MCP server; a
|
|
1344
|
+
failure to materialise an optional rule must never turn that into an
|
|
1345
|
+
error, so everything below degrades to a warning.
|
|
1346
|
+
"""
|
|
1347
|
+
from ..core import builtin
|
|
1348
|
+
|
|
1349
|
+
if os.environ.get(NO_RULE_ENV):
|
|
1350
|
+
return
|
|
1351
|
+
# Scoped to hosts where boost actually registered a server. Offering it for
|
|
1352
|
+
# an agent with no boost tools would install standing text naming
|
|
1353
|
+
# `boost_search` to an agent that does not have it.
|
|
1354
|
+
if not hosts or not builtin.rule_is_available():
|
|
1355
|
+
return
|
|
1356
|
+
if lockfile.get_rule(builtin.BUILTIN_RULES[0]):
|
|
1357
|
+
return # already installed; do not re-ask
|
|
1358
|
+
body = (builtin.source_dir() / (builtin.BUILTIN_RULES[0] + ".mdc"))
|
|
1359
|
+
targets = [str(rules.rule_target(agent, skills_dir,
|
|
1360
|
+
builtin.BUILTIN_RULES[0])[1])
|
|
1361
|
+
for agent, skills_dir in agents.enabled_agents().items()
|
|
1362
|
+
if agent in {builtin.AGENT_FOR_HOST.get(h) for h in hosts}]
|
|
1363
|
+
if not targets:
|
|
1364
|
+
return
|
|
1365
|
+
out.info("")
|
|
1366
|
+
out.info("boost can also add its own rule, `%s`, to your agents' standing "
|
|
1367
|
+
"instructions:" % builtin.BUILTIN_RULES[0])
|
|
1368
|
+
for target in targets:
|
|
1369
|
+
out.info(" %s" % target)
|
|
1370
|
+
out.info("")
|
|
1371
|
+
for line in body.read_text(encoding="utf-8").splitlines():
|
|
1372
|
+
out.info(" | %s" % line)
|
|
1373
|
+
out.info("")
|
|
1374
|
+
if not out.confirm("Install it?", default=False):
|
|
1375
|
+
out.info("Not installed. `boost install %s` any time."
|
|
1376
|
+
% builtin.BUILTIN_RULES[0])
|
|
1377
|
+
return
|
|
1378
|
+
try:
|
|
1379
|
+
builtin.ensure_tap()
|
|
1380
|
+
catalog.rebuild_tap(registry.get(builtin.BUILTIN_TAP))
|
|
1381
|
+
store.install(catalog.resolve_one(builtin.BUILTIN_RULES[0]))
|
|
1382
|
+
except (BoostError, OSError) as exc:
|
|
1383
|
+
out.warn("could not install %s: %s" % (builtin.BUILTIN_RULES[0], exc))
|
|
1384
|
+
return
|
|
1385
|
+
out.ok("installed %s — remove it with `boost uninstall %s`"
|
|
1386
|
+
% (builtin.BUILTIN_RULES[0], builtin.BUILTIN_RULES[0]))
|
|
1387
|
+
|
|
1388
|
+
|
|
1253
1389
|
def cmd_mcp(argv) -> int:
|
|
1254
1390
|
"""boost mcp [register|unregister] [--host H] [--stdio] [--seed|--no-seed]"""
|
|
1255
1391
|
p = cliparse.parser(
|
|
@@ -1324,6 +1460,8 @@ def cmd_mcp(argv) -> int:
|
|
|
1324
1460
|
out.info(" ".join(mcphost.argv(host, args.action, shim)))
|
|
1325
1461
|
journal.log("mcp", args.action, hosts="")
|
|
1326
1462
|
return 0
|
|
1463
|
+
if args.action == "register":
|
|
1464
|
+
_offer_boost_first(done)
|
|
1327
1465
|
journal.log("mcp", args.action, hosts=",".join(done))
|
|
1328
1466
|
return 0
|
|
1329
1467
|
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""The one tap boost ships itself, and the rule inside it.
|
|
2
|
+
|
|
3
|
+
boost's whole product is asking a user to accept standing text written by
|
|
4
|
+
strangers, under ``boost install`` and reversible with ``boost uninstall``. Its
|
|
5
|
+
OWN standing text has to be the same kind of thing, subject to the same
|
|
6
|
+
commands — a privileged block that ``boost list`` cannot see and
|
|
7
|
+
``boost uninstall`` cannot remove is exactly the asymmetry a user is entitled
|
|
8
|
+
to resent. So ``boost-first`` is not a special case bolted onto the register
|
|
9
|
+
path: it is an ordinary rule, in an ordinary tap, that happens to arrive with
|
|
10
|
+
the wheel instead of over the network.
|
|
11
|
+
|
|
12
|
+
**The tap directory is under ``~/.boost/repos/`` and never inside the wheel.**
|
|
13
|
+
That is not an implementation detail, it is the whole safety argument. A
|
|
14
|
+
``Tap`` whose ``path`` pointed at package data would sit one ``boost untap``
|
|
15
|
+
away from :func:`registry.remove`, which ends in ``util.rmtree(tap.path)`` —
|
|
16
|
+
deleting part of the user's installed package. Here the worst case is that a
|
|
17
|
+
recreatable directory goes away and :func:`ensure_tap` rebuilds it.
|
|
18
|
+
|
|
19
|
+
The shipped files are therefore *copied out* of the wheel on first use, and the
|
|
20
|
+
copy is what everything else — catalog scan, install, lock file, uninstall —
|
|
21
|
+
sees. Nothing in ``core/`` needs to know this tap is different.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import shutil
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
from . import config, paths, registry
|
|
29
|
+
|
|
30
|
+
#: The tap name. Contains a ``/`` like any other, so ``Tap.safe_name`` maps it
|
|
31
|
+
#: to ``boost__builtin`` under ``~/.boost/repos/``.
|
|
32
|
+
BUILTIN_TAP = "boost/builtin"
|
|
33
|
+
|
|
34
|
+
#: A sentinel URL rather than a real one. ``boost update`` must not try to
|
|
35
|
+
#: fetch this tap: its source of truth is the installed wheel, so it refreshes
|
|
36
|
+
#: when boost itself does. The scheme is deliberately not ``https`` so any code
|
|
37
|
+
#: that hands it to git fails loudly instead of reaching the network.
|
|
38
|
+
BUILTIN_URL = "builtin:boost"
|
|
39
|
+
|
|
40
|
+
#: The rule boost authors. One entry today; the list is what makes adding a
|
|
41
|
+
#: second a data change rather than a code change.
|
|
42
|
+
BUILTIN_RULES = ("boost-first",)
|
|
43
|
+
|
|
44
|
+
#: MCP host id -> boost agent id. The two vocabularies genuinely differ
|
|
45
|
+
#: (``mcphost.CLAUDE`` is ``"claude"``; the agent is ``"claude-code"``), and
|
|
46
|
+
#: the offer is scoped through this so standing text naming ``boost_search``
|
|
47
|
+
#: only reaches an agent boost actually registered a server with. Cursor and
|
|
48
|
+
#: Windsurf are absent on purpose: boost registers no MCP server for them, so
|
|
49
|
+
#: the rule would advertise tools they do not have.
|
|
50
|
+
AGENT_FOR_HOST = {"claude": "claude-code", "gemini": "gemini"}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def source_dir() -> Path:
|
|
54
|
+
"""The shipped rules inside the installed package. **Read-only.**
|
|
55
|
+
|
|
56
|
+
Never returned as a ``Tap.path`` and never written to — a wheel is not
|
|
57
|
+
guaranteed writable, and on a system install it is not guaranteed to be
|
|
58
|
+
the user's to modify.
|
|
59
|
+
"""
|
|
60
|
+
return Path(__file__).resolve().parent.parent / "data" / "rules"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def is_builtin(tap_name: str) -> bool:
|
|
64
|
+
"""Whether ``tap_name`` is boost's own tap rather than a user's."""
|
|
65
|
+
return tap_name == BUILTIN_TAP
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def configured_tap_count() -> int:
|
|
69
|
+
"""Taps the USER configured — the builtin does not count.
|
|
70
|
+
|
|
71
|
+
``mcp.no_results`` and ``boost_doctor`` both ask "has this user configured
|
|
72
|
+
anything yet" by counting taps, and print the one-command setup path when
|
|
73
|
+
the answer is zero. boost's own tap must not answer that question for
|
|
74
|
+
them: a machine holding nothing but ``boost-first`` has an effectively
|
|
75
|
+
empty catalog, and suppressing the setup message there would strand a new
|
|
76
|
+
user with a search that can never match.
|
|
77
|
+
"""
|
|
78
|
+
return sum(1 for tap in registry.list_taps() if not is_builtin(tap.name))
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def ensure_tap() -> registry.Tap:
|
|
82
|
+
"""Materialize the shipped rules on disk and register the tap. Idempotent.
|
|
83
|
+
|
|
84
|
+
Copies each shipped ``.mdc`` into ``~/.boost/repos/boost__builtin/`` and
|
|
85
|
+
appends the config row if it is not already there. Safe to call on every
|
|
86
|
+
install: an existing file is overwritten from the wheel, which is what
|
|
87
|
+
makes the rule track boost's own version rather than drifting once written.
|
|
88
|
+
"""
|
|
89
|
+
tap = registry.Tap(name=BUILTIN_TAP, url=BUILTIN_URL, curated=True)
|
|
90
|
+
paths.ensure_dirs()
|
|
91
|
+
tap.path.mkdir(parents=True, exist_ok=True)
|
|
92
|
+
src = source_dir()
|
|
93
|
+
for rule in BUILTIN_RULES:
|
|
94
|
+
origin = src / (rule + ".mdc")
|
|
95
|
+
if origin.is_file():
|
|
96
|
+
shutil.copyfile(origin, tap.path / (rule + ".mdc"))
|
|
97
|
+
cfg = config.load()
|
|
98
|
+
rows = cfg.setdefault("taps", [])
|
|
99
|
+
if not any(str(row.get("name")) == BUILTIN_TAP for row in rows):
|
|
100
|
+
rows.append({"name": BUILTIN_TAP, "url": BUILTIN_URL, "curated": True})
|
|
101
|
+
config.save(cfg)
|
|
102
|
+
return tap
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def rule_is_available() -> bool:
|
|
106
|
+
"""Whether the wheel actually carries the rule.
|
|
107
|
+
|
|
108
|
+
Package data is a packaging decision that can regress silently — a missing
|
|
109
|
+
``package-data`` entry makes this a dev-checkout-only feature that is
|
|
110
|
+
simply absent for every pip and pipx user. The offer checks this rather
|
|
111
|
+
than assuming, so a packaging mistake degrades to "no offer" instead of a
|
|
112
|
+
traceback on the one command new users are told to run.
|
|
113
|
+
"""
|
|
114
|
+
return (source_dir() / (BUILTIN_RULES[0] + ".mdc")).is_file()
|
|
@@ -270,6 +270,28 @@ def all_entries() -> list[dict]:
|
|
|
270
270
|
return out
|
|
271
271
|
|
|
272
272
|
|
|
273
|
+
def kind_counts() -> dict[str, int]:
|
|
274
|
+
"""Per-kind entry counts across every configured tap.
|
|
275
|
+
|
|
276
|
+
The same reads :func:`all_entries` does, one tap's cache at a time, without
|
|
277
|
+
the concatenation. A caller that only wants the size of the corpus should
|
|
278
|
+
not have to materialise it: the MCP ``boost_doctor`` handler took
|
|
279
|
+
``len(all_entries())``, which builds a 71,655-element list on a real
|
|
280
|
+
install to produce one integer.
|
|
281
|
+
|
|
282
|
+
An entry with no ``kind`` counts as a skill, the way it renders everywhere
|
|
283
|
+
else. An unrecognised kind gets its own key rather than being dropped, so
|
|
284
|
+
``sum(kind_counts().values())`` equals ``len(all_entries())`` for any cache
|
|
285
|
+
— including one written before a kind existed.
|
|
286
|
+
"""
|
|
287
|
+
counts: dict[str, int] = {KIND_SKILL: 0, KIND_RULE: 0, KIND_WORKFLOW: 0}
|
|
288
|
+
for tap in registry.list_taps():
|
|
289
|
+
for entry in load_tap(tap):
|
|
290
|
+
kind = entry.get("kind") or KIND_SKILL
|
|
291
|
+
counts[kind] = counts.get(kind, 0) + 1
|
|
292
|
+
return counts
|
|
293
|
+
|
|
294
|
+
|
|
273
295
|
def split_name(name: str) -> tuple[str | None, str]:
|
|
274
296
|
"""Split a possibly tap-qualified name into ``(tap, bare_name)``.
|
|
275
297
|
|
|
@@ -145,6 +145,33 @@ PROTOCOL_VERSION = "2024-11-05"
|
|
|
145
145
|
# capture this whole surface is written to avoid. The nameable-task trigger
|
|
146
146
|
# stays as the cheapest test of all.
|
|
147
147
|
#
|
|
148
|
+
# THE DEFEATER, and it is the one clause here that is not a trigger. Forensics
|
|
149
|
+
# on a Gemini CLI session: asked to build a RAG app with LangGraph, LangChain
|
|
150
|
+
# and LangSmith, the agent shipped it without calling a single boost tool, and
|
|
151
|
+
# explained afterwards that it had "immediately activated the pre-installed
|
|
152
|
+
# local skills — langchain-rag and rag-engineer" and "overlooked calling
|
|
153
|
+
# mcp_boost_boost_search". boost_search's description already named that exact
|
|
154
|
+
# moment — "a new project or subsystem, an architecture decision, environment
|
|
155
|
+
# and tooling config" — and the agent paraphrased the list back when asked.
|
|
156
|
+
#
|
|
157
|
+
# So the trigger did not fail to fire. It fired and was overruled. Every
|
|
158
|
+
# trigger boost ships is a predicate over the REQUEST; the gate the model
|
|
159
|
+
# actually applied was a predicate over its OWN CONTEXT — something already
|
|
160
|
+
# matched, so I am covered. That proposition appears nowhere in boost's
|
|
161
|
+
# agent-facing text ('already loaded' 0 hits, 'already matched' 0, 'even if' 0,
|
|
162
|
+
# 'enough' 0, 'sufficient' 0, 'covered' 0, 'active skill' 0 across INSTRUCTIONS
|
|
163
|
+
# and all six tool descriptions), and a clause that does not exist cannot have
|
|
164
|
+
# failed. This paragraph adds it.
|
|
165
|
+
#
|
|
166
|
+
# It is placed DOWNSTREAM of the two signals rather than beside them, because a
|
|
167
|
+
# fourth signal would widen the gate and this narrows an exception to it. And
|
|
168
|
+
# it is written as a description rather than a denial. An earlier draft said
|
|
169
|
+
# "an active skill does not answer this question", which compresses to "an
|
|
170
|
+
# active skill is never enough" — a standing order to search, i.e. the same
|
|
171
|
+
# capture the skip list and the stated cost exist to prevent. What ships says
|
|
172
|
+
# what an active skill IS (installed earlier, matched on its own description,
|
|
173
|
+
# one kind of three) and leaves the conclusion to the reader.
|
|
174
|
+
#
|
|
148
175
|
# NON-CAPTURING, and this is a measured knife edge rather than a manner.
|
|
149
176
|
# Editing only a tool's description moves how often a model calls it by more
|
|
150
177
|
# than 10x ("Tool Preferences in Agentic LLMs are Unreliable", EMNLP 2025),
|
|
@@ -178,6 +205,14 @@ INSTRUCTIONS = (
|
|
|
178
205
|
"recognized at the time, and a question that became an investigation "
|
|
179
206
|
"never got one.\n"
|
|
180
207
|
"\n"
|
|
208
|
+
"ALREADY HOLDING A MATCH is not one of those two signals, though it reads "
|
|
209
|
+
"like an answer to the same question. A skill that activated here was "
|
|
210
|
+
"installed on an earlier day and matched on its own description — what it "
|
|
211
|
+
"covers, not what this request needs — and it is one kind of three: a rule "
|
|
212
|
+
"you never installed cannot activate, and a workflow waits to be called by "
|
|
213
|
+
"name. The two signals stay properties of the request, and an active skill "
|
|
214
|
+
"leaves them as it found them.\n"
|
|
215
|
+
"\n"
|
|
181
216
|
"Finding nothing is a good outcome, not a wasted call: it tells you to "
|
|
182
217
|
"build it yourself, now knowing that nothing already covers it. Finding "
|
|
183
218
|
"something is a head start, not an instruction — read it, take what fits, "
|
|
@@ -188,7 +223,7 @@ INSTRUCTIONS = (
|
|
|
188
223
|
)
|
|
189
224
|
|
|
190
225
|
|
|
191
|
-
def hit_line(entry: dict) -> str:
|
|
226
|
+
def hit_line(entry: dict, *, installed: bool = False) -> str:
|
|
192
227
|
"""One search hit rendered for an agent: name, kind, description, tap.
|
|
193
228
|
|
|
194
229
|
The kind marker is the load-bearing part. ``boost_install``'s description
|
|
@@ -202,14 +237,106 @@ def hit_line(entry: dict) -> str:
|
|
|
202
237
|
line would spend a token per hit to say "nothing unusual here". A missing
|
|
203
238
|
``kind`` reads as a skill for the same reason it does everywhere else in
|
|
204
239
|
the catalog — thin scanner output must not surface ``[None]`` to an agent.
|
|
240
|
+
|
|
241
|
+
``installed`` adds a second marker after the kind, and is keyword-only with
|
|
242
|
+
a False default so every existing caller and assertion renders byte-for-byte
|
|
243
|
+
what it did before. It is **name-keyed** — the caller tests the name against
|
|
244
|
+
the lock file — which means a hit from a *different tap* that happens to
|
|
245
|
+
share a name is marked. That is a real false-positive rate (the corpus holds
|
|
246
|
+
13 distinct skills called ``code-reviewer``) and it errs toward suppressing
|
|
247
|
+
a search, so it is disclosed rather than hidden: :func:`overlap_note` says
|
|
248
|
+
so in the reply itself, and every hit line names its own tap.
|
|
249
|
+
|
|
250
|
+
Keying it more precisely was the alternative and was rejected. The lock file
|
|
251
|
+
IS name-keyed (``lockfile.find_any``), and so is ``store.install``, so a
|
|
252
|
+
tap-qualified marker would disagree with the tool it is advising about — a
|
|
253
|
+
hit marked "not installed" that ``boost_install <name>`` then resolves to
|
|
254
|
+
the item already in the lock. One notion of identity per reply, plus the
|
|
255
|
+
field that resolves it, beats two that contradict each other.
|
|
205
256
|
"""
|
|
206
257
|
kind = entry.get("kind") or "skill"
|
|
207
258
|
marker = "" if kind == "skill" else " [%s]" % kind
|
|
259
|
+
if installed:
|
|
260
|
+
marker += " [installed]"
|
|
208
261
|
return "%s%s — %s (%s)" % (entry.get("name", "?"), marker,
|
|
209
262
|
entry.get("description", ""),
|
|
210
263
|
entry.get("tap", "?"))
|
|
211
264
|
|
|
212
265
|
|
|
266
|
+
# The lock sections, in the order every boost surface names them. Fixed here
|
|
267
|
+
# rather than read off the caller's dict, so the footer's column order cannot
|
|
268
|
+
# drift between a machine that has rules and one that does not.
|
|
269
|
+
_KINDS = ("skill", "rule", "workflow")
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def coverage_line(installed: dict, *, tapped: int) -> str:
|
|
273
|
+
"""``boost_list``'s closing footer: what this machine holds, per kind.
|
|
274
|
+
|
|
275
|
+
``installed`` is the ``lockfile.all_installed()`` shape — ``{kind: {name:
|
|
276
|
+
entry}}`` — and a missing section counts as zero.
|
|
277
|
+
|
|
278
|
+
boost_list used to answer "what do I have" and nothing else, which made it
|
|
279
|
+
the amplifier for the failure this footer exists to defeat: an agent that
|
|
280
|
+
stopped because something had already matched would, on calling the one
|
|
281
|
+
free tool, have been told only about the things it already had. This is the
|
|
282
|
+
other half — a kind sitting at zero is a kind nothing on this machine could
|
|
283
|
+
have loaded, and boost_search is what reads the registries themselves.
|
|
284
|
+
|
|
285
|
+
Only INSTALLED counts appear. An earlier draft closed with the size of the
|
|
286
|
+
tapped catalog, and that number cannot be substantiated: those are
|
|
287
|
+
un-de-duplicated index entries, and boost's own ranked list de-duplicates
|
|
288
|
+
on the content hash precisely because 13 distinct skills named
|
|
289
|
+
``code-reviewer`` collapsing into one slot credited the ranker with a
|
|
290
|
+
compression that existed only in the scoring code. Printing the raw total
|
|
291
|
+
as the size of what the user is missing would be the only claim in this
|
|
292
|
+
surface an agent cannot check. Dropping it also keeps the tool honest about
|
|
293
|
+
its cost: with no catalog read, boost_list stays the "instant" tool
|
|
294
|
+
INSTRUCTIONS advertises.
|
|
295
|
+
|
|
296
|
+
``tapped`` selects the closing sentence, keyed the way :func:`no_results`
|
|
297
|
+
and ``boost_doctor`` key theirs and naming the same one command in the same
|
|
298
|
+
order — an agent that calls two of these in one session must not see the
|
|
299
|
+
recommendation flip and read it as two different fixes.
|
|
300
|
+
"""
|
|
301
|
+
body = " · ".join(
|
|
302
|
+
"%d %s%s" % (n, kind, "" if n == 1 else "s")
|
|
303
|
+
for kind, n in ((k, len(installed.get(k) or {})) for k in _KINDS))
|
|
304
|
+
if tapped > 0:
|
|
305
|
+
return ("%s installed here — what this machine holds, not what exists. "
|
|
306
|
+
"boost_search reads the tapped registries themselves, across "
|
|
307
|
+
"all three kinds." % body)
|
|
308
|
+
return ("%s installed here. Nothing is tapped yet, so there is no catalog "
|
|
309
|
+
"behind boost_search either — ask the user to run `boost tap "
|
|
310
|
+
"--defaults` to add the recommended registries." % body)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def overlap_note(installed_hits: int, total_hits: int) -> str:
|
|
314
|
+
"""How much of a search reply this machine already has. ``""`` for no hits.
|
|
315
|
+
|
|
316
|
+
The counterpart to :func:`hit_line`'s ``[installed]`` marker: the marker
|
|
317
|
+
says which line, this says how many, and it is the only agent-facing place
|
|
318
|
+
the marker's name-keying is disclosed. Both serve one decision — "I already
|
|
319
|
+
have something" is a claim about the machine, and until the reply separated
|
|
320
|
+
the two halves it was a guess.
|
|
321
|
+
|
|
322
|
+
Zero overlap gets its own sentence rather than silence. It is the plainest
|
|
323
|
+
available answer to "something already matched, so I am covered", and
|
|
324
|
+
silence would read as absence of information rather than as the answer.
|
|
325
|
+
|
|
326
|
+
The empty reply belongs to :func:`no_results` — including its
|
|
327
|
+
untapped-machine branch — so nothing bolts onto it here.
|
|
328
|
+
"""
|
|
329
|
+
if total_hits <= 0:
|
|
330
|
+
return ""
|
|
331
|
+
if installed_hits <= 0:
|
|
332
|
+
return "\n(none of these are installed on this machine.)"
|
|
333
|
+
return ("\n(%d of %d already installed here, marked [installed]. The match "
|
|
334
|
+
"is on the name alone — the same test boost_install and boost_info "
|
|
335
|
+
"use — so an item from a different tap that shares a name is "
|
|
336
|
+
"marked too; each line names its tap.)"
|
|
337
|
+
% (installed_hits, total_hits))
|
|
338
|
+
|
|
339
|
+
|
|
213
340
|
def no_results(query: str, *, tapped: int) -> str:
|
|
214
341
|
"""The reply for a search that returned nothing.
|
|
215
342
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: boost-first
|
|
3
|
+
description: Check the boost shelf before a choice gets locked in — including when a skill has already matched.
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
globs: "**"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
boost is a shelf of procedures other people already wrote and debugged, in
|
|
9
|
+
three kinds: skills, rules and workflows. Two read-only tools reach it —
|
|
10
|
+
`boost_list` for what is installed on this machine, `boost_search` for what
|
|
11
|
+
exists across the registries you have tapped. Some hosts prefix the names, so
|
|
12
|
+
they may appear as `mcp_boost_boost_search`. Neither installs anything. If
|
|
13
|
+
neither tool is present in this session, `boost search "<what you are trying
|
|
14
|
+
to do>"` in the shell asks the same question.
|
|
15
|
+
|
|
16
|
+
`boost_list` is a local file read. `boost_search` takes longer because it
|
|
17
|
+
retrieves and then reranks, which is what makes its top result worth acting on
|
|
18
|
+
rather than skimming ten.
|
|
19
|
+
|
|
20
|
+
Reach for the shelf when the request would lock something in for everything
|
|
21
|
+
after it: a new project or subsystem, an architecture or dependency choice,
|
|
22
|
+
environment and tooling config, a linter, tests, CI.
|
|
23
|
+
|
|
24
|
+
What is already loaded is a different question. A skill that activated here was
|
|
25
|
+
installed before this request existed and matched on its own description — what
|
|
26
|
+
it covers, not what this request needs — and it is one kind of three: a rule you
|
|
27
|
+
never installed cannot activate, and a workflow waits to be called by name. So
|
|
28
|
+
an active skill leaves the question of what exists exactly where it found it.
|
|
29
|
+
|
|
30
|
+
Coming back empty is a real answer: build it yourself, now knowing nothing
|
|
31
|
+
already covers it. Coming back with something is a head start, not an
|
|
32
|
+
instruction — read it, take what fits, discard the rest. The task stays yours.
|
|
33
|
+
|
|
34
|
+
Not for: a question, a one-line edit, a command you were just handed, or a
|
|
35
|
+
change that follows conventions already visible in this repo.
|
|
@@ -53,6 +53,7 @@ boost_cli/core/agents.py
|
|
|
53
53
|
boost_cli/core/ai.py
|
|
54
54
|
boost_cli/core/bmad.py
|
|
55
55
|
boost_cli/core/bootstrap.py
|
|
56
|
+
boost_cli/core/builtin.py
|
|
56
57
|
boost_cli/core/capabilities.py
|
|
57
58
|
boost_cli/core/catalog.py
|
|
58
59
|
boost_cli/core/chat.py
|
|
@@ -100,6 +101,7 @@ boost_cli/core/updatediff.py
|
|
|
100
101
|
boost_cli/core/util.py
|
|
101
102
|
boost_cli/core/workflows.py
|
|
102
103
|
boost_cli/data/registries.json
|
|
104
|
+
boost_cli/data/rules/boost-first.mdc
|
|
103
105
|
boost_langchain/__init__.py
|
|
104
106
|
boost_langchain/_compat.py
|
|
105
107
|
boost_langchain/graph.py
|
|
@@ -189,6 +191,7 @@ docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
|
|
|
189
191
|
docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
|
|
190
192
|
docs/roadmap/items/bm25-index-is-one-json-blob.md
|
|
191
193
|
docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
|
|
194
|
+
docs/roadmap/items/boost-first-rule.md
|
|
192
195
|
docs/roadmap/items/boost-langchain-publishing.md
|
|
193
196
|
docs/roadmap/items/boost-run-live-agents.md
|
|
194
197
|
docs/roadmap/items/bring-commands-under-mutation-testing.md
|
|
@@ -282,6 +285,7 @@ docs/roadmap/items/make-lint-masks-actionlint-failures.md
|
|
|
282
285
|
docs/roadmap/items/make-the-roadmaps-discoverable.md
|
|
283
286
|
docs/roadmap/items/markdown-consistency-markdownlint-cli2.md
|
|
284
287
|
docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md
|
|
288
|
+
docs/roadmap/items/mcp-already-covered-defeater.md
|
|
285
289
|
docs/roadmap/items/mcp-aware-skills.md
|
|
286
290
|
docs/roadmap/items/mcp-check-skills-before-starting-a-task.md
|
|
287
291
|
docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md
|
|
@@ -541,7 +545,9 @@ tests/unit/test_adapters_runner.py
|
|
|
541
545
|
tests/unit/test_agents.py
|
|
542
546
|
tests/unit/test_ai.py
|
|
543
547
|
tests/unit/test_bmad_core.py
|
|
548
|
+
tests/unit/test_boost_first_offer.py
|
|
544
549
|
tests/unit/test_bootstrap.py
|
|
550
|
+
tests/unit/test_builtin.py
|
|
545
551
|
tests/unit/test_capabilities.py
|
|
546
552
|
tests/unit/test_catalog.py
|
|
547
553
|
tests/unit/test_chat.py
|