boost-skill-cli 1.2.55__tar.gz → 1.2.56__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.2.55/boost_skill_cli.egg-info → boost_skill_cli-1.2.56}/PKG-INFO +5 -3
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/README.md +4 -2
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/configuration.py +83 -7
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/info.py +15 -1
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/quality.py +24 -5
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/quickstart.py +20 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/mcp.py +56 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56/boost_skill_cli.egg-info}/PKG-INFO +5 -3
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/mcp-hub.html +9 -7
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +25 -3
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap.html +26 -3
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/doctor.feature +4 -2
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_configuration.py +2 -2
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_info.py +40 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_quality.py +40 -1
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_quickstart.py +74 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mcp.py +1 -1
- boost_skill_cli-1.2.56/tests/unit/test_mcp_read.py +341 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.gitattributes +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.gitignore +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/.vale.ini +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/DCO +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/LICENSE +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/Makefile +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/codecov.yml +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/index.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/README.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/examples/README.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/index.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/noxfile.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/setup.cfg +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/style/README.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/style/boost.css +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/style/boost.js +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/style/demo.html +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/visual/visual_check.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.56
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -448,8 +448,10 @@ purely local operation, for CI images and air-gapped machines.
|
|
|
448
448
|
| Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
|
|
449
449
|
| Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` |
|
|
450
450
|
|
|
451
|
-
|
|
452
|
-
`boost_install`, `boost_doctor` and
|
|
451
|
+
Seven tools are exposed: `boost_search`, `boost_list`, `boost_info`,
|
|
452
|
+
`boost_read`, `boost_install`, `boost_doctor` and
|
|
453
|
+
`boost_discover_github`. `boost_read` is the one that returns an item's
|
|
454
|
+
actual text — without it, installing was the only way to read a skill.
|
|
453
455
|
|
|
454
456
|
The server also returns MCP `instructions`, telling the agent when boost is
|
|
455
457
|
relevant. The two hosts place those differently, and it matters. Claude Code
|
|
@@ -406,8 +406,10 @@ purely local operation, for CI images and air-gapped machines.
|
|
|
406
406
|
| Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
|
|
407
407
|
| Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` |
|
|
408
408
|
|
|
409
|
-
|
|
410
|
-
`boost_install`, `boost_doctor` and
|
|
409
|
+
Seven tools are exposed: `boost_search`, `boost_list`, `boost_info`,
|
|
410
|
+
`boost_read`, `boost_install`, `boost_doctor` and
|
|
411
|
+
`boost_discover_github`. `boost_read` is the one that returns an item's
|
|
412
|
+
actual text — without it, installing was the only way to read a skill.
|
|
411
413
|
|
|
412
414
|
The server also returns MCP `instructions`, telling the agent when boost is
|
|
413
415
|
relevant. The two hosts place those differently, and it matters. Claude Code
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.56'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 56)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -1169,6 +1169,47 @@ def _tool_info(args: dict):
|
|
|
1169
1169
|
return "\n".join(lines), False
|
|
1170
1170
|
|
|
1171
1171
|
|
|
1172
|
+
def _tool_read(args: dict):
|
|
1173
|
+
"""`boost_read` — the item's own text, so an agent can look before it acts.
|
|
1174
|
+
|
|
1175
|
+
The gap this closes: ``boost_info`` returns the same one-line description
|
|
1176
|
+
``boost_search`` already returned, so an agent deciding whether a procedure
|
|
1177
|
+
is worth adopting had one sentence written by whoever published it, and its
|
|
1178
|
+
only route to the actual steps was to install into the user's real
|
|
1179
|
+
``~/.agents/skills`` and read it off disk. That inverts the surface's own
|
|
1180
|
+
pitch — ``boost_search`` spends 10-15 s of rerank so the top result is worth
|
|
1181
|
+
acting on, and then nothing let the agent look at it.
|
|
1182
|
+
|
|
1183
|
+
The body is also the only thing separating a written skill from a generated
|
|
1184
|
+
stub, and the catalogue holds both: two ranked hits share the description
|
|
1185
|
+
"To optimize **Skill**, we enforce the following foundational rules:" — an
|
|
1186
|
+
unfilled template — and ``superpowers-lab`` is an 868-byte SKILL.md whose
|
|
1187
|
+
Instructions section is its own name echoed back. Both index, rank and
|
|
1188
|
+
render exactly like real results. The eval gate cannot catch it either:
|
|
1189
|
+
``golden.jsonl`` grades by *name*, and a stub matches its own name
|
|
1190
|
+
perfectly.
|
|
1191
|
+
|
|
1192
|
+
Read-only, and that is the whole point rather than a side note — this is
|
|
1193
|
+
the tool that exists so an agent does *not* have to install to look, so it
|
|
1194
|
+
must never become a second install path. It reuses ``boost cat``'s
|
|
1195
|
+
resolution (``info._resolve_text``): the installed copy when there is one,
|
|
1196
|
+
the tap source otherwise, with the same integrity and quarantine rules. A
|
|
1197
|
+
second resolver would be a second opinion about what "this item" means,
|
|
1198
|
+
disagreeing with the tool it is advising about.
|
|
1199
|
+
|
|
1200
|
+
``cat`` rather than ``explain``: cat is offline, deterministic and free,
|
|
1201
|
+
while ``explain`` goes through ``core/ai.py`` and costs seconds plus a key.
|
|
1202
|
+
The cheap answer must not sit behind the expensive one's latency — the same
|
|
1203
|
+
reason ``boost_list`` never reads the catalog.
|
|
1204
|
+
"""
|
|
1205
|
+
from . import info
|
|
1206
|
+
name = str(args.get("name", ""))
|
|
1207
|
+
if not name.strip():
|
|
1208
|
+
return "boost_read needs a name — pass one as boost_search returned it", True
|
|
1209
|
+
text, kind, lock, _cat = info._resolve_text(name)
|
|
1210
|
+
return mcp.read_reply(name, text, kind=kind, installed=lock is not None), False
|
|
1211
|
+
|
|
1212
|
+
|
|
1172
1213
|
def _tool_install(args: dict):
|
|
1173
1214
|
entry = catalog.resolve_one(str(args.get("name", "")))
|
|
1174
1215
|
res = store.install(entry)
|
|
@@ -1369,19 +1410,54 @@ REGISTRY.register(
|
|
|
1369
1410
|
_tool_list)
|
|
1370
1411
|
REGISTRY.register(
|
|
1371
1412
|
"boost_info",
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1413
|
+
# This used to promise "the whole picture" and return five fields, one of
|
|
1414
|
+
# which — description — is byte-identical to the one-liner boost_search
|
|
1415
|
+
# already returned. So the tool added `installed: no`, which the search
|
|
1416
|
+
# reply already marks, to an agent that had been told to expect what the
|
|
1417
|
+
# item does. An overstated description costs a wasted call and teaches an
|
|
1418
|
+
# agent to discount the rest of the surface, which is the expensive half.
|
|
1419
|
+
# It now says what it returns (status and provenance) and names the tool
|
|
1420
|
+
# that returns the body.
|
|
1421
|
+
"Where one skill, rule or workflow came from, by name, and whether it is "
|
|
1422
|
+
"already here — its kind, tap, version, install state, and which agents "
|
|
1423
|
+
"it reached. It is the STATUS of an item, not its contents: the description "
|
|
1424
|
+
"it echoes is the same one-liner boost_search returned, so to read what "
|
|
1425
|
+
"the item actually says, call boost_read. Reach for boost_info when a "
|
|
1426
|
+
"name arrives from somewhere else — a teammate, a README, a repo you are "
|
|
1427
|
+
"reading — and you need to know whether this machine already has it. You "
|
|
1428
|
+
"do not need this between a search and an install: boost_search already "
|
|
1429
|
+
"returns each match's kind, description and installed marker.",
|
|
1379
1430
|
{"type": "object",
|
|
1380
1431
|
"properties": {"name": {"type": "string",
|
|
1381
1432
|
"description": "the item's name, as boost_search "
|
|
1382
1433
|
"or boost_list returned it"}},
|
|
1383
1434
|
"required": ["name"]},
|
|
1384
1435
|
_tool_info)
|
|
1436
|
+
REGISTRY.register(
|
|
1437
|
+
"boost_read",
|
|
1438
|
+
"Read the actual procedure before you commit to it — the item's own text, "
|
|
1439
|
+
"not its one-line description. This is the tool that makes looking cheaper "
|
|
1440
|
+
"than installing: without it the only way to see what a skill actually "
|
|
1441
|
+
"says is to install it into the user's machine and read it off disk, which "
|
|
1442
|
+
"is a change to their setup made in order to answer a question. Reach for "
|
|
1443
|
+
"it on the top hit from boost_search before boost_install, and whenever a "
|
|
1444
|
+
"one-liner is doing more selling than describing. What you are checking "
|
|
1445
|
+
"for is specific: the catalogue is indexed rather than reviewed, so it "
|
|
1446
|
+
"holds unfilled templates and stubs that echo their own name back, and "
|
|
1447
|
+
"those rank and render exactly like a procedure someone debugged. The body "
|
|
1448
|
+
"is the only thing that tells them apart. Read-only and offline — it "
|
|
1449
|
+
"installs nothing, changes nothing, and unlike boost_search costs no "
|
|
1450
|
+
"rerank, so it is fast. Long items are truncated at a stated character "
|
|
1451
|
+
"count and the reply says so and names the command that returns the rest; "
|
|
1452
|
+
"a body that arrives whole is whole.",
|
|
1453
|
+
{"type": "object",
|
|
1454
|
+
"properties": {"name": {"type": "string",
|
|
1455
|
+
"description": "the item's name, as boost_search "
|
|
1456
|
+
"or boost_list returned it; qualify with the tap "
|
|
1457
|
+
"(\"owner/repo:name\") when the same name exists "
|
|
1458
|
+
"in more than one"}},
|
|
1459
|
+
"required": ["name"]},
|
|
1460
|
+
_tool_read)
|
|
1385
1461
|
REGISTRY.register(
|
|
1386
1462
|
"boost_install",
|
|
1387
1463
|
"Turn a skill you found with boost_search into permanent capability: copied "
|
|
@@ -149,7 +149,21 @@ def _resolve_text(name: str):
|
|
|
149
149
|
found = lockfile.find_any(bare)
|
|
150
150
|
if found is None or found[0] == "skill":
|
|
151
151
|
path, lock, cat = _resolve_skill_md(name)
|
|
152
|
-
|
|
152
|
+
# The lock file is the authority for an INSTALLED item, and for one
|
|
153
|
+
# that is not installed it has no opinion at all — so a rule or
|
|
154
|
+
# workflow that is only in a tap arrived here and was reported as a
|
|
155
|
+
# skill, contradicting this function's own "any kind" contract. The
|
|
156
|
+
# catalog entry knows, and `_resolve_skill_md` has already resolved it:
|
|
157
|
+
# it returns a catalog entry on exactly the branch where `lock` is
|
|
158
|
+
# None, so no second lookup is needed (and a fallback for `cat is None`
|
|
159
|
+
# here would guard a state that function cannot produce).
|
|
160
|
+
#
|
|
161
|
+
# Every caller before `boost_read` discarded this value (`_kind`), so
|
|
162
|
+
# the wrong answer was invisible: the resolution and the text were
|
|
163
|
+
# always right, only the label was not.
|
|
164
|
+
kind = ((cat.get("kind") or "skill")
|
|
165
|
+
if lock is None and cat else "skill")
|
|
166
|
+
return _read(path), kind, lock, cat
|
|
153
167
|
kind, entry = found
|
|
154
168
|
lock = _for_tap(entry, qualifier)
|
|
155
169
|
if lock is not None:
|
|
@@ -395,7 +395,14 @@ def cmd_doctor(argv):
|
|
|
395
395
|
if taps and tap_ok == len(taps):
|
|
396
396
|
out.ok("%d tap%s cloned & cached" % (len(taps), _s(len(taps))))
|
|
397
397
|
elif not taps:
|
|
398
|
-
|
|
398
|
+
# `boost tap --defaults` leads, and it is the same command in the same
|
|
399
|
+
# order that `boost search`'s error, `mcp.no_results` and the MCP
|
|
400
|
+
# `boost_doctor` tool all name. A user who hits two of these surfaces
|
|
401
|
+
# in one session must not see the recommendation flip and read it as
|
|
402
|
+
# two different fixes — which is exactly what happened here: search
|
|
403
|
+
# said `--defaults`, doctor said `owner/repo`.
|
|
404
|
+
out.info("no registries tapped — nothing is searchable yet; add the "
|
|
405
|
+
"recommended ones with `boost tap --defaults`", wrap=True)
|
|
399
406
|
|
|
400
407
|
lock_ok = True
|
|
401
408
|
lp = paths.lockfile_path()
|
|
@@ -598,10 +605,22 @@ def cmd_doctor(argv):
|
|
|
598
605
|
else:
|
|
599
606
|
out.warn("lock file integrity or log rotation needs attention")
|
|
600
607
|
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
608
|
+
# A machine with no taps has nothing to disagree about, so every check
|
|
609
|
+
# above passes and the verdict read "healthy" — directly under the line
|
|
610
|
+
# saying no registries are tapped. That is the one state where a clean bill
|
|
611
|
+
# of health actively misleads: boost cannot answer anything yet, which is a
|
|
612
|
+
# setup step rather than a fault. Reported, never fatal — the exit code
|
|
613
|
+
# still turns only on real issues, so scripts and CI are unaffected. The
|
|
614
|
+
# MCP `boost_doctor` tool already refused to say "healthy" here; this is
|
|
615
|
+
# the CLI half of the same rule.
|
|
616
|
+
if issues == 0 and not taps:
|
|
617
|
+
out.verdict(True, "ready to set up — tap a registry to make boost "
|
|
618
|
+
"searchable")
|
|
619
|
+
else:
|
|
620
|
+
out.verdict(issues == 0,
|
|
621
|
+
"healthy" if not issues else
|
|
622
|
+
"%d issue%s need attention — see the suggestions above"
|
|
623
|
+
% (issues, _s(issues)))
|
|
605
624
|
return 1 if issues else 0
|
|
606
625
|
|
|
607
626
|
|
|
@@ -162,6 +162,26 @@ def cmd_quickstart(argv) -> int:
|
|
|
162
162
|
planned = [n for n in names if n in pins] if manifest else []
|
|
163
163
|
out.info("would build the keyword index, then import %d shard(s)"
|
|
164
164
|
% len(planned))
|
|
165
|
+
# "0 shard(s)" reads as "none are published" when the real cause is
|
|
166
|
+
# local, and --dry-run is exactly what a cautious new user runs first.
|
|
167
|
+
# The live path already explains both cases; without this the preview
|
|
168
|
+
# is the one surface that reports the symptom and withholds the reason.
|
|
169
|
+
if not planned:
|
|
170
|
+
if args.no_vectors:
|
|
171
|
+
out.info(out.role("(0 because --no-vectors was asked for)",
|
|
172
|
+
"muted"))
|
|
173
|
+
elif not dense.have_backend():
|
|
174
|
+
out.info("0 because semantic search needs the extra: "
|
|
175
|
+
"`pipx inject boost-skill-cli "
|
|
176
|
+
"\"boost-skill-cli[rag]\"` — keyword search works "
|
|
177
|
+
"without it", wrap=True)
|
|
178
|
+
elif manifest is None:
|
|
179
|
+
out.info(out.role("(0 because the shard manifest could not be "
|
|
180
|
+
"read — keyword search is unaffected)",
|
|
181
|
+
"muted"), wrap=True)
|
|
182
|
+
else:
|
|
183
|
+
out.info(out.role("(0 because none of these registries have a "
|
|
184
|
+
"published shard yet)", "muted"), wrap=True)
|
|
165
185
|
return 0
|
|
166
186
|
|
|
167
187
|
with spin.Spinner("building the keyword index"):
|
|
@@ -266,6 +266,62 @@ def hit_line(entry: dict, *, installed: bool = False) -> str:
|
|
|
266
266
|
entry.get("tap", "?"))
|
|
267
267
|
|
|
268
268
|
|
|
269
|
+
# `boost_read`'s budget, and it is a measured number rather than a round one.
|
|
270
|
+
# An MCP reply lands directly in an agent's context and a SKILL.md is not
|
|
271
|
+
# bounded above, so a tool that returns one whole is how a single lookup costs
|
|
272
|
+
# a session. Measured over the 63,053 items in a real 467-tap install: median
|
|
273
|
+
# 6,063 bytes, p90 16,225, p99 35,275, **max 567,484** — three orders of
|
|
274
|
+
# magnitude between the middle and the tail, which is the shape that makes an
|
|
275
|
+
# unbounded read a real hazard rather than a theoretical one.
|
|
276
|
+
#
|
|
277
|
+
# 12,000 is the knee. It delivers 80.3% of the catalogue whole against 62.8%
|
|
278
|
+
# at 8,000 — two thirds of the remaining truncations bought for 50% more bytes
|
|
279
|
+
# — and caps the worst case near 3,000 tokens. Raising it to 16,000 buys 9.3
|
|
280
|
+
# points for another third again, which is the wrong side of the trade for a
|
|
281
|
+
# tool an agent may call several times in one turn.
|
|
282
|
+
#
|
|
283
|
+
# The cap counts CHARACTERS, deliberately: boost cannot know the caller's
|
|
284
|
+
# tokenizer, and a character count is one an agent can check against the reply
|
|
285
|
+
# it is already holding. Truncation is never the failure mode this guards
|
|
286
|
+
# against, because it is announced — see :func:`read_reply`.
|
|
287
|
+
READ_LIMIT = 12000
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def read_reply(name: str, text: str, *, kind: str = "skill",
|
|
291
|
+
installed: bool = False, limit: int = READ_LIMIT) -> str:
|
|
292
|
+
"""`boost_read`'s reply: a header, then the item's own content.
|
|
293
|
+
|
|
294
|
+
The header exists because the body alone does not say what the agent is
|
|
295
|
+
holding. A tap-qualified name resolves to one item out of several that
|
|
296
|
+
share a bare name, and whether it is already installed decides whether the
|
|
297
|
+
next call is `boost_install` or nothing at all — both are one line here and
|
|
298
|
+
neither is recoverable from Markdown.
|
|
299
|
+
|
|
300
|
+
**Truncation is announced, in the reply, at the point it happens.** A body
|
|
301
|
+
cut silently reads as a complete document that simply ends — which for a
|
|
302
|
+
procedure is worse than no body at all, because the agent acts on the half
|
|
303
|
+
it can see and never learns there was a second half. The notice names the
|
|
304
|
+
command that returns the rest, so the reply carries its own recovery path
|
|
305
|
+
the way ``tool-design`` asks agent-facing errors to.
|
|
306
|
+
|
|
307
|
+
Truncation cuts at a LINE boundary within the budget rather than mid-line.
|
|
308
|
+
A Markdown body cut mid-fence or mid-sentence is text an agent has to
|
|
309
|
+
guess about; a whole-line cut is unambiguously "the document continues".
|
|
310
|
+
A body whose first line already exceeds the budget has no such boundary,
|
|
311
|
+
so it falls back to a hard character cut — announced the same way.
|
|
312
|
+
"""
|
|
313
|
+
head = ["name: %s" % name]
|
|
314
|
+
if kind != "skill":
|
|
315
|
+
head.append("kind: %s" % kind)
|
|
316
|
+
head.append("installed: %s" % ("yes" if installed else "no"))
|
|
317
|
+
body = text.strip("\n")
|
|
318
|
+
if len(body) > limit:
|
|
319
|
+
cut = body[:limit].rpartition("\n")[0] or body[:limit]
|
|
320
|
+
body = ("%s\n\n[truncated at %d of %d characters — read the rest with "
|
|
321
|
+
"`boost cat %s`]" % (cut, len(cut), len(text), name))
|
|
322
|
+
return "\n".join(head) + "\n\n" + body
|
|
323
|
+
|
|
324
|
+
|
|
269
325
|
# The lock sections, in the order every boost surface names them. Fixed here
|
|
270
326
|
# rather than read off the caller's dict, so the footer's column order cannot
|
|
271
327
|
# drift between a machine that has rules and one that does not.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.56
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -448,8 +448,10 @@ purely local operation, for CI images and air-gapped machines.
|
|
|
448
448
|
| Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
|
|
449
449
|
| Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` |
|
|
450
450
|
|
|
451
|
-
|
|
452
|
-
`boost_install`, `boost_doctor` and
|
|
451
|
+
Seven tools are exposed: `boost_search`, `boost_list`, `boost_info`,
|
|
452
|
+
`boost_read`, `boost_install`, `boost_doctor` and
|
|
453
|
+
`boost_discover_github`. `boost_read` is the one that returns an item's
|
|
454
|
+
actual text — without it, installing was the only way to read a skill.
|
|
453
455
|
|
|
454
456
|
The server also returns MCP `instructions`, telling the agent when boost is
|
|
455
457
|
relevant. The two hosts place those differently, and it matters. Claude Code
|
|
@@ -738,6 +738,7 @@ tests/unit/test_logs.py
|
|
|
738
738
|
tests/unit/test_marketing_counts.py
|
|
739
739
|
tests/unit/test_mcp.py
|
|
740
740
|
tests/unit/test_mcp_install_scan.py
|
|
741
|
+
tests/unit/test_mcp_read.py
|
|
741
742
|
tests/unit/test_mcpdecl.py
|
|
742
743
|
tests/unit/test_mcphost.py
|
|
743
744
|
tests/unit/test_measure_registry.py
|
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
(like GitHub) probe for their dependency and <b>degrade to a message instead of crashing</b>.</p>
|
|
330
330
|
|
|
331
331
|
<div class="diagram reveal">
|
|
332
|
-
<svg viewBox="0 0 920 500" role="img" aria-label="Architecture: an MCP client speaks JSON-RPC over stdio to the boost server, which routes tools/list and tools/call through the core/mcp Registry to
|
|
332
|
+
<svg viewBox="0 0 920 500" role="img" aria-label="Architecture: an MCP client speaks JSON-RPC over stdio to the boost server, which routes tools/list and tools/call through the core/mcp Registry to seven self-registering handlers; the boost_discover_github handler reaches out to the gh CLI and degrades gracefully.">
|
|
333
333
|
<defs>
|
|
334
334
|
<marker id="ah" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
335
335
|
<path d="M0 0L10 5L0 10z" fill="#7dd3fc"/>
|
|
@@ -375,16 +375,18 @@
|
|
|
375
375
|
<text x="672" y="119" class="lbl-s">boost_list</text>
|
|
376
376
|
<rect x="660" y="134" width="220" height="26" rx="6" fill="rgba(255,255,255,.04)" stroke="var(--line-hi)"/>
|
|
377
377
|
<text x="672" y="151" class="lbl-s">boost_info</text>
|
|
378
|
-
<rect x="660" y="166" width="220" height="26" rx="6" fill="rgba(
|
|
379
|
-
<text x="672" y="183" class="lbl-s">
|
|
378
|
+
<rect x="660" y="166" width="220" height="26" rx="6" fill="rgba(125,211,252,.10)" stroke="#7dd3fc" stroke-width="1.2"/>
|
|
379
|
+
<text x="672" y="183" class="lbl-s" fill="#bae6fd">boost_read ✦ new</text>
|
|
380
380
|
<rect x="660" y="198" width="220" height="26" rx="6" fill="rgba(255,255,255,.04)" stroke="var(--line-hi)"/>
|
|
381
|
-
<text x="672" y="215" class="lbl-s">
|
|
382
|
-
<rect x="660" y="230" width="220" height="26" rx="6" fill="rgba(
|
|
383
|
-
<text x="672" y="247" class="lbl-s"
|
|
381
|
+
<text x="672" y="215" class="lbl-s">boost_install</text>
|
|
382
|
+
<rect x="660" y="230" width="220" height="26" rx="6" fill="rgba(255,255,255,.04)" stroke="var(--line-hi)"/>
|
|
383
|
+
<text x="672" y="247" class="lbl-s">boost_doctor</text>
|
|
384
|
+
<rect x="660" y="262" width="220" height="26" rx="6" fill="rgba(245,143,215,.10)" stroke="#f58fd7" stroke-width="1.2"/>
|
|
385
|
+
<text x="672" y="279" class="lbl-s" fill="#f9a8d4">boost_discover_github</text>
|
|
384
386
|
</g>
|
|
385
387
|
<!-- registry to handlers -->
|
|
386
388
|
<line x1="610" y1="180" x2="660" y2="150" stroke="#7dd3fc" stroke-width="1.2" marker-end="url(#ah)"/>
|
|
387
|
-
<line x1="610" y1="205" x2="660" y2="
|
|
389
|
+
<line x1="610" y1="205" x2="660" y2="275" stroke="#f58fd7" stroke-width="1.2" marker-end="url(#ahp)"/>
|
|
388
390
|
|
|
389
391
|
<!-- reach-out -->
|
|
390
392
|
<rect x="620" y="330" width="260" height="72" rx="12" fill="rgba(245,143,215,.06)" stroke="#f58fd7" stroke-width="1.2"/>
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: mcp-cannot-read-a-skill-before-installing
|
|
3
3
|
board: code
|
|
4
4
|
section: dx
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: MCP · UX
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 3
|
|
10
|
-
note:
|
|
10
|
+
note: shipped — boost_read returns the body; boost_info now says what it returns
|
|
11
11
|
order: 127
|
|
12
|
-
owner:
|
|
12
|
+
owner: feat/mcp-read-before-install
|
|
13
13
|
pr:
|
|
14
14
|
title: MCP has no way to read a skill before installing it
|
|
15
15
|
---
|
|
@@ -65,3 +65,25 @@ to look; it must not become a second install path.
|
|
|
65
65
|
<b>And fix the description either way.</b> If <code>boost_info</code> keeps returning five fields, it
|
|
66
66
|
should stop claiming the whole picture — an overstated tool description costs an agent a wasted
|
|
67
67
|
call and teaches it to distrust the rest of the surface.
|
|
68
|
+
|
|
69
|
+
<b>Shipped as <code>boost_read</code>.</b> It returns the item's own text with a two-line header
|
|
70
|
+
— name, kind where it is not a skill, install state, all decisions the Markdown cannot answer
|
|
71
|
+
— and reuses <code>boost cat</code>'s resolution through <code>info._resolve_text</code>, so
|
|
72
|
+
installed copies, tap fallback, tap-qualified names, integrity enforcement and quarantine behave
|
|
73
|
+
identically. All three of the card's requirements landed: <code>cat</code> over <code>explain</code>
|
|
74
|
+
(offline, deterministic, free); a stated cap; read-only, with a test that fails if the handler ever
|
|
75
|
+
reaches <code>store.install</code>.
|
|
76
|
+
|
|
77
|
+
<b>The cap is measured rather than round.</b> Over the 63,053 items in a real 467-tap install the
|
|
78
|
+
distribution is median <b>6,063</b> bytes, p90 <b>16,225</b>, p99 <b>35,275</b>, max <b>567,484</b>
|
|
79
|
+
— three orders of magnitude between the middle and the tail, which is what makes an unbounded
|
|
80
|
+
read a hazard rather than a theory. <code>READ_LIMIT = 12000</code> delivers <b>80.3%</b> of the
|
|
81
|
+
catalogue whole against 62.8% at 8,000, and caps the worst case near 3,000 tokens; 16,000 would buy
|
|
82
|
+
9.3 points for another third again. Truncation is announced where it happens, cuts on a line
|
|
83
|
+
boundary, reports both the cut and the true size, and names the command that returns the rest.
|
|
84
|
+
|
|
85
|
+
<b>And the stub case was confirmed against the live catalogue, not predicted.</b>
|
|
86
|
+
<code>j4flmao/agent-skills:rag-patterns</code> opens <code># Skill</code> /
|
|
87
|
+
“<em>To optimize **Skill**, we enforce the following foundational rules:</em>” — a
|
|
88
|
+
template whose placeholder was never filled, 8,934 bytes of it, indexed and ranked like any written
|
|
89
|
+
procedure. Its one-liner gives no sign. That is the gap the body closes.
|
|
@@ -10088,8 +10088,9 @@ rediscover them as new.</p>
|
|
|
10088
10088
|
</article>
|
|
10089
10089
|
|
|
10090
10090
|
<article class="cap rcard" id="mcp-cannot-read-a-skill-before-installing">
|
|
10091
|
-
<div class="head"><span class="pill
|
|
10091
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">MCP · UX</span></div>
|
|
10092
10092
|
<h3>MCP has no way to read a skill before installing it</h3>
|
|
10093
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
10093
10094
|
<p><code>boost_info</code>'s MCP description promises “<em>the whole picture of one skill, rule or
|
|
10094
10095
|
workflow by name — what it does, its kind, the tap it came from, its version, and whether it is
|
|
10095
10096
|
already installed</em>”. Called on a real hit it returns five fields:
|
|
@@ -10141,12 +10142,34 @@ to look; it must not become a second install path.
|
|
|
10141
10142
|
|
|
10142
10143
|
<b>And fix the description either way.</b> If <code>boost_info</code> keeps returning five fields, it
|
|
10143
10144
|
should stop claiming the whole picture — an overstated tool description costs an agent a wasted
|
|
10144
|
-
call and teaches it to distrust the rest of the surface
|
|
10145
|
+
call and teaches it to distrust the rest of the surface.
|
|
10146
|
+
|
|
10147
|
+
<b>Shipped as <code>boost_read</code>.</b> It returns the item's own text with a two-line header
|
|
10148
|
+
— name, kind where it is not a skill, install state, all decisions the Markdown cannot answer
|
|
10149
|
+
— and reuses <code>boost cat</code>'s resolution through <code>info._resolve_text</code>, so
|
|
10150
|
+
installed copies, tap fallback, tap-qualified names, integrity enforcement and quarantine behave
|
|
10151
|
+
identically. All three of the card's requirements landed: <code>cat</code> over <code>explain</code>
|
|
10152
|
+
(offline, deterministic, free); a stated cap; read-only, with a test that fails if the handler ever
|
|
10153
|
+
reaches <code>store.install</code>.
|
|
10154
|
+
|
|
10155
|
+
<b>The cap is measured rather than round.</b> Over the 63,053 items in a real 467-tap install the
|
|
10156
|
+
distribution is median <b>6,063</b> bytes, p90 <b>16,225</b>, p99 <b>35,275</b>, max <b>567,484</b>
|
|
10157
|
+
— three orders of magnitude between the middle and the tail, which is what makes an unbounded
|
|
10158
|
+
read a hazard rather than a theory. <code>READ_LIMIT = 12000</code> delivers <b>80.3%</b> of the
|
|
10159
|
+
catalogue whole against 62.8% at 8,000, and caps the worst case near 3,000 tokens; 16,000 would buy
|
|
10160
|
+
9.3 points for another third again. Truncation is announced where it happens, cuts on a line
|
|
10161
|
+
boundary, reports both the cut and the true size, and names the command that returns the rest.
|
|
10162
|
+
|
|
10163
|
+
<b>And the stub case was confirmed against the live catalogue, not predicted.</b>
|
|
10164
|
+
<code>j4flmao/agent-skills:rag-patterns</code> opens <code># Skill</code> /
|
|
10165
|
+
“<em>To optimize **Skill**, we enforce the following foundational rules:</em>” — a
|
|
10166
|
+
template whose placeholder was never filled, 8,934 bytes of it, indexed and ranked like any written
|
|
10167
|
+
procedure. Its one-liner gives no sign. That is the gap the body closes.</p></details>
|
|
10145
10168
|
<div class="meta">
|
|
10146
10169
|
<span class="m">Complexity <b>S</b></span>
|
|
10147
10170
|
<span class="m hi">Impact <b>High</b></span>
|
|
10148
10171
|
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
10149
|
-
<span class="m">
|
|
10172
|
+
<span class="m">shipped — boost_read returns the body; boost_info now says what it returns</span>
|
|
10150
10173
|
</div>
|
|
10151
10174
|
</article>
|
|
10152
10175
|
<!-- /ROADMAP:cards -->
|
|
@@ -4,11 +4,13 @@ Feature: boost doctor
|
|
|
4
4
|
Background:
|
|
5
5
|
Given a fresh boost environment
|
|
6
6
|
|
|
7
|
-
Scenario: an empty environment is healthy
|
|
7
|
+
Scenario: an empty environment is set up, not healthy
|
|
8
8
|
When I run "boost doctor"
|
|
9
9
|
Then the exit code should be 0
|
|
10
10
|
And the output should contain "boost doctor"
|
|
11
|
-
And the output should contain "no
|
|
11
|
+
And the output should contain "no registries tapped"
|
|
12
|
+
And the output should contain "boost tap --defaults"
|
|
13
|
+
And the output should contain "ready to set up"
|
|
12
14
|
And the output should contain "0 skills installed · 0 taps synced · 0 broken links"
|
|
13
15
|
|
|
14
16
|
Scenario: a healthy environment with installed skills
|
{boost_skill_cli-1.2.55 → boost_skill_cli-1.2.56}/tests/functional/test_cli_configuration.py
RENAMED
|
@@ -971,8 +971,8 @@ class TestMcp:
|
|
|
971
971
|
assert isinstance(server_info["version"], str) and server_info["version"]
|
|
972
972
|
tools = by_id[2]["result"]["tools"]
|
|
973
973
|
assert [t["name"] for t in tools] == [
|
|
974
|
-
"boost_search", "boost_list", "boost_info", "
|
|
975
|
-
"boost_doctor", "boost_discover_github"]
|
|
974
|
+
"boost_search", "boost_list", "boost_info", "boost_read",
|
|
975
|
+
"boost_install", "boost_doctor", "boost_discover_github"]
|
|
976
976
|
assert all(t["inputSchema"]["type"] == "object" for t in tools)
|
|
977
977
|
|
|
978
978
|
def text(id_):
|
|
@@ -379,6 +379,46 @@ class TestCat:
|
|
|
379
379
|
assert "local edit" not in boost("cat", "rival-tap:brainstorming").out
|
|
380
380
|
|
|
381
381
|
|
|
382
|
+
class TestMcpReadHonoursTheQualifier:
|
|
383
|
+
"""`boost_read`'s `installed:` line answers about the item that was NAMED.
|
|
384
|
+
|
|
385
|
+
`_for_tap` returns None when a `tap:` qualifier names a different tap than
|
|
386
|
+
the installed record — its docstring is explicit that reporting tap A's
|
|
387
|
+
lock entry for a `tap-b:` question "would describe another tap's install as
|
|
388
|
+
this one's". `boost_read` derives `installed` from that same value, so it
|
|
389
|
+
inherits the precision.
|
|
390
|
+
|
|
391
|
+
Worth pinning because it is deliberately STRICTER than `mcp.hit_line`'s
|
|
392
|
+
`[installed]` marker, which is name-keyed and documents its own
|
|
393
|
+
false-positive rate. The two answer different questions — a search hit is
|
|
394
|
+
one of ten lines, a read is about one named item — and someone reconciling
|
|
395
|
+
them later should have to delete this test on purpose.
|
|
396
|
+
"""
|
|
397
|
+
|
|
398
|
+
def test_the_named_taps_copy_decides_the_installed_line(self, boost,
|
|
399
|
+
rival_tap):
|
|
400
|
+
from boost_cli.commands import configuration
|
|
401
|
+
boost("install", "fixture-tap:brainstorming")
|
|
402
|
+
|
|
403
|
+
installed, _ = configuration._tool_read(
|
|
404
|
+
{"name": "fixture-tap:brainstorming"})
|
|
405
|
+
other, _ = configuration._tool_read({"name": "rival-tap:brainstorming"})
|
|
406
|
+
|
|
407
|
+
assert "installed: yes" in installed.split("\n\n")[0]
|
|
408
|
+
assert "installed: no" in other.split("\n\n")[0]
|
|
409
|
+
|
|
410
|
+
def test_the_uninstalled_copy_still_returns_its_own_body(self, boost,
|
|
411
|
+
rival_tap):
|
|
412
|
+
# Saying "not installed" must not mean "no content": the whole point is
|
|
413
|
+
# to read a thing before installing it.
|
|
414
|
+
from boost_cli.commands import configuration
|
|
415
|
+
boost("install", "fixture-tap:brainstorming")
|
|
416
|
+
other, is_err = configuration._tool_read(
|
|
417
|
+
{"name": "rival-tap:brainstorming"})
|
|
418
|
+
assert is_err is False
|
|
419
|
+
assert "The other tap's copy." in other
|
|
420
|
+
|
|
421
|
+
|
|
382
422
|
# ── edit ─────────────────────────────────────────────────────────────────
|
|
383
423
|
|
|
384
424
|
class TestEdit:
|
|
@@ -74,6 +74,40 @@ class TestDoctor:
|
|
|
74
74
|
assert "lock file integrity OK · log rotation healthy" in r.out
|
|
75
75
|
assert "● healthy" in r.out # dashboard verdict
|
|
76
76
|
|
|
77
|
+
def test_an_untapped_machine_is_not_called_healthy(self, boost):
|
|
78
|
+
"""The one state where a clean bill of health actively misleads.
|
|
79
|
+
|
|
80
|
+
A machine with no taps has nothing to disagree about, so every check
|
|
81
|
+
passes and the verdict read "healthy" — directly under the line saying
|
|
82
|
+
no registries are tapped. boost cannot answer anything yet: that is a
|
|
83
|
+
setup step, not health. The MCP `boost_doctor` tool already refused to
|
|
84
|
+
say it here; this is the CLI half of the same rule.
|
|
85
|
+
"""
|
|
86
|
+
r = boost("doctor")
|
|
87
|
+
assert "● healthy" not in r.out
|
|
88
|
+
assert "ready to set up" in r.out
|
|
89
|
+
|
|
90
|
+
def test_an_untapped_machine_is_still_rc0(self, boost):
|
|
91
|
+
# Reported, never fatal. The exit code turns on real issues only, so
|
|
92
|
+
# scripts and CI on a fresh machine are unaffected — which is what
|
|
93
|
+
# makes saying the true thing safe.
|
|
94
|
+
boost("doctor") # the fixture asserts rc == 0
|
|
95
|
+
|
|
96
|
+
def test_the_setup_hint_names_the_same_command_search_does(self, boost):
|
|
97
|
+
"""doctor said `boost tap owner/repo`; search says `boost tap
|
|
98
|
+
--defaults`. A user who hits both in one session read one problem as
|
|
99
|
+
two, and `--defaults` is the precise one — it is what `mcp.no_results`
|
|
100
|
+
and the MCP `boost_doctor` tool already name, in that order.
|
|
101
|
+
"""
|
|
102
|
+
out = boost("doctor").out
|
|
103
|
+
assert "boost tap --defaults" in out
|
|
104
|
+
assert "boost tap owner/repo" not in out
|
|
105
|
+
|
|
106
|
+
def test_a_tapped_machine_is_still_healthy(self, boost, tapped):
|
|
107
|
+
# The regression that would matter: the new branch must fire only on
|
|
108
|
+
# an untapped machine.
|
|
109
|
+
assert "● healthy" in boost("doctor").out
|
|
110
|
+
|
|
77
111
|
def test_broken_symlink_rc1(self, boost, installed):
|
|
78
112
|
ghost = paths.home() / ".claude" / "skills" / "ghost"
|
|
79
113
|
ghost.symlink_to(paths.store_dir() / "nowhere")
|
|
@@ -123,7 +157,12 @@ class TestDoctor:
|
|
|
123
157
|
|
|
124
158
|
def test_empty_env_rc0(self, boost, sandbox):
|
|
125
159
|
r = boost("doctor")
|
|
126
|
-
|
|
160
|
+
# `boost tap --defaults`, not `boost tap owner/repo`: the same command
|
|
161
|
+
# `boost search`'s error and the MCP `boost_doctor` tool already name,
|
|
162
|
+
# so a user hitting two of these surfaces reads one problem rather than
|
|
163
|
+
# two. Pinned by TestDoctor's setup-hint test just above.
|
|
164
|
+
assert "no registries tapped" in r.out
|
|
165
|
+
assert "boost tap --defaults" in r.out
|
|
127
166
|
assert "0 skills installed · 0 taps synced · 0 broken links" in r.out
|
|
128
167
|
|
|
129
168
|
def test_tampered_content_rc1(self, boost, installed):
|