boost-skill-cli 1.0.293__tar.gz → 1.0.294__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.vale/styles/config/vocabularies/boost/accept.txt +3 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/CLAUDE.md +25 -0
- {boost_skill_cli-1.0.293/boost_skill_cli.egg-info → boost_skill_cli-1.0.294}/PKG-INFO +41 -3
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/README.md +40 -2
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/cli.py +1 -1
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/configuration.py +82 -43
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/pkg.py +31 -14
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/quality.py +11 -2
- boost_skill_cli-1.0.294/boost_cli/core/agents.py +80 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/config.py +14 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/mcpdecl.py +24 -12
- boost_skill_cli-1.0.294/boost_cli/core/mcphost.py +149 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/rules.py +31 -11
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/store.py +30 -9
- boost_skill_cli-1.0.294/boost_cli/core/workflows.py +149 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294/boost_skill_cli.egg-info}/PKG-INFO +41 -3
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/adapters.html +1 -1
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/commands.html +7 -5
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/index.html +7 -1
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/mcp-hub.html +1 -1
- boost_skill_cli-1.0.294/docs/roadmap/items/gemini-cli-agent-target.md +16 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap.html +12 -1
- boost_skill_cli-1.0.294/tests/bdd/features/mcp.feature +63 -0
- boost_skill_cli-1.0.294/tests/bdd/features/steps/mcp_steps.py +72 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_configuration.py +169 -35
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_info.py +6 -1
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_pkg.py +83 -21
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_quality.py +6 -3
- boost_skill_cli-1.0.294/tests/unit/test_agents.py +162 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_config.py +11 -1
- boost_skill_cli-1.0.294/tests/unit/test_mcphost.py +189 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_rules.py +80 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_store.py +241 -26
- boost_skill_cli-1.0.294/tests/unit/test_workflows.py +297 -0
- boost_skill_cli-1.0.293/boost_cli/core/agents.py +0 -36
- boost_skill_cli-1.0.293/boost_cli/core/workflows.py +0 -59
- boost_skill_cli-1.0.293/tests/bdd/features/mcp.feature +0 -31
- boost_skill_cli-1.0.293/tests/bdd/features/steps/mcp_steps.py +0 -48
- boost_skill_cli-1.0.293/tests/unit/test_agents.py +0 -81
- boost_skill_cli-1.0.293/tests/unit/test_workflows.py +0 -90
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.gitattributes +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.gitignore +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/.vale.ini +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/LICENSE +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/Makefile +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/codecov.yml +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/README.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/examples/README.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/index.html +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/noxfile.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/setup.cfg +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/README.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/boost.css +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/boost.js +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/style/demo.html +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.293 → boost_skill_cli-1.0.294}/tests/visual/visual_check.mjs +0 -0
|
@@ -4,6 +4,7 @@ argparse
|
|
|
4
4
|
bmad
|
|
5
5
|
bookended
|
|
6
6
|
CI's
|
|
7
|
+
CLIs
|
|
7
8
|
Codecov
|
|
8
9
|
codespell
|
|
9
10
|
config
|
|
@@ -13,6 +14,7 @@ Dependabot
|
|
|
13
14
|
deps
|
|
14
15
|
Dev
|
|
15
16
|
docsite
|
|
17
|
+
dotdir
|
|
16
18
|
DSPy
|
|
17
19
|
else's
|
|
18
20
|
env
|
|
@@ -67,6 +69,7 @@ toolkits
|
|
|
67
69
|
traceback
|
|
68
70
|
tracebacks
|
|
69
71
|
unkilled
|
|
72
|
+
unregister
|
|
70
73
|
unstaged
|
|
71
74
|
untap
|
|
72
75
|
vendored
|
|
@@ -186,8 +186,33 @@ work in tests and the dev loop:
|
|
|
186
186
|
~/.agents/skills/ canonical store — single source of truth for installed skills
|
|
187
187
|
~/.agents/skills/.skill-lock.json v3 lock file
|
|
188
188
|
~/.claude/skills/ ~/.windsurf/skills/ ~/.cursor/skills/ symlinked out from the canonical store
|
|
189
|
+
~/.gemini/ rules (GEMINI.md) + workflows only — see below
|
|
189
190
|
```
|
|
190
191
|
|
|
192
|
+
**Four agent targets, but only three get symlinks.** Gemini CLI implements the
|
|
193
|
+
Agent Skills standard and discovers `~/.agents/skills` — the canonical store —
|
|
194
|
+
*directly*, so it is configured with `links_skills: false`. Linking into
|
|
195
|
+
`~/.gemini/skills` too would put one skill in two of its discovery tiers, where
|
|
196
|
+
the `.agents` alias out-ranks whatever we linked, costing the user a "Skill
|
|
197
|
+
conflict detected" line per skill per session and buying nothing. Consequences
|
|
198
|
+
for code you write:
|
|
199
|
+
|
|
200
|
+
- Iterate `agents.linking_agents()` for anything symlink-shaped (link, unlink,
|
|
201
|
+
stale-link sweeps, coverage counts). `agents.enabled_agents()` is still right
|
|
202
|
+
for rules and workflows, which materialize into `~/.gemini/` like any other
|
|
203
|
+
agent's dotdir. `agents.native_store_agents()` is the complement, for reporting.
|
|
204
|
+
- Per-agent *formats* differ and are pure functions in `core/`: `rules.CONTEXT_FILES`
|
|
205
|
+
maps an agent with no rules dir to its context file (`claude-code` → CLAUDE.md /
|
|
206
|
+
CLAUDE.local.md, `gemini` → GEMINI.md for both scopes), and
|
|
207
|
+
`workflows.TOML_COMMAND_AGENTS` marks agents whose slash commands are TOML.
|
|
208
|
+
Gemini's `commands/` slot is `.toml` (`workflows.render_gemini_command`); its
|
|
209
|
+
`agents/` slot stays verbatim Markdown. Getting that backwards produces a file
|
|
210
|
+
the agent silently never loads.
|
|
211
|
+
- `core/mcphost.py` holds the per-host `mcp add`/`remove` grammar. Claude and
|
|
212
|
+
Gemini disagree on name position, the `--` separator, and whether unregister
|
|
213
|
+
needs an explicit scope — all three verified against the real CLIs and pinned
|
|
214
|
+
by `tests/unit/test_mcphost.py`. Don't "simplify" them into one shape.
|
|
215
|
+
|
|
191
216
|
`core/catalog.scan_dir` walks a tap's clone and classifies each file into one
|
|
192
217
|
of the three item kinds (see Non-obvious rules above); `core/store.py` owns
|
|
193
218
|
install, uninstall and sync — copying into the canonical store, symlinking into
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boost-skill-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.294
|
|
4
4
|
Summary: boost — Homebrew for AI coding skills
|
|
5
5
|
Author: Jonathan Reyes
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -726,7 +726,7 @@ Dynamic: license-file
|
|
|
726
726
|
|
|
727
727
|
**Homebrew for AI coding skills.** boost finds, installs, and version-tracks
|
|
728
728
|
skills from GitHub-hosted registries — and wires each one into **Claude Code,
|
|
729
|
-
Windsurf, and
|
|
729
|
+
Windsurf, Cursor, and Gemini CLI** in a single pass.
|
|
730
730
|
|
|
731
731
|
```bash
|
|
732
732
|
pipx install boost-skill-cli
|
|
@@ -735,7 +735,7 @@ boost search tdd # full-content BM25 over every skill
|
|
|
735
735
|
boost install tdd-workflow # → every agent, version-pinned, one lock file
|
|
736
736
|
```
|
|
737
737
|
|
|
738
|
-
No more copying `SKILL.md` into
|
|
738
|
+
No more copying `SKILL.md` into four agent folders and forgetting which one is
|
|
739
739
|
stale. The default install is **zero-dependency** — pure stdlib, no build step.
|
|
740
740
|
|
|
741
741
|
<p align="center">
|
|
@@ -838,6 +838,13 @@ GitHub registries ──boost update──▶ ~/.boost/repos/ (shallow clon
|
|
|
838
838
|
────symlinks───▶ ~/.claude/skills/ ~/.windsurf/skills/ ~/.cursor/skills/
|
|
839
839
|
```
|
|
840
840
|
|
|
841
|
+
Gemini CLI is the one agent that needs no symlink: it implements the
|
|
842
|
+
[Agent Skills](https://agentskills.io) standard and discovers `~/.agents/skills`
|
|
843
|
+
— boost's canonical store — directly. Linking into `~/.gemini/skills` as well
|
|
844
|
+
would put the same skill in two of its discovery tiers, so boost deliberately
|
|
845
|
+
doesn't (`agents.gemini.links_skills` is `false`; flip it to `true` if you ever
|
|
846
|
+
need the copy). Rules and workflows still materialize under `~/.gemini/`.
|
|
847
|
+
|
|
841
848
|
### User scope vs project scope
|
|
842
849
|
|
|
843
850
|
That's the default — **user scope**, the skills you want everywhere. The other
|
|
@@ -912,6 +919,37 @@ available on your PATH (or `ANTHROPIC_API_KEY` is set), and fall back to
|
|
|
912
919
|
plain heuristics when it isn't — so the tool still works without an API key,
|
|
913
920
|
just less cleverly.
|
|
914
921
|
|
|
922
|
+
## boost as an MCP server
|
|
923
|
+
|
|
924
|
+
boost is itself an MCP server, so an agent can search and install skills mid-task
|
|
925
|
+
instead of waiting for you to shell out. `boost mcp register` wires it into every
|
|
926
|
+
agent CLI it finds on your PATH:
|
|
927
|
+
|
|
928
|
+
```bash
|
|
929
|
+
boost mcp register # every installed host (default: --host auto)
|
|
930
|
+
boost mcp register --host gemini # just one
|
|
931
|
+
boost mcp unregister # same host selection, in reverse
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
| Host | CLI | Registered in |
|
|
935
|
+
|------|-----|---------------|
|
|
936
|
+
| Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
|
|
937
|
+
| Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` (`mcpServers`) |
|
|
938
|
+
|
|
939
|
+
A host whose CLI isn't installed is skipped, not an error — name it explicitly
|
|
940
|
+
(`--host gemini`) to have boost print the command for you to run later.
|
|
941
|
+
|
|
942
|
+
Six tools are exposed: `boost_search`, `boost_list`, `boost_info`,
|
|
943
|
+
`boost_install`, `boost_doctor`, and `boost_discover_github`. The server also
|
|
944
|
+
returns MCP `instructions`, which both hosts load into the model's context — it
|
|
945
|
+
tells the agent *when* boost is relevant, so a matching skill gets found at the
|
|
946
|
+
start of a task rather than after the work is already reconstructed by hand.
|
|
947
|
+
|
|
948
|
+
Verify the wiring with `claude mcp list` or `gemini mcp list` — boost should show
|
|
949
|
+
as **Connected**. (Gemini only connects stdio servers in a trusted folder; run
|
|
950
|
+
`gemini` once in the directory and accept the trust prompt if it shows
|
|
951
|
+
`Disabled`.)
|
|
952
|
+
|
|
915
953
|
## Claude Code hooks & the BMAD Method
|
|
916
954
|
|
|
917
955
|
`boost hooks` manages Claude Code hooks in `settings.json` at either scope —
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
**Homebrew for AI coding skills.** boost finds, installs, and version-tracks
|
|
12
12
|
skills from GitHub-hosted registries — and wires each one into **Claude Code,
|
|
13
|
-
Windsurf, and
|
|
13
|
+
Windsurf, Cursor, and Gemini CLI** in a single pass.
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
pipx install boost-skill-cli
|
|
@@ -19,7 +19,7 @@ boost search tdd # full-content BM25 over every skill
|
|
|
19
19
|
boost install tdd-workflow # → every agent, version-pinned, one lock file
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
No more copying `SKILL.md` into
|
|
22
|
+
No more copying `SKILL.md` into four agent folders and forgetting which one is
|
|
23
23
|
stale. The default install is **zero-dependency** — pure stdlib, no build step.
|
|
24
24
|
|
|
25
25
|
<p align="center">
|
|
@@ -122,6 +122,13 @@ GitHub registries ──boost update──▶ ~/.boost/repos/ (shallow clon
|
|
|
122
122
|
────symlinks───▶ ~/.claude/skills/ ~/.windsurf/skills/ ~/.cursor/skills/
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
+
Gemini CLI is the one agent that needs no symlink: it implements the
|
|
126
|
+
[Agent Skills](https://agentskills.io) standard and discovers `~/.agents/skills`
|
|
127
|
+
— boost's canonical store — directly. Linking into `~/.gemini/skills` as well
|
|
128
|
+
would put the same skill in two of its discovery tiers, so boost deliberately
|
|
129
|
+
doesn't (`agents.gemini.links_skills` is `false`; flip it to `true` if you ever
|
|
130
|
+
need the copy). Rules and workflows still materialize under `~/.gemini/`.
|
|
131
|
+
|
|
125
132
|
### User scope vs project scope
|
|
126
133
|
|
|
127
134
|
That's the default — **user scope**, the skills you want everywhere. The other
|
|
@@ -196,6 +203,37 @@ available on your PATH (or `ANTHROPIC_API_KEY` is set), and fall back to
|
|
|
196
203
|
plain heuristics when it isn't — so the tool still works without an API key,
|
|
197
204
|
just less cleverly.
|
|
198
205
|
|
|
206
|
+
## boost as an MCP server
|
|
207
|
+
|
|
208
|
+
boost is itself an MCP server, so an agent can search and install skills mid-task
|
|
209
|
+
instead of waiting for you to shell out. `boost mcp register` wires it into every
|
|
210
|
+
agent CLI it finds on your PATH:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
boost mcp register # every installed host (default: --host auto)
|
|
214
|
+
boost mcp register --host gemini # just one
|
|
215
|
+
boost mcp unregister # same host selection, in reverse
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
| Host | CLI | Registered in |
|
|
219
|
+
|------|-----|---------------|
|
|
220
|
+
| Claude Code | `claude` | `claude mcp add` → its user-scope MCP config |
|
|
221
|
+
| Gemini CLI | `gemini` | `gemini mcp add -s user` → `~/.gemini/settings.json` (`mcpServers`) |
|
|
222
|
+
|
|
223
|
+
A host whose CLI isn't installed is skipped, not an error — name it explicitly
|
|
224
|
+
(`--host gemini`) to have boost print the command for you to run later.
|
|
225
|
+
|
|
226
|
+
Six tools are exposed: `boost_search`, `boost_list`, `boost_info`,
|
|
227
|
+
`boost_install`, `boost_doctor`, and `boost_discover_github`. The server also
|
|
228
|
+
returns MCP `instructions`, which both hosts load into the model's context — it
|
|
229
|
+
tells the agent *when* boost is relevant, so a matching skill gets found at the
|
|
230
|
+
start of a task rather than after the work is already reconstructed by hand.
|
|
231
|
+
|
|
232
|
+
Verify the wiring with `claude mcp list` or `gemini mcp list` — boost should show
|
|
233
|
+
as **Connected**. (Gemini only connects stdio servers in a trusted folder; run
|
|
234
|
+
`gemini` once in the directory and accept the trust prompt if it shows
|
|
235
|
+
`Disabled`.)
|
|
236
|
+
|
|
199
237
|
## Claude Code hooks & the BMAD Method
|
|
200
238
|
|
|
201
239
|
`boost hooks` manages Claude Code hooks in `settings.json` at either scope —
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.294'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 294)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -123,7 +123,7 @@ COMMANDS = [
|
|
|
123
123
|
("completions", "cfg", "configuration", "Generate shell tab-completion scripts"),
|
|
124
124
|
("schedule", "cfg", "configuration", "Manage automatic skill-sync scheduling"),
|
|
125
125
|
("serve", "cfg", "configuration", "Serve the skill catalog over HTTP (port 8787)"),
|
|
126
|
-
("mcp", "cfg", "configuration", "Register boost as an MCP server
|
|
126
|
+
("mcp", "cfg", "configuration", "Register boost as an MCP server (Claude Code, Gemini CLI)"),
|
|
127
127
|
("hooks", "cfg", "hooks", "Manage Claude Code hooks (scope-aware) in settings.json"),
|
|
128
128
|
("bmad", "cfg", "bmad", "Install & manage the BMAD Method (scope-aware, toggleable)"),
|
|
129
129
|
("self-update", "cfg", "configuration", "Update boost itself to the latest version"),
|
|
@@ -24,6 +24,7 @@ from ..core import (
|
|
|
24
24
|
journal,
|
|
25
25
|
lockfile,
|
|
26
26
|
mcp,
|
|
27
|
+
mcphost,
|
|
27
28
|
paths,
|
|
28
29
|
policy,
|
|
29
30
|
rag,
|
|
@@ -870,8 +871,16 @@ def _tool_install(args: dict):
|
|
|
870
871
|
res = store.install(entry)
|
|
871
872
|
lines = ["installed %s v%s from %s → %s"
|
|
872
873
|
% (res.name, entry.get("version", "?"), entry["tap"], res.dest),
|
|
873
|
-
"linked agents: %s" % (", ".join(res.linked) or "none")
|
|
874
|
-
|
|
874
|
+
"linked agents: %s" % (", ".join(res.linked) or "none")]
|
|
875
|
+
# Without this an agent that reads the canonical store — Gemini CLI — sees
|
|
876
|
+
# only "linked agents: claude-code, windsurf, cursor", concludes the skill
|
|
877
|
+
# did not reach *it*, and goes back to reconstructing the work by hand.
|
|
878
|
+
# That is the exact failure this tool exists to prevent, so the line says
|
|
879
|
+
# plainly that the skill is already usable.
|
|
880
|
+
if res.native:
|
|
881
|
+
lines.append("available without linking (reads %s directly): %s"
|
|
882
|
+
% (res.dest.parent, ", ".join(res.native)))
|
|
883
|
+
lines.append("quality score: %d/100" % res.score)
|
|
875
884
|
if res.conflicts:
|
|
876
885
|
lines.append("conflicts (left in place): %s" % ", ".join(res.conflicts))
|
|
877
886
|
# The same prompt-injection and secret scan `boost install` runs. This path
|
|
@@ -1004,59 +1013,89 @@ def _mcp_tool(tool: str, args: dict):
|
|
|
1004
1013
|
return REGISTRY.call(tool, args)
|
|
1005
1014
|
|
|
1006
1015
|
|
|
1016
|
+
def _run_mcp_host(host: str, action: str, cmd) -> bool:
|
|
1017
|
+
"""Run one host's register/unregister argv. True if it actually ran.
|
|
1018
|
+
|
|
1019
|
+
A host whose CLI is not installed is *not* an error — most machines have
|
|
1020
|
+
one agent CLI, not all of them — so the argv is printed for the user to run
|
|
1021
|
+
later and the caller moves on to the next host. A CLI that is present and
|
|
1022
|
+
fails is a real error and raises.
|
|
1023
|
+
"""
|
|
1024
|
+
exe = mcphost.cli(host)
|
|
1025
|
+
if not shutil.which(exe):
|
|
1026
|
+
return False
|
|
1027
|
+
try:
|
|
1028
|
+
proc = subprocess.run(cmd, capture_output=True, text=True, timeout=60)
|
|
1029
|
+
except (OSError, subprocess.TimeoutExpired) as e:
|
|
1030
|
+
raise BoostError("%s mcp %s failed: %s" % (exe, action, e),
|
|
1031
|
+
hint="run it yourself: " + " ".join(cmd)) from e
|
|
1032
|
+
for ln in (proc.stdout or "").strip().splitlines():
|
|
1033
|
+
out.info(ln)
|
|
1034
|
+
if proc.returncode != 0:
|
|
1035
|
+
tail = (proc.stderr or "").strip().splitlines()
|
|
1036
|
+
raise BoostError("%s mcp %s failed: %s"
|
|
1037
|
+
% (exe, action, tail[-1] if tail else "unknown error"),
|
|
1038
|
+
hint="run it yourself: " + " ".join(cmd))
|
|
1039
|
+
return True
|
|
1040
|
+
|
|
1041
|
+
|
|
1007
1042
|
def cmd_mcp(argv) -> int:
|
|
1008
|
-
"""boost mcp [register|unregister] [--stdio]"""
|
|
1043
|
+
"""boost mcp [register|unregister] [--host H] [--stdio]"""
|
|
1009
1044
|
p = cliparse.parser(
|
|
1010
1045
|
prog="boost mcp",
|
|
1011
|
-
description="Register boost as an MCP server for
|
|
1046
|
+
description="Register boost as an MCP server for your agent CLIs")
|
|
1012
1047
|
p.add_argument("action", nargs="?", default="register",
|
|
1013
1048
|
choices=("register", "unregister"),
|
|
1014
1049
|
help="what to do (default: register)")
|
|
1050
|
+
p.add_argument("--host", metavar="H", default="auto",
|
|
1051
|
+
help="agent CLI to (un)register with: %s, or `auto` "
|
|
1052
|
+
"(default) for every one that is installed"
|
|
1053
|
+
% ", ".join(mcphost.hosts()))
|
|
1015
1054
|
p.add_argument("--stdio", action="store_true",
|
|
1016
|
-
help="run the MCP server on stdin/stdout (used by
|
|
1055
|
+
help="run the MCP server on stdin/stdout (used by the agent)")
|
|
1017
1056
|
args = p.parse_args(argv)
|
|
1018
1057
|
|
|
1019
1058
|
if args.stdio:
|
|
1020
1059
|
return mcp.serve_stdio(REGISTRY, version=__version__)
|
|
1021
1060
|
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
journal.log("mcp", args.action)
|
|
1061
|
+
try:
|
|
1062
|
+
targets = mcphost.resolve(args.host)
|
|
1063
|
+
except KeyError as e:
|
|
1064
|
+
raise BoostError("unknown MCP host %r" % args.host,
|
|
1065
|
+
hint="known hosts: %s" % ", ".join(mcphost.hosts())) from e
|
|
1066
|
+
|
|
1067
|
+
shim = str(paths.launcher())
|
|
1068
|
+
# `auto` skips hosts that are not installed; naming a host explicitly (or
|
|
1069
|
+
# `all`) always reports it, so a user setting up a machine can see the argv
|
|
1070
|
+
# for an agent CLI they have not installed yet.
|
|
1071
|
+
explicit = args.host not in (None, "", "auto")
|
|
1072
|
+
done, missing = [], []
|
|
1073
|
+
for host in targets:
|
|
1074
|
+
cmd = mcphost.argv(host, args.action, shim)
|
|
1075
|
+
if _run_mcp_host(host, args.action, cmd):
|
|
1076
|
+
done.append(host)
|
|
1077
|
+
else:
|
|
1078
|
+
missing.append(host)
|
|
1079
|
+
if explicit:
|
|
1080
|
+
out.warn("`%s` CLI not found — run this yourself:"
|
|
1081
|
+
% mcphost.cli(host))
|
|
1082
|
+
out.info(" ".join(cmd))
|
|
1083
|
+
|
|
1084
|
+
verb = "register" if args.action == "register" else "unregister"
|
|
1085
|
+
for host in done:
|
|
1086
|
+
out.ok("%sed boost as an MCP server for %s (scope: user)"
|
|
1087
|
+
% (verb, mcphost.label(host)))
|
|
1088
|
+
if not done:
|
|
1089
|
+
# Nothing ran. Under `auto` nothing has been printed yet, so say which
|
|
1090
|
+
# CLIs were looked for rather than exiting silently on success.
|
|
1091
|
+
if not explicit:
|
|
1092
|
+
out.warn("no agent CLI found (looked for: %s)"
|
|
1093
|
+
% ", ".join(mcphost.cli(h) for h in missing))
|
|
1094
|
+
for host in missing:
|
|
1095
|
+
out.info(" ".join(mcphost.argv(host, args.action, shim)))
|
|
1096
|
+
journal.log("mcp", args.action, hosts="")
|
|
1097
|
+
return 0
|
|
1098
|
+
journal.log("mcp", args.action, hosts=",".join(done))
|
|
1060
1099
|
return 0
|
|
1061
1100
|
|
|
1062
1101
|
|
|
@@ -112,9 +112,13 @@ def _offer_mcp(res: store.InstallResult, no_mcp: bool = False) -> None:
|
|
|
112
112
|
is stated at install time, and boost offers to run the registration for the
|
|
113
113
|
servers that came with a runnable spec.
|
|
114
114
|
|
|
115
|
-
Advisory, never fatal: a declined prompt, a missing
|
|
115
|
+
Advisory, never fatal: a declined prompt, a missing agent CLI or a failed
|
|
116
116
|
registration all leave the skill installed. Suppressed by ``--no-mcp`` (passed
|
|
117
117
|
down as ``no_mcp``) or by exporting ``BOOST_NO_MCP_OFFER``.
|
|
118
|
+
|
|
119
|
+
The offer targets whichever agent CLIs are actually installed, so a machine
|
|
120
|
+
with only Gemini CLI is offered ``gemini mcp add`` rather than a ``claude``
|
|
121
|
+
command it cannot run.
|
|
118
122
|
"""
|
|
119
123
|
rows = res.mcp_servers
|
|
120
124
|
if not rows or no_mcp or os.environ.get("BOOST_NO_MCP_OFFER"):
|
|
@@ -132,22 +136,30 @@ def _offer_mcp(res: store.InstallResult, no_mcp: bool = False) -> None:
|
|
|
132
136
|
# Name-only declarations: boost will not invent a command line.
|
|
133
137
|
out.dim(" install these yourself, then `boost mcp register`")
|
|
134
138
|
return
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
from ..core import mcphost
|
|
140
|
+
# Offer the CLIs that are actually here. With none installed we still fall
|
|
141
|
+
# back to the full list so the manual command lines get printed.
|
|
142
|
+
targets = [h for h in mcphost.hosts() if shutil.which(mcphost.cli(h))] \
|
|
143
|
+
or mcphost.hosts()
|
|
144
|
+
where = " · ".join(mcphost.label(h) for h in targets)
|
|
145
|
+
if not out.confirm("register %s with %s now?"
|
|
146
|
+
% (_plural(len(wirable), "server"), where), default=False):
|
|
147
|
+
out.dim(" skipped — `%s mcp add …` when you're ready"
|
|
148
|
+
% mcphost.cli(targets[0]))
|
|
138
149
|
return
|
|
139
150
|
for row in wirable:
|
|
140
|
-
|
|
151
|
+
for host in targets:
|
|
152
|
+
_register_mcp_server(row["name"], row["spec"], host=host)
|
|
141
153
|
|
|
142
154
|
|
|
143
|
-
def _register_mcp_server(name: str, spec: dict) -> None:
|
|
144
|
-
"""Run one
|
|
155
|
+
def _register_mcp_server(name: str, spec: dict, host: str = "claude") -> None:
|
|
156
|
+
"""Run one `<host> mcp add` for a skill-declared server. Never raises."""
|
|
145
157
|
import subprocess
|
|
146
158
|
|
|
147
|
-
from ..core import mcpdecl
|
|
148
|
-
argv = mcpdecl.register_argv(name, spec)
|
|
149
|
-
if not shutil.which(
|
|
150
|
-
out.warn("`
|
|
159
|
+
from ..core import mcpdecl, mcphost
|
|
160
|
+
argv = mcpdecl.register_argv(name, spec, host=host)
|
|
161
|
+
if not shutil.which(mcphost.cli(host)):
|
|
162
|
+
out.warn("`%s` CLI not found — run this yourself:" % mcphost.cli(host))
|
|
151
163
|
out.info(" " + " ".join(argv))
|
|
152
164
|
return
|
|
153
165
|
try:
|
|
@@ -162,8 +174,8 @@ def _register_mcp_server(name: str, spec: dict) -> None:
|
|
|
162
174
|
% (name, tail[-1] if tail else "unknown error"))
|
|
163
175
|
out.info(" run it yourself: " + " ".join(argv))
|
|
164
176
|
return
|
|
165
|
-
out.ok("registered MCP server %s" % name)
|
|
166
|
-
journal.log("mcp-register", name)
|
|
177
|
+
out.ok("registered MCP server %s with %s" % (name, mcphost.label(host)))
|
|
178
|
+
journal.log("mcp-register", name, host=host)
|
|
167
179
|
|
|
168
180
|
|
|
169
181
|
def _report_result(res: store.InstallResult, no_mcp: bool = False) -> None:
|
|
@@ -191,8 +203,13 @@ def _report_result(res: store.InstallResult, no_mcp: bool = False) -> None:
|
|
|
191
203
|
out.ok("copied to %s" % _tilde(res.dest))
|
|
192
204
|
if res.linked:
|
|
193
205
|
out.ok("linked → %s" % " · ".join(res.linked))
|
|
194
|
-
|
|
206
|
+
elif not res.native:
|
|
195
207
|
out.warn("no agent links created (no enabled agents?)")
|
|
208
|
+
# Agents that read the canonical store need no link, but saying nothing
|
|
209
|
+
# would make a Gemini-only install look like it reached no agent at all.
|
|
210
|
+
if res.native:
|
|
211
|
+
out.ok("available to %s (reads the store directly)"
|
|
212
|
+
% " · ".join(agents.display_name(a) for a in res.native))
|
|
196
213
|
for path in res.conflicts:
|
|
197
214
|
out.warn("not linked: %s exists and is not managed by boost" % _tilde(path))
|
|
198
215
|
out.ok("lock updated (.skill-lock.json)")
|
|
@@ -605,7 +605,9 @@ def cmd_heal(argv):
|
|
|
605
605
|
dry = args.dry_run
|
|
606
606
|
actions: List[str] = []
|
|
607
607
|
|
|
608
|
-
|
|
608
|
+
# linking_agents, matching agents.ensure_agent_dirs below: a native-store
|
|
609
|
+
# agent's skills dir is never written to, so it is not a missing directory.
|
|
610
|
+
wanted = [paths.boost_home(), paths.repos_dir(), paths.cache_dir(), paths.logs_dir(), paths.state_dir(), paths.snapshots_dir(), paths.lock_history_dir(), paths.profiles_dir(), paths.store_dir(), *list(agents.linking_agents().values())]
|
|
609
611
|
missing = [d for d in wanted if not d.is_dir()]
|
|
610
612
|
if missing:
|
|
611
613
|
if dry:
|
|
@@ -818,7 +820,7 @@ def cmd_health(argv):
|
|
|
818
820
|
|
|
819
821
|
expected = [n for n, e in installed if not e.get("quarantined")]
|
|
820
822
|
coverage_ok = True
|
|
821
|
-
for agent, adir in agents.
|
|
823
|
+
for agent, adir in agents.linking_agents().items():
|
|
822
824
|
linked = sum(1 for n in expected
|
|
823
825
|
if (adir / n).is_symlink() and (adir / n).exists())
|
|
824
826
|
full = linked == len(expected)
|
|
@@ -826,6 +828,13 @@ def cmd_health(argv):
|
|
|
826
828
|
out.kv(agent, "%d/%d %s" % (linked, len(expected),
|
|
827
829
|
out.role("✓", "success") if full
|
|
828
830
|
else out.role("!", "warn")))
|
|
831
|
+
# Agents that read the canonical store have no links to count — scoring
|
|
832
|
+
# them 0/N would report a healthy setup as broken. They are listed anyway,
|
|
833
|
+
# because an agent silently absent from a health report reads as "boost is
|
|
834
|
+
# not wired up for it".
|
|
835
|
+
for agent in agents.native_store_agents():
|
|
836
|
+
out.kv(agent, "%d/%d %s (reads the store directly)"
|
|
837
|
+
% (len(expected), len(expected), out.role("✓", "success")))
|
|
829
838
|
|
|
830
839
|
drift_counts: dict = {}
|
|
831
840
|
for name, entry in installed:
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""AI agent targets: where installed skills get symlinked."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Dict
|
|
6
|
+
|
|
7
|
+
from . import config, paths
|
|
8
|
+
|
|
9
|
+
DISPLAY = {"claude-code": "Claude Code", "windsurf": "Windsurf",
|
|
10
|
+
"cursor": "Cursor", "gemini": "Gemini CLI"}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def known_agents() -> Dict[str, dict]:
|
|
14
|
+
"""{name: {"dir": Path, "enabled": bool, "links_skills": bool}} per agent."""
|
|
15
|
+
out = {}
|
|
16
|
+
for name, spec in (config.get("agents") or {}).items():
|
|
17
|
+
out[name] = {
|
|
18
|
+
"dir": paths.expand(str(spec.get("dir", ""))),
|
|
19
|
+
"enabled": bool(spec.get("enabled", True)),
|
|
20
|
+
# Defaults True: an agent only reads the canonical store if it
|
|
21
|
+
# implements the Agent Skills standard's `~/.agents/skills` path,
|
|
22
|
+
# which most do not, so the symlink is the safe assumption.
|
|
23
|
+
"links_skills": bool(spec.get("links_skills", True)),
|
|
24
|
+
}
|
|
25
|
+
return out
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def enabled_agents() -> Dict[str, Path]:
|
|
29
|
+
"""{name: dir Path} for just the agents whose "enabled" flag is true."""
|
|
30
|
+
return {n: s["dir"] for n, s in known_agents().items() if s["enabled"]}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def linking_agents() -> Dict[str, Path]:
|
|
34
|
+
"""The enabled agents that need a skill *symlinked* into their own dir.
|
|
35
|
+
|
|
36
|
+
Most agents do: they only look inside their own config directory, so a
|
|
37
|
+
skill is invisible until boost links it there. Gemini CLI is the exception —
|
|
38
|
+
it implements the Agent Skills standard and discovers ``~/.agents/skills``
|
|
39
|
+
directly, which is exactly :func:`paths.store_dir`. Linking for it would put
|
|
40
|
+
the same skill in two of its discovery tiers, and since the ``.agents``
|
|
41
|
+
alias out-ranks ``.gemini/skills`` within the user tier, the copy boost
|
|
42
|
+
linked could never win — it would only make Gemini log a "Skill conflict
|
|
43
|
+
detected" line per skill, every session.
|
|
44
|
+
|
|
45
|
+
So this is the set to iterate for anything symlink-shaped (link, unlink,
|
|
46
|
+
stale-link sweeps, coverage checks). :func:`enabled_agents` remains the set
|
|
47
|
+
for everything that materializes *into* an agent's dotdir — rules and
|
|
48
|
+
workflows — because those have no canonical store to be read from.
|
|
49
|
+
"""
|
|
50
|
+
return {n: s["dir"] for n, s in known_agents().items()
|
|
51
|
+
if s["enabled"] and s["links_skills"]}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def native_store_agents() -> Dict[str, Path]:
|
|
55
|
+
"""Enabled agents that read the canonical store without a symlink.
|
|
56
|
+
|
|
57
|
+
The complement of :func:`linking_agents` within :func:`enabled_agents` —
|
|
58
|
+
reported at install time so "linked → a · b · c" never reads as "and not
|
|
59
|
+
the agent you actually use".
|
|
60
|
+
"""
|
|
61
|
+
return {n: s["dir"] for n, s in known_agents().items()
|
|
62
|
+
if s["enabled"] and not s["links_skills"]}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def display_name(agent: str) -> str:
|
|
66
|
+
"""`claude-code` -> "Claude Code"; unknown names pass through unchanged."""
|
|
67
|
+
return DISPLAY.get(agent, agent)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def ensure_agent_dirs() -> None:
|
|
71
|
+
"""Create every *linking* agent's skills dir (`mkdir -p`, idempotent).
|
|
72
|
+
|
|
73
|
+
Not :func:`enabled_agents`: this exists so a skill has somewhere to be
|
|
74
|
+
linked, and boost never links into a native-store agent's dir. Creating
|
|
75
|
+
``~/.gemini/skills`` anyway would leave an empty directory nothing ever
|
|
76
|
+
writes to, which ``boost heal`` would first report as a missing directory
|
|
77
|
+
it needed to create.
|
|
78
|
+
"""
|
|
79
|
+
for d in linking_agents().values():
|
|
80
|
+
d.mkdir(parents=True, exist_ok=True)
|
|
@@ -12,6 +12,20 @@ DEFAULTS = {
|
|
|
12
12
|
"claude-code": {"dir": "~/.claude/skills", "enabled": True},
|
|
13
13
|
"windsurf": {"dir": "~/.windsurf/skills", "enabled": True},
|
|
14
14
|
"cursor": {"dir": "~/.cursor/skills", "enabled": True},
|
|
15
|
+
# Gemini CLI discovers boost's canonical store directly: its user tier
|
|
16
|
+
# reads `~/.gemini/skills` **or the `~/.agents/skills` alias**, and that
|
|
17
|
+
# alias is exactly paths.store_dir(). So skills need no symlink —
|
|
18
|
+
# `links_skills: false` — and linking anyway would put the same skill in
|
|
19
|
+
# two of Gemini's discovery tiers, where the alias out-ranks the dir we
|
|
20
|
+
# linked into: the link could never win, it would only cost the user a
|
|
21
|
+
# "Skill conflict detected" line per skill at every session start.
|
|
22
|
+
#
|
|
23
|
+
# The dir is still configured because it anchors everything that is NOT
|
|
24
|
+
# a store symlink: `~/.gemini` is where rules (GEMINI.md) and workflows
|
|
25
|
+
# (commands/, agents/) materialize. Set links_skills true to restore the
|
|
26
|
+
# symlink if that alias is ever narrowed.
|
|
27
|
+
"gemini": {"dir": "~/.gemini/skills", "enabled": True,
|
|
28
|
+
"links_skills": False},
|
|
15
29
|
},
|
|
16
30
|
"taps": [], # [{"name": "owner/repo", "url": "...", "curated": bool}]
|
|
17
31
|
"ai": {
|