boost-skill-cli 1.0.201__tar.gz → 1.0.203__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.201/boost_skill_cli.egg-info → boost_skill_cli-1.0.203}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/pkg.py +73 -2
- boost_skill_cli-1.0.203/boost_cli/core/resolve.py +136 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/serve.py +9 -2
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/SOURCES.txt +5 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/commands.html +4 -3
- boost_skill_cli-1.0.203/docs/roadmap/items/install-resolves-skill-dependencies.md +30 -0
- boost_skill_cli-1.0.203/docs/roadmap/items/installed-skill-trust-audit.md +25 -0
- boost_skill_cli-1.0.203/docs/roadmap/items/mcp-aware-skills.md +25 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap.html +69 -1
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_intelligence.py +3 -1
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_pkg.py +23 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_everyday_loop.py +3 -1
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/smoke.sh +4 -1
- boost_skill_cli-1.0.203/tests/unit/test_resolve.py +162 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_serve.py +59 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.gitattributes +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.gitignore +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/.vale.ini +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/LICENSE +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/Makefile +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/README.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/index.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/examples/README.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/index.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/noxfile.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/setup.cfg +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/README.md +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/boost.css +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/boost.js +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/style/demo.html +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.203'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 203)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -17,8 +17,8 @@ from typing import Dict, List, Optional
|
|
|
17
17
|
from .. import cliparse
|
|
18
18
|
from ..core import (adapters, agents, catalog, config, frontmatter, gitutil,
|
|
19
19
|
injectscan, integrity, journal, lockfile, paths, projectlock,
|
|
20
|
-
registry, scopes, secretscan, staleness, store,
|
|
21
|
-
updatediff, util)
|
|
20
|
+
registry, resolve, scopes, secretscan, staleness, store,
|
|
21
|
+
typosquat, updatediff, util)
|
|
22
22
|
from ..core import output as out
|
|
23
23
|
from ..errors import BoostError
|
|
24
24
|
|
|
@@ -163,6 +163,56 @@ def _boostfile_text(skills: Dict[str, dict], via: str = "boost bundle dump") ->
|
|
|
163
163
|
return "\n".join(lines) + "\n"
|
|
164
164
|
|
|
165
165
|
|
|
166
|
+
def _rel_list(meta: dict, key: str) -> List[str]:
|
|
167
|
+
"""A skill's `requires:`/`conflicts:` frontmatter as a clean name list."""
|
|
168
|
+
val = (meta or {}).get(key)
|
|
169
|
+
if val in (None, "", False):
|
|
170
|
+
return []
|
|
171
|
+
if isinstance(val, list):
|
|
172
|
+
return [str(x).strip() for x in val if str(x).strip()]
|
|
173
|
+
return [s.strip() for s in str(val).split(",") if s.strip()]
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _skill_relations(name: str, key: str) -> List[str]:
|
|
177
|
+
"""`requires:`/`conflicts:` for a skill by name, from its catalog entry."""
|
|
178
|
+
matches = catalog.find(name)
|
|
179
|
+
if not matches:
|
|
180
|
+
return []
|
|
181
|
+
return _rel_list(matches[0].get("meta") or {}, key)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _expand_dependencies(entries: List[dict]) -> "tuple[List[dict], resolve.Resolution]":
|
|
185
|
+
"""Grow the requested entries into their full `requires:` closure.
|
|
186
|
+
|
|
187
|
+
Returns ``(ordered_entries, resolution)`` — the entries to install in
|
|
188
|
+
dependency-first order (roots plus any pulled-in dependencies that are not
|
|
189
|
+
already installed), and the :class:`resolve.Resolution` carrying what was
|
|
190
|
+
added, any advisory conflicts, and unresolved (dangling) requirements.
|
|
191
|
+
"""
|
|
192
|
+
installed = frozenset(lockfile.installed())
|
|
193
|
+
res = resolve.resolve(
|
|
194
|
+
[e["name"] for e in entries],
|
|
195
|
+
lambda n: _skill_relations(n, "requires"),
|
|
196
|
+
lambda n: _skill_relations(n, "conflicts"),
|
|
197
|
+
installed=installed,
|
|
198
|
+
known=lambda n: bool(catalog.find(n)),
|
|
199
|
+
)
|
|
200
|
+
by_name = {e["name"]: e for e in entries}
|
|
201
|
+
ordered: List[dict] = []
|
|
202
|
+
for name in res.order:
|
|
203
|
+
if name in by_name:
|
|
204
|
+
ordered.append(by_name[name])
|
|
205
|
+
continue
|
|
206
|
+
try:
|
|
207
|
+
ordered.append(catalog.resolve_one(name))
|
|
208
|
+
except BoostError:
|
|
209
|
+
# A dep that resolves nowhere unambiguously is reported via
|
|
210
|
+
# res.unresolved; skip it here rather than abort the whole install.
|
|
211
|
+
if name not in res.unresolved:
|
|
212
|
+
res.unresolved.append(name)
|
|
213
|
+
return ordered, res
|
|
214
|
+
|
|
215
|
+
|
|
166
216
|
# ── install ──────────────────────────────────────────────────────────────
|
|
167
217
|
|
|
168
218
|
def cmd_install(argv: List[str]) -> int:
|
|
@@ -186,6 +236,8 @@ def cmd_install(argv: List[str]) -> int:
|
|
|
186
236
|
help="into your user config (= --scope user, default)")
|
|
187
237
|
ap.add_argument("--dry-run", action="store_true",
|
|
188
238
|
help="show what would happen without changing anything")
|
|
239
|
+
ap.add_argument("--no-deps", action="store_true",
|
|
240
|
+
help="install only the named skills, not their `requires:`")
|
|
189
241
|
args = ap.parse_args(argv)
|
|
190
242
|
args.scope = args.scope or scopes.SCOPE_USER
|
|
191
243
|
only = _check_agents(args.agent)
|
|
@@ -202,6 +254,25 @@ def cmd_install(argv: List[str]) -> int:
|
|
|
202
254
|
|
|
203
255
|
_warn_confusions(entries)
|
|
204
256
|
|
|
257
|
+
# Grow the request into its `requires:` closure (deps installed first),
|
|
258
|
+
# unless the caller opted out. Only skills carry dependency frontmatter;
|
|
259
|
+
# rules/workflows pass through unchanged.
|
|
260
|
+
if not args.no_deps and entries:
|
|
261
|
+
entries, dep_res = _expand_dependencies(entries)
|
|
262
|
+
if dep_res.added:
|
|
263
|
+
out.info("pulling in %s required by your selection: %s"
|
|
264
|
+
% (_plural(len(dep_res.added), "dependency"),
|
|
265
|
+
", ".join(dep_res.added)))
|
|
266
|
+
for name in dep_res.unresolved:
|
|
267
|
+
out.warn("required skill %r is in no tap — skipped "
|
|
268
|
+
"(install it manually or `boost tap` its source)" % name)
|
|
269
|
+
for skill, clash in dep_res.conflicts:
|
|
270
|
+
out.warn("%s declares a conflict with %s (also present)" % (skill, clash))
|
|
271
|
+
# Pulling in dependencies can turn a single-name request into a multi-item
|
|
272
|
+
# install (per-item headings); it must never *lower* multi (e.g. when an
|
|
273
|
+
# unknown co-requested name was dropped), so OR rather than reassign.
|
|
274
|
+
multi = multi or len(entries) > 1
|
|
275
|
+
|
|
205
276
|
if args.dry_run:
|
|
206
277
|
targets = [a for a in agents.enabled_agents() if not only or a in only]
|
|
207
278
|
pbase = scopes.resolve_base(args.scope)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Skill dependency resolution — turn a set of requested skills into the full,
|
|
2
|
+
correctly-ordered install list by following each skill's ``requires:`` closure.
|
|
3
|
+
|
|
4
|
+
boost skills declare relationships in frontmatter (``requires:`` /
|
|
5
|
+
``conflicts:``); until now those were only *displayed* (``boost info`` /
|
|
6
|
+
``boost deps``). This module is the resolver that makes ``boost install`` act on
|
|
7
|
+
them — the "Homebrew installs dependencies" behavior — as a pure, dependency-
|
|
8
|
+
injected function so it is unit- and mutation-testable with no catalog or
|
|
9
|
+
filesystem access.
|
|
10
|
+
|
|
11
|
+
The caller supplies two lookups so the core stays I/O-free:
|
|
12
|
+
|
|
13
|
+
* ``requires_of(name) -> list[str]`` — the skills ``name`` declares it needs.
|
|
14
|
+
* ``conflicts_of(name) -> list[str]`` — the skills ``name`` declares it clashes
|
|
15
|
+
with (optional; defaults to none).
|
|
16
|
+
|
|
17
|
+
and, optionally, ``known(name) -> bool`` to tell a resolvable dependency from a
|
|
18
|
+
dangling one (a ``requires:`` naming a skill in no tap). Everything else is
|
|
19
|
+
plain graph work.
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from typing import Callable, FrozenSet, List, Optional, Sequence, Tuple
|
|
25
|
+
|
|
26
|
+
__all__ = ["Resolution", "resolve"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class Resolution:
|
|
31
|
+
"""The outcome of resolving a set of requested skills.
|
|
32
|
+
|
|
33
|
+
* ``order`` — the install order, dependencies before dependents, with
|
|
34
|
+
already-installed skills that were only pulled in as dependencies dropped.
|
|
35
|
+
A *requested* skill stays in ``order`` even when already installed (so an
|
|
36
|
+
explicit ``boost install x`` still reinstalls/upgrades it, matching the
|
|
37
|
+
pre-resolver behavior).
|
|
38
|
+
* ``added`` — the transitive dependencies that were pulled in (``order``
|
|
39
|
+
minus the requested roots), in install order — what to tell the user got
|
|
40
|
+
added on their behalf.
|
|
41
|
+
* ``conflicts`` — ``(skill, clashes_with)`` pairs where a skill in the plan
|
|
42
|
+
declares a ``conflicts:`` against something already installed or also
|
|
43
|
+
being installed. Advisory (a warning), never a hard failure.
|
|
44
|
+
* ``unresolved`` — required skill names with no known source (a dangling
|
|
45
|
+
``requires:``); surfaced so the caller can warn rather than crash.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
order: List[str] = field(default_factory=list)
|
|
49
|
+
added: List[str] = field(default_factory=list)
|
|
50
|
+
conflicts: List[Tuple[str, str]] = field(default_factory=list)
|
|
51
|
+
unresolved: List[str] = field(default_factory=list)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _norm(names: Sequence[str]) -> List[str]:
|
|
55
|
+
"""De-dupe a name sequence preserving first-seen order."""
|
|
56
|
+
seen: List[str] = []
|
|
57
|
+
for n in names:
|
|
58
|
+
if n and n not in seen:
|
|
59
|
+
seen.append(n)
|
|
60
|
+
return seen
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def resolve(
|
|
64
|
+
roots: Sequence[str],
|
|
65
|
+
requires_of: Callable[[str], Sequence[str]],
|
|
66
|
+
conflicts_of: Optional[Callable[[str], Sequence[str]]] = None,
|
|
67
|
+
*,
|
|
68
|
+
installed: FrozenSet[str] = frozenset(),
|
|
69
|
+
known: Optional[Callable[[str], bool]] = None,
|
|
70
|
+
) -> Resolution:
|
|
71
|
+
"""Resolve ``roots`` plus their ``requires:`` closure into an install plan.
|
|
72
|
+
|
|
73
|
+
Post-order depth-first traversal yields dependencies before the skills that
|
|
74
|
+
need them. The traversal is cycle-safe (a skill on the current DFS stack is
|
|
75
|
+
not re-entered) and each skill is visited once. A dependency that is already
|
|
76
|
+
``installed`` is not re-added; a *requested* root is always kept so an
|
|
77
|
+
explicit reinstall/upgrade still happens. Unknown dependencies (per
|
|
78
|
+
``known``) are recorded in ``unresolved`` and not traversed further.
|
|
79
|
+
"""
|
|
80
|
+
conflicts_of = conflicts_of or (lambda _n: [])
|
|
81
|
+
known = known or (lambda _n: True)
|
|
82
|
+
roots = _norm(roots)
|
|
83
|
+
root_set = set(roots)
|
|
84
|
+
|
|
85
|
+
order: List[str] = []
|
|
86
|
+
done: set = set() # fully-processed (post-order emitted)
|
|
87
|
+
on_stack: set = set() # currently being visited — cycle guard
|
|
88
|
+
unresolved: List[str] = []
|
|
89
|
+
|
|
90
|
+
def visit(name: str, is_root: bool) -> None:
|
|
91
|
+
if name in done or name in on_stack:
|
|
92
|
+
return # already emitted, or a cycle — stop
|
|
93
|
+
# An already-installed skill pulled in only as a dependency is assumed
|
|
94
|
+
# satisfied — don't re-traverse or re-emit its subtree. (A requested root
|
|
95
|
+
# is still walked so an explicit reinstall re-checks its deps; gap-filling
|
|
96
|
+
# of a broken installed skill is `boost heal`'s job, not install's.)
|
|
97
|
+
if name in installed and not is_root:
|
|
98
|
+
done.add(name)
|
|
99
|
+
return
|
|
100
|
+
on_stack.add(name)
|
|
101
|
+
for dep in _norm(list(requires_of(name) or [])):
|
|
102
|
+
if dep == name:
|
|
103
|
+
continue # a self-require is a no-op, never a cycle error
|
|
104
|
+
if not known(dep):
|
|
105
|
+
if dep not in unresolved:
|
|
106
|
+
unresolved.append(dep)
|
|
107
|
+
continue
|
|
108
|
+
visit(dep, is_root=False)
|
|
109
|
+
on_stack.discard(name)
|
|
110
|
+
done.add(name)
|
|
111
|
+
# Emit unless it is an already-installed skill pulled in only as a dep;
|
|
112
|
+
# a requested root is always emitted (reinstall/upgrade semantics).
|
|
113
|
+
if is_root or name not in installed:
|
|
114
|
+
order.append(name)
|
|
115
|
+
|
|
116
|
+
for r in roots:
|
|
117
|
+
visit(r, is_root=True)
|
|
118
|
+
|
|
119
|
+
added = [n for n in order if n not in root_set]
|
|
120
|
+
|
|
121
|
+
# Conflict scan: anything in the plan (being installed) OR already installed
|
|
122
|
+
# is a live presence; flag a declared conflict against any live presence.
|
|
123
|
+
live = set(order) | set(installed)
|
|
124
|
+
conflicts: List[Tuple[str, str]] = []
|
|
125
|
+
seen_pairs: set = set()
|
|
126
|
+
for skill in order:
|
|
127
|
+
for clash in _norm(list(conflicts_of(skill) or [])):
|
|
128
|
+
if clash == skill or clash not in live:
|
|
129
|
+
continue
|
|
130
|
+
key = (skill, clash)
|
|
131
|
+
if key not in seen_pairs:
|
|
132
|
+
seen_pairs.add(key)
|
|
133
|
+
conflicts.append(key)
|
|
134
|
+
|
|
135
|
+
return Resolution(order=order, added=added,
|
|
136
|
+
conflicts=conflicts, unresolved=unresolved)
|
|
@@ -20,7 +20,7 @@ from typing import Optional, Tuple
|
|
|
20
20
|
|
|
21
21
|
from .. import __version__
|
|
22
22
|
from ..errors import BoostError
|
|
23
|
-
from . import catalog, lockfile, registry, store
|
|
23
|
+
from . import catalog, lockfile, logs, registry, store
|
|
24
24
|
from . import output as out
|
|
25
25
|
import contextlib
|
|
26
26
|
|
|
@@ -173,9 +173,16 @@ class _CatalogHandler(BaseHTTPRequestHandler):
|
|
|
173
173
|
except BrokenPipeError:
|
|
174
174
|
pass
|
|
175
175
|
except Exception as e:
|
|
176
|
+
# Never leak internal exception detail (filesystem paths, state) to
|
|
177
|
+
# the HTTP client — it reaches remote callers when the server is
|
|
178
|
+
# exposed with `--host 0.0.0.0`. Log the specifics server-side and
|
|
179
|
+
# return a generic body.
|
|
180
|
+
logs.get_logger().warning("serve: %s %s failed: %s: %s",
|
|
181
|
+
self.command, self.path,
|
|
182
|
+
type(e).__name__, e)
|
|
176
183
|
with contextlib.suppress(Exception):
|
|
177
184
|
self._send(500, "application/json",
|
|
178
|
-
json.dumps({"error":
|
|
185
|
+
json.dumps({"error": "internal server error"}).encode())
|
|
179
186
|
|
|
180
187
|
|
|
181
188
|
def serve_http(host: str, port: int) -> None:
|
|
@@ -74,6 +74,7 @@ boost_cli/core/projectlock.py
|
|
|
74
74
|
boost_cli/core/provenance.py
|
|
75
75
|
boost_cli/core/rag.py
|
|
76
76
|
boost_cli/core/registry.py
|
|
77
|
+
boost_cli/core/resolve.py
|
|
77
78
|
boost_cli/core/rules.py
|
|
78
79
|
boost_cli/core/scopes.py
|
|
79
80
|
boost_cli/core/secretscan.py
|
|
@@ -165,7 +166,9 @@ docs/roadmap/items/github-pages-deploy-is-broken-every-push.md
|
|
|
165
166
|
docs/roadmap/items/golden-set-statistical-power.md
|
|
166
167
|
docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md
|
|
167
168
|
docs/roadmap/items/html-validation-html-validate.md
|
|
169
|
+
docs/roadmap/items/install-resolves-skill-dependencies.md
|
|
168
170
|
docs/roadmap/items/install-scope-user-or-project.md
|
|
171
|
+
docs/roadmap/items/installed-skill-trust-audit.md
|
|
169
172
|
docs/roadmap/items/integrity-verification-boost-verify.md
|
|
170
173
|
docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md
|
|
171
174
|
docs/roadmap/items/layering-guard-import-linter.md
|
|
@@ -177,6 +180,7 @@ docs/roadmap/items/log-timestamps-mislabeled-utc.md
|
|
|
177
180
|
docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md
|
|
178
181
|
docs/roadmap/items/make-the-roadmaps-discoverable.md
|
|
179
182
|
docs/roadmap/items/markdown-consistency-markdownlint-cli2.md
|
|
183
|
+
docs/roadmap/items/mcp-aware-skills.md
|
|
180
184
|
docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md
|
|
181
185
|
docs/roadmap/items/mcp-launch-objc-fork-safety.md
|
|
182
186
|
docs/roadmap/items/mcp-register-names-server-before-env.md
|
|
@@ -352,6 +356,7 @@ tests/unit/test_provenance.py
|
|
|
352
356
|
tests/unit/test_rag.py
|
|
353
357
|
tests/unit/test_registries_fresh.py
|
|
354
358
|
tests/unit/test_registry.py
|
|
359
|
+
tests/unit/test_resolve.py
|
|
355
360
|
tests/unit/test_roadmap_fresh.py
|
|
356
361
|
tests/unit/test_rules.py
|
|
357
362
|
tests/unit/test_scopes.py
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
<input id="q" type="search" placeholder="Filter 78 commands…" autocomplete="off" aria-label="Filter commands">
|
|
81
81
|
<div class="group" data-group="pkg">
|
|
82
82
|
<div class="group-h">Install & lifecycle</div>
|
|
83
|
-
<a class="cmd-link" href="#cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run name">install</a>
|
|
83
|
+
<a class="cmd-link" href="#cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run --no-deps name">install</a>
|
|
84
84
|
<a class="cmd-link" href="#cmd-uninstall" data-search="uninstall remove an installed skill, rule, workflow, or config --local name">uninstall</a>
|
|
85
85
|
<a class="cmd-link" href="#cmd-sync" data-search="sync reconcile installed skills & symlinks against the lock file --diff --prune --json">sync</a>
|
|
86
86
|
<a class="cmd-link" href="#cmd-update" data-search="update sync taps or update installed skills --taps-only tap">update</a>
|
|
@@ -187,10 +187,10 @@
|
|
|
187
187
|
<p class="lead">All <b>78</b> commands, generated from the CLI itself —
|
|
188
188
|
run <code>boost <command> --help</code> for the same in your terminal.</p>
|
|
189
189
|
<h2 class="group-h" id="grp-pkg">Install & lifecycle</h2>
|
|
190
|
-
<section class="cmd" id="cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run name">
|
|
190
|
+
<section class="cmd" id="cmd-install" data-search="install install a skill from a tap registry --force --agent a --scope {user,project} --local --global --dry-run --no-deps name">
|
|
191
191
|
<h3><span class="cname">install</span><span class="gtag">pkg</span></h3>
|
|
192
192
|
<p class="summary">Install a skill from a tap registry</p>
|
|
193
|
-
<pre class="syn">boost install [--force] [--agent A] [--scope {user,project}] [--local] [--global] [--dry-run] NAME [NAME ...]</pre>
|
|
193
|
+
<pre class="syn">boost install [--force] [--agent A] [--scope {user,project}] [--local] [--global] [--dry-run] [--no-deps] NAME [NAME ...]</pre>
|
|
194
194
|
<div class="args-h">Arguments</div>
|
|
195
195
|
<div class="args">
|
|
196
196
|
<div class="arg"><code>NAME</code><span>skill name, optionally qualified as tap:skill</span></div>
|
|
@@ -203,6 +203,7 @@
|
|
|
203
203
|
<div class="arg"><code>--local</code><span>into this repo, committable (= --scope project)</span></div>
|
|
204
204
|
<div class="arg"><code>--global</code><span>into your user config (= --scope user, default)</span></div>
|
|
205
205
|
<div class="arg"><code>--dry-run</code><span>show what would happen without changing anything</span></div>
|
|
206
|
+
<div class="arg"><code>--no-deps</code><span>install only the named skills, not their `requires:`</span></div>
|
|
206
207
|
</div>
|
|
207
208
|
</section>
|
|
208
209
|
<section class="cmd" id="cmd-uninstall" data-search="uninstall remove an installed skill, rule, workflow, or config --local name">
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: install-resolves-skill-dependencies
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Core · Package manager
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: the Homebrew move
|
|
11
|
+
order: 45
|
|
12
|
+
owner: loop/install-deps
|
|
13
|
+
pr: 227
|
|
14
|
+
title: <code>boost install</code> resolves a skill's <code>requires:</code> closure
|
|
15
|
+
---
|
|
16
|
+
Skills already declare relationships in frontmatter (<code>requires:</code> /
|
|
17
|
+
<code>conflicts:</code>), and <code>boost info</code> / <code>boost deps</code>
|
|
18
|
+
<em>show</em> them — but <code>boost install X</code> only ever installed
|
|
19
|
+
exactly what you named, never what X depends on. That is the one headline
|
|
20
|
+
package-manager behavior boost was missing: installing a skill should pull
|
|
21
|
+
in the skills it needs, in the right order. Add a pure, mutation-tested
|
|
22
|
+
resolver in <code>core/resolve.py</code> — post-order DFS over the
|
|
23
|
+
<code>requires:</code> graph, cycle-safe, deduped, already-installed nodes
|
|
24
|
+
pruned — and wire it into <code>cmd_install</code> so a named skill installs
|
|
25
|
+
its transitive <code>requires:</code> closure (dependencies first), with a
|
|
26
|
+
<code>--no-deps</code> escape hatch. Declared <code>conflicts:</code> against
|
|
27
|
+
an installed or co-installed skill surface as an advisory warning, and a
|
|
28
|
+
<code>requires:</code> naming a skill in no tap is flagged, not fatal.
|
|
29
|
+
Surfaced by mining boost's own catalog: the densest skill cluster is
|
|
30
|
+
dependency management, which every package manager treats as table stakes.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: installed-skill-trust-audit
|
|
3
|
+
board: code
|
|
4
|
+
section: trust
|
|
5
|
+
status: planned
|
|
6
|
+
category: Trust · Health
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: audit what you run
|
|
11
|
+
order: 47
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>boost audit --skills</code> — a trust/staleness report for installed skills
|
|
15
|
+
---
|
|
16
|
+
<code>boost audit</code> today gates CVEs in boost's <em>own</em> Python dependencies,
|
|
17
|
+
and <code>boost outdated</code> compares an installed skill's version against
|
|
18
|
+
its tap — but nothing gives a single trust-health report for the set of skills
|
|
19
|
+
you actually run. The catalog's large supply-chain / dependency-audit cluster
|
|
20
|
+
is the tell: users want to know what they're trusting. Add
|
|
21
|
+
<code>boost audit --skills</code> — flag each installed skill that is unsigned,
|
|
22
|
+
came from an untrusted or now-stale tap, is behind its tap, or newly conflicts
|
|
23
|
+
with another installed skill. Composes with the provenance work already shipped
|
|
24
|
+
(signing, trusted keys, <code>verify</code>) and the <code>requires:</code>/<code>conflicts:</code>
|
|
25
|
+
graph, turning scattered signals into one "is my installed set healthy?" answer.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: mcp-aware-skills
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: planned
|
|
6
|
+
category: Interop · MCP
|
|
7
|
+
complexity: L
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 4
|
|
10
|
+
note: skills that need a server
|
|
11
|
+
order: 46
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: MCP-aware skills — declare and wire an <code>.mcp.json</code> on install
|
|
15
|
+
---
|
|
16
|
+
Mining boost's catalog surfaces a recurring shape: skills that only work paired
|
|
17
|
+
with a Model Context Protocol server (<code>manage-mcp-servers</code>,
|
|
18
|
+
<code>mcp-integration</code>, <code>mcp-builder</code> and dozens more). boost
|
|
19
|
+
already <em>is</em> an MCP server and registers itself, but a skill can't say
|
|
20
|
+
"I need MCP server Y," and boost can't help install or wire other servers.
|
|
21
|
+
Let a skill declare an <code>mcp:</code> block (or bundle an <code>.mcp.json</code>)
|
|
22
|
+
in its frontmatter; on install, boost offers to register that server into the
|
|
23
|
+
agent the same way <code>boost mcp register</code> wires boost itself. Extends
|
|
24
|
+
the "search boost before reinventing" reflex from skills to the MCP tools a
|
|
25
|
+
skill depends on, and pairs naturally with the <code>requires:</code> resolver.
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
119
119
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
120
120
|
<div class="stat"><b>4</b><span>Planned</span></div>
|
|
121
|
-
<div class="stat"><b>
|
|
121
|
+
<div class="stat"><b>115</b><span>Loop finds</span></div>
|
|
122
122
|
<!-- /ROADMAP:stats -->
|
|
123
123
|
</div>
|
|
124
124
|
</section>
|
|
@@ -1577,6 +1577,53 @@ improvement is real (or isn't)."</p>
|
|
|
1577
1577
|
<span class="m">agent reflex</span>
|
|
1578
1578
|
</div>
|
|
1579
1579
|
</article>
|
|
1580
|
+
|
|
1581
|
+
<article class="cap rcard">
|
|
1582
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Core · Package manager</span></div>
|
|
1583
|
+
<h3><code>boost install</code> resolves a skill's <code>requires:</code> closure</h3>
|
|
1584
|
+
<p>Skills already declare relationships in frontmatter (<code>requires:</code> /
|
|
1585
|
+
<code>conflicts:</code>), and <code>boost info</code> / <code>boost deps</code>
|
|
1586
|
+
<em>show</em> them — but <code>boost install X</code> only ever installed
|
|
1587
|
+
exactly what you named, never what X depends on. That is the one headline
|
|
1588
|
+
package-manager behavior boost was missing: installing a skill should pull
|
|
1589
|
+
in the skills it needs, in the right order. Add a pure, mutation-tested
|
|
1590
|
+
resolver in <code>core/resolve.py</code> — post-order DFS over the
|
|
1591
|
+
<code>requires:</code> graph, cycle-safe, deduped, already-installed nodes
|
|
1592
|
+
pruned — and wire it into <code>cmd_install</code> so a named skill installs
|
|
1593
|
+
its transitive <code>requires:</code> closure (dependencies first), with a
|
|
1594
|
+
<code>--no-deps</code> escape hatch. Declared <code>conflicts:</code> against
|
|
1595
|
+
an installed or co-installed skill surface as an advisory warning, and a
|
|
1596
|
+
<code>requires:</code> naming a skill in no tap is flagged, not fatal.
|
|
1597
|
+
Surfaced by mining boost's own catalog: the densest skill cluster is
|
|
1598
|
+
dependency management, which every package manager treats as table stakes.</p>
|
|
1599
|
+
<div class="meta">
|
|
1600
|
+
<span class="m">Complexity <b>M</b></span>
|
|
1601
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
1602
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
1603
|
+
<span class="m">the Homebrew move</span>
|
|
1604
|
+
</div>
|
|
1605
|
+
</article>
|
|
1606
|
+
|
|
1607
|
+
<article class="cap rcard">
|
|
1608
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Interop · MCP</span></div>
|
|
1609
|
+
<h3>MCP-aware skills — declare and wire an <code>.mcp.json</code> on install</h3>
|
|
1610
|
+
<p>Mining boost's catalog surfaces a recurring shape: skills that only work paired
|
|
1611
|
+
with a Model Context Protocol server (<code>manage-mcp-servers</code>,
|
|
1612
|
+
<code>mcp-integration</code>, <code>mcp-builder</code> and dozens more). boost
|
|
1613
|
+
already <em>is</em> an MCP server and registers itself, but a skill can't say
|
|
1614
|
+
"I need MCP server Y," and boost can't help install or wire other servers.
|
|
1615
|
+
Let a skill declare an <code>mcp:</code> block (or bundle an <code>.mcp.json</code>)
|
|
1616
|
+
in its frontmatter; on install, boost offers to register that server into the
|
|
1617
|
+
agent the same way <code>boost mcp register</code> wires boost itself. Extends
|
|
1618
|
+
the "search boost before reinventing" reflex from skills to the MCP tools a
|
|
1619
|
+
skill depends on, and pairs naturally with the <code>requires:</code> resolver.</p>
|
|
1620
|
+
<div class="meta">
|
|
1621
|
+
<span class="m">Complexity <b>L</b></span>
|
|
1622
|
+
<span class="m">Impact <b>Med</b></span>
|
|
1623
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
1624
|
+
<span class="m">skills that need a server</span>
|
|
1625
|
+
</div>
|
|
1626
|
+
</article>
|
|
1580
1627
|
<!-- /ROADMAP:cards -->
|
|
1581
1628
|
|
|
1582
1629
|
</div>
|
|
@@ -2224,6 +2271,27 @@ paths.</p>
|
|
|
2224
2271
|
<span class="m">builds on policy.py</span>
|
|
2225
2272
|
</div>
|
|
2226
2273
|
</article>
|
|
2274
|
+
|
|
2275
|
+
<article class="cap rcard">
|
|
2276
|
+
<div class="head"><span class="pill planned">Planned</span><span class="cat">Trust · Health</span></div>
|
|
2277
|
+
<h3><code>boost audit --skills</code> — a trust/staleness report for installed skills</h3>
|
|
2278
|
+
<p><code>boost audit</code> today gates CVEs in boost's <em>own</em> Python dependencies,
|
|
2279
|
+
and <code>boost outdated</code> compares an installed skill's version against
|
|
2280
|
+
its tap — but nothing gives a single trust-health report for the set of skills
|
|
2281
|
+
you actually run. The catalog's large supply-chain / dependency-audit cluster
|
|
2282
|
+
is the tell: users want to know what they're trusting. Add
|
|
2283
|
+
<code>boost audit --skills</code> — flag each installed skill that is unsigned,
|
|
2284
|
+
came from an untrusted or now-stale tap, is behind its tap, or newly conflicts
|
|
2285
|
+
with another installed skill. Composes with the provenance work already shipped
|
|
2286
|
+
(signing, trusted keys, <code>verify</code>) and the <code>requires:</code>/<code>conflicts:</code>
|
|
2287
|
+
graph, turning scattered signals into one "is my installed set healthy?" answer.</p>
|
|
2288
|
+
<div class="meta">
|
|
2289
|
+
<span class="m">Complexity <b>M</b></span>
|
|
2290
|
+
<span class="m">Impact <b>Med</b></span>
|
|
2291
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
2292
|
+
<span class="m">audit what you run</span>
|
|
2293
|
+
</div>
|
|
2294
|
+
</article>
|
|
2227
2295
|
<!-- /ROADMAP:cards -->
|
|
2228
2296
|
|
|
2229
2297
|
</div>
|
{boost_skill_cli-1.0.201 → boost_skill_cli-1.0.203}/tests/functional/test_cli_intelligence.py
RENAMED
|
@@ -427,7 +427,9 @@ class TestContext:
|
|
|
427
427
|
class TestFocus:
|
|
428
428
|
def test_focus_sidelines_others(self, boost, tapped):
|
|
429
429
|
boost("install", "brainstorming")
|
|
430
|
-
|
|
430
|
+
# --no-deps: this test wants exactly two installed skills; without it,
|
|
431
|
+
# jira-integration would also pull in its `requires: commit-messages`.
|
|
432
|
+
boost("install", "jira-integration", "--no-deps")
|
|
431
433
|
r = boost("focus", "brainstorming")
|
|
432
434
|
assert "focus: brainstorming" in r.out
|
|
433
435
|
assert "(other 1 skills sidelined)" in r.out
|
|
@@ -116,6 +116,29 @@ class TestInstall:
|
|
|
116
116
|
assert not (paths.store_dir() / "brainstorming").exists()
|
|
117
117
|
assert not paths.lockfile_path().exists()
|
|
118
118
|
|
|
119
|
+
def test_installs_declared_requires_closure(self, boost, tapped):
|
|
120
|
+
# jira-integration declares `requires: [commit-messages]` in the fixture;
|
|
121
|
+
# installing it must pull in the dependency, dependency-first.
|
|
122
|
+
r = boost("install", "jira-integration")
|
|
123
|
+
assert "pulling in 1 dependency" in r.out
|
|
124
|
+
assert "commit-messages" in r.out
|
|
125
|
+
assert "Installed 2 new skills" in r.out
|
|
126
|
+
assert "commit-messages" in _lock() and "jira-integration" in _lock()
|
|
127
|
+
assert (paths.store_dir() / "commit-messages" / "SKILL.md").is_file()
|
|
128
|
+
|
|
129
|
+
def test_no_deps_installs_only_named(self, boost, tapped):
|
|
130
|
+
r = boost("install", "jira-integration", "--no-deps")
|
|
131
|
+
assert "pulling in" not in r.out
|
|
132
|
+
assert "Installed 1 new skill" in r.out
|
|
133
|
+
assert "jira-integration" in _lock()
|
|
134
|
+
assert "commit-messages" not in _lock() # dep NOT pulled in
|
|
135
|
+
|
|
136
|
+
def test_already_installed_dependency_not_repulled(self, boost, tapped):
|
|
137
|
+
boost("install", "commit-messages") # dep present first
|
|
138
|
+
r = boost("install", "jira-integration")
|
|
139
|
+
assert "pulling in" not in r.out # nothing to add
|
|
140
|
+
assert "Installed 1 new skill" in r.out # only jira is new
|
|
141
|
+
|
|
119
142
|
def test_agent_flag_links_only_claude(self, boost, tapped):
|
|
120
143
|
r = boost("install", "brainstorming", "--agent", "claude-code")
|
|
121
144
|
assert "linked → claude-code" in r.out
|
|
@@ -19,7 +19,9 @@ def test_tap_search_install_doctor_uninstall(boost, fixture_tap_src):
|
|
|
19
19
|
assert "jira-integration" in r.out
|
|
20
20
|
assert "ranked by full-content BM25" in r.out
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
# --no-deps keeps this a single-skill lifecycle (doctor asserts "1 skill");
|
|
23
|
+
# jira-integration otherwise pulls in its `requires: commit-messages`.
|
|
24
|
+
r = boost("install", "jira-integration", "--no-deps")
|
|
23
25
|
assert "copied to" in r.out
|
|
24
26
|
assert "linked → claude-code · windsurf · cursor" in r.out
|
|
25
27
|
assert "lock updated (.skill-lock.json)" in r.out
|
|
@@ -42,7 +42,10 @@ run "outdated (clean)" 0 ./boost outdated
|
|
|
42
42
|
echo "== everyday loop"
|
|
43
43
|
run "search jira" 0 ./boost search jira
|
|
44
44
|
run "install brainstorming" 0 ./boost install brainstorming
|
|
45
|
-
|
|
45
|
+
# --no-deps: install each fixture skill independently. jira-integration declares
|
|
46
|
+
# `requires: commit-messages`, which install now resolves — without this the
|
|
47
|
+
# separate `install commit-messages` below would hit the already-installed path.
|
|
48
|
+
run "install jira-integration" 0 ./boost install jira-integration --no-deps
|
|
46
49
|
run "install commit-messages" 0 ./boost install commit-messages
|
|
47
50
|
run "install tdd-workflow" 0 ./boost install tdd-workflow
|
|
48
51
|
run "install cowboy-coding" 0 ./boost install cowboy-coding
|