boost-skill-cli 1.0.231__tar.gz → 1.0.232__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.231 → boost_skill_cli-1.0.232}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/configuration.py +40 -4
- boost_skill_cli-1.0.232/boost_cli/core/selfupdate.py +138 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/commands.html +7 -3
- boost_skill_cli-1.0.232/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +31 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap.html +11 -2
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_configuration.py +101 -5
- boost_skill_cli-1.0.232/tests/unit/test_selfupdate.py +265 -0
- boost_skill_cli-1.0.231/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -22
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.gitattributes +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.gitignore +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/.vale.ini +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/LICENSE +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/Makefile +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/README.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/codecov.yml +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/index.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/examples/README.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/index.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/noxfile.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/setup.cfg +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/README.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/boost.css +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/boost.js +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/style/demo.html +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/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.232'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 232)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -26,6 +26,7 @@ from ..core import (
|
|
|
26
26
|
policy,
|
|
27
27
|
rag,
|
|
28
28
|
registry,
|
|
29
|
+
selfupdate,
|
|
29
30
|
serve,
|
|
30
31
|
store,
|
|
31
32
|
util,
|
|
@@ -1004,12 +1005,47 @@ def cmd_self_update(argv) -> int:
|
|
|
1004
1005
|
p = cliparse.parser(
|
|
1005
1006
|
prog="boost self-update",
|
|
1006
1007
|
description="Update boost itself to the latest version")
|
|
1007
|
-
p.
|
|
1008
|
+
p.add_argument("--dry-run", action="store_true",
|
|
1009
|
+
help="show how boost would update itself, change nothing")
|
|
1010
|
+
args = p.parse_args(argv)
|
|
1011
|
+
|
|
1012
|
+
method = selfupdate.detect()
|
|
1013
|
+
if method != selfupdate.GIT:
|
|
1014
|
+
return _self_update_package(method, dry_run=args.dry_run)
|
|
1015
|
+
return _self_update_git(dry_run=args.dry_run)
|
|
1016
|
+
|
|
1017
|
+
|
|
1018
|
+
def _self_update_package(method: str, dry_run: bool) -> int:
|
|
1019
|
+
"""Upgrade a pip / pipx / uv-tool install by driving its own manager."""
|
|
1020
|
+
old = __version__
|
|
1021
|
+
cmd = selfupdate.upgrade_command(method) # errors if the manager is gone
|
|
1022
|
+
if dry_run:
|
|
1023
|
+
out.info("installed with: %s" % method)
|
|
1024
|
+
out.info("would run: %s" % " ".join(cmd))
|
|
1025
|
+
return 0
|
|
1026
|
+
out.info("updating via %s: %s" % (method, " ".join(cmd)))
|
|
1027
|
+
selfupdate.run_upgrade(cmd)
|
|
1028
|
+
# This process imported its version before the upgrade, so ask a fresh one.
|
|
1029
|
+
new = selfupdate.observed_version()
|
|
1030
|
+
journal.log("self-update", new or old, previous=old, method=method)
|
|
1031
|
+
if new and new != old:
|
|
1032
|
+
out.ok("boost v%s → v%s" % (old, new))
|
|
1033
|
+
elif new:
|
|
1034
|
+
out.ok("already up to date (v%s)" % new)
|
|
1035
|
+
else:
|
|
1036
|
+
# The upgrade succeeded but we never saw a version — say exactly that
|
|
1037
|
+
# rather than claim one.
|
|
1038
|
+
out.ok("upgraded via %s; run `boost --version` to confirm" % method)
|
|
1039
|
+
return 0
|
|
1040
|
+
|
|
1008
1041
|
|
|
1042
|
+
def _self_update_git(dry_run: bool) -> int:
|
|
1043
|
+
"""Fast-forward the source checkout boost is running from."""
|
|
1009
1044
|
root = paths.repo_root()
|
|
1010
|
-
if
|
|
1011
|
-
|
|
1012
|
-
|
|
1045
|
+
if dry_run:
|
|
1046
|
+
out.info("installed with: git checkout (%s)" % _tilde(root))
|
|
1047
|
+
out.info("would run: git -C %s pull --ff-only" % root)
|
|
1048
|
+
return 0
|
|
1013
1049
|
old = __version__
|
|
1014
1050
|
before = gitutil.head_commit(root)
|
|
1015
1051
|
gitutil.run(["-C", str(root), "pull", "--ff-only"], timeout=120)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"""How this boost was installed, and the command that upgrades it in place.
|
|
2
|
+
|
|
3
|
+
`boost self-update` assumed a git checkout and told everyone else to abandon
|
|
4
|
+
their install method — but the documented way in is `pipx install
|
|
5
|
+
boost-skill-cli` or `pip install boost-skill-cli`, where the package lives in
|
|
6
|
+
site-packages and there is nothing to `git pull`. This resolves the install
|
|
7
|
+
method from evidence on disk and hands the command layer the exact argv that
|
|
8
|
+
upgrades *this* copy.
|
|
9
|
+
"""
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
import shutil
|
|
14
|
+
import subprocess
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import List, Optional
|
|
18
|
+
|
|
19
|
+
from ..errors import BoostError
|
|
20
|
+
from . import gitutil, paths
|
|
21
|
+
|
|
22
|
+
DIST = "boost-skill-cli"
|
|
23
|
+
|
|
24
|
+
GIT = "git"
|
|
25
|
+
PIPX = "pipx"
|
|
26
|
+
UV_TOOL = "uv-tool"
|
|
27
|
+
PIP = "pip"
|
|
28
|
+
UNKNOWN = "unknown"
|
|
29
|
+
|
|
30
|
+
# `boost --version` prints "boost <version>"; anything else means we did not
|
|
31
|
+
# actually observe a version and must not report one.
|
|
32
|
+
_VERSION_LINE = re.compile(r"^boost\s+(\S+)$", re.MULTILINE)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def installed_version() -> Optional[str]:
|
|
36
|
+
"""Version recorded in installed package metadata, or None.
|
|
37
|
+
|
|
38
|
+
None is the useful answer, not a failure: it means no Python package
|
|
39
|
+
manager has a record of this boost, so none of them can upgrade it.
|
|
40
|
+
"""
|
|
41
|
+
try:
|
|
42
|
+
from importlib.metadata import version
|
|
43
|
+
return version(DIST)
|
|
44
|
+
except Exception:
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def detect(root: Optional[Path] = None, prefix: Optional[Path] = None,
|
|
49
|
+
metadata_version=None) -> str:
|
|
50
|
+
"""Resolve how this boost was installed.
|
|
51
|
+
|
|
52
|
+
Order matters. A source checkout wins first — that includes `pip install
|
|
53
|
+
-e .`, where the package metadata exists too but `git pull` is what the
|
|
54
|
+
user means. Then the two managers that own a private venv and leave a
|
|
55
|
+
receipt inside it. Then plain pip, but only if pip actually has a record
|
|
56
|
+
of the distribution: telling someone to `pip install --upgrade` a boost
|
|
57
|
+
that pip never installed sends them chasing a package that isn't there.
|
|
58
|
+
"""
|
|
59
|
+
root = paths.repo_root() if root is None else Path(root)
|
|
60
|
+
if gitutil.is_repo(root):
|
|
61
|
+
return GIT
|
|
62
|
+
prefix = Path(sys.prefix) if prefix is None else Path(prefix)
|
|
63
|
+
if (prefix / "pipx_metadata.json").is_file():
|
|
64
|
+
return PIPX
|
|
65
|
+
if (prefix / "uv-receipt.toml").is_file():
|
|
66
|
+
return UV_TOOL
|
|
67
|
+
# Resolved here, not as a default argument: a default binds the function
|
|
68
|
+
# object once at import, which silently defeats every attempt to swap it —
|
|
69
|
+
# including a test's, which is how a test of the "nothing installed this"
|
|
70
|
+
# branch ended up running a real `pip install` against PyPI.
|
|
71
|
+
lookup = installed_version if metadata_version is None else metadata_version
|
|
72
|
+
return PIP if lookup() else UNKNOWN
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _require(tool: str) -> str:
|
|
76
|
+
"""Absolute path to `tool`, or a BoostError naming what is missing.
|
|
77
|
+
|
|
78
|
+
Falling back to another manager here would upgrade a different copy of
|
|
79
|
+
boost — or none at all — while reporting success.
|
|
80
|
+
"""
|
|
81
|
+
found = shutil.which(tool)
|
|
82
|
+
if not found:
|
|
83
|
+
raise BoostError(
|
|
84
|
+
"boost was installed with %s, but %s is not on PATH" % (tool, tool),
|
|
85
|
+
hint="install %s, or upgrade manually with `%s upgrade %s`"
|
|
86
|
+
% (tool, tool, DIST))
|
|
87
|
+
return found
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def upgrade_command(method: str) -> List[str]:
|
|
91
|
+
"""The argv that upgrades boost for `method`."""
|
|
92
|
+
if method == PIPX:
|
|
93
|
+
return [_require("pipx"), "upgrade", DIST]
|
|
94
|
+
if method == UV_TOOL:
|
|
95
|
+
return [_require("uv"), "tool", "upgrade", DIST]
|
|
96
|
+
if method == PIP:
|
|
97
|
+
# sys.executable, never a bare `pip`: the pip first on PATH can belong
|
|
98
|
+
# to a different interpreter than the one running boost, and upgrading
|
|
99
|
+
# that one leaves this install exactly where it was while printing
|
|
100
|
+
# every sign of success.
|
|
101
|
+
return [sys.executable, "-m", "pip", "install", "--upgrade", DIST]
|
|
102
|
+
raise BoostError(
|
|
103
|
+
"cannot work out how boost was installed, so it cannot update itself",
|
|
104
|
+
hint="upgrade with your package manager, e.g. `pipx upgrade %s`" % DIST)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def run_upgrade(cmd: List[str], timeout: float = 300.0):
|
|
108
|
+
"""Run the upgrade, raising BoostError with the manager's own last words."""
|
|
109
|
+
try:
|
|
110
|
+
proc = subprocess.run(cmd, capture_output=True, text=True,
|
|
111
|
+
timeout=timeout)
|
|
112
|
+
except (OSError, subprocess.SubprocessError) as err:
|
|
113
|
+
raise BoostError("could not run %s" % " ".join(cmd),
|
|
114
|
+
hint=str(err)) from err
|
|
115
|
+
if proc.returncode != 0:
|
|
116
|
+
detail = ((proc.stderr or "") + (proc.stdout or "")).strip().splitlines()
|
|
117
|
+
raise BoostError(
|
|
118
|
+
"upgrade failed (%s exited %d)" % (Path(cmd[0]).name, proc.returncode),
|
|
119
|
+
hint=detail[-1] if detail else "re-run the command by hand to see why")
|
|
120
|
+
return proc
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def observed_version(timeout: float = 30.0) -> Optional[str]:
|
|
124
|
+
"""Ask a freshly-spawned boost what version it is now, or None.
|
|
125
|
+
|
|
126
|
+
This process imported its own version before the upgrade ran, so it cannot
|
|
127
|
+
answer the question. None means "we did not see one" — better to say
|
|
128
|
+
nothing than to report a version we never observed.
|
|
129
|
+
"""
|
|
130
|
+
try:
|
|
131
|
+
proc = subprocess.run([str(paths.launcher()), "--version"],
|
|
132
|
+
capture_output=True, text=True, timeout=timeout)
|
|
133
|
+
except (OSError, subprocess.SubprocessError):
|
|
134
|
+
return None
|
|
135
|
+
if proc.returncode != 0:
|
|
136
|
+
return None
|
|
137
|
+
match = _VERSION_LINE.search(proc.stdout or "")
|
|
138
|
+
return match.group(1) if match else None
|
|
@@ -81,6 +81,7 @@ boost_cli/core/resolve.py
|
|
|
81
81
|
boost_cli/core/rules.py
|
|
82
82
|
boost_cli/core/scopes.py
|
|
83
83
|
boost_cli/core/secretscan.py
|
|
84
|
+
boost_cli/core/selfupdate.py
|
|
84
85
|
boost_cli/core/serve.py
|
|
85
86
|
boost_cli/core/stackprobe.py
|
|
86
87
|
boost_cli/core/staleness.py
|
|
@@ -460,6 +461,7 @@ tests/unit/test_roadmap_fresh.py
|
|
|
460
461
|
tests/unit/test_rules.py
|
|
461
462
|
tests/unit/test_scopes.py
|
|
462
463
|
tests/unit/test_secretscan.py
|
|
464
|
+
tests/unit/test_selfupdate.py
|
|
463
465
|
tests/unit/test_serve.py
|
|
464
466
|
tests/unit/test_spin.py
|
|
465
467
|
tests/unit/test_stackprobe.py
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
<a class="cmd-link" href="#cmd-mcp" data-search="mcp register boost as an mcp server for claude code --stdio {register,unregister}">mcp</a>
|
|
189
189
|
<a class="cmd-link" href="#cmd-hooks" data-search="hooks manage claude code hooks (scope-aware) in settings.json -c, --command command -n, --name name -s, --scope {global,project} -m, --matcher matcher --timeout timeout {add,remove,list} event">hooks</a>
|
|
190
190
|
<a class="cmd-link" href="#cmd-bmad" data-search="bmad install & manage the bmad method (scope-aware, toggleable) -s, --scope {project,global} --modules modules -y, --yes --startup {install,init,startup,orient,uninstall,disable,enable,doctor,status} value">bmad</a>
|
|
191
|
-
<a class="cmd-link" href="#cmd-self-update" data-search="self-update update boost itself to the latest version
|
|
191
|
+
<a class="cmd-link" href="#cmd-self-update" data-search="self-update update boost itself to the latest version --dry-run">self-update</a>
|
|
192
192
|
</div>
|
|
193
193
|
<div class="group" data-group="team">
|
|
194
194
|
<div class="group-h">Team & sharing</div>
|
|
@@ -1083,10 +1083,14 @@
|
|
|
1083
1083
|
<div class="arg"><code>--startup</code><span>enable the startup toggle right after install</span></div>
|
|
1084
1084
|
</div>
|
|
1085
1085
|
</section>
|
|
1086
|
-
<section class="cmd" id="cmd-self-update" data-search="self-update update boost itself to the latest version
|
|
1086
|
+
<section class="cmd" id="cmd-self-update" data-search="self-update update boost itself to the latest version --dry-run">
|
|
1087
1087
|
<h3><span class="cname">self-update</span><span class="gtag">cfg</span></h3>
|
|
1088
1088
|
<p class="summary">Update boost itself to the latest version</p>
|
|
1089
|
-
<pre class="syn">boost self-update</pre>
|
|
1089
|
+
<pre class="syn">boost self-update [--dry-run]</pre>
|
|
1090
|
+
<div class="args-h">Options</div>
|
|
1091
|
+
<div class="args">
|
|
1092
|
+
<div class="arg"><code>--dry-run</code><span>show how boost would update itself, change nothing</span></div>
|
|
1093
|
+
</div>
|
|
1090
1094
|
</section>
|
|
1091
1095
|
<h2 class="group-h" id="grp-team">Team & sharing</h2>
|
|
1092
1096
|
<section class="cmd" id="cmd-cohort" data-search="cohort controlled skill rollouts & team a/b testing --skills skills --percent percent --json {list,create,delete,status,apply} name">
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: self-update-broken-for-pip-pipx-installs
|
|
3
|
+
board: code
|
|
4
|
+
section: compat
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Bug
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 3
|
|
10
|
+
note:
|
|
11
|
+
order: 10
|
|
12
|
+
owner: loop/self-update
|
|
13
|
+
pr: 272
|
|
14
|
+
title: <code>self-update</code> is non-functional for pip/pipx installs
|
|
15
|
+
---
|
|
16
|
+
<code>boost self-update</code> only works when boost runs from a git checkout: <code>paths.repo_root()</code>
|
|
17
|
+
resolves inside <code>site-packages</code> for a pip/pipx install, <code>gitutil.is_repo()</code> is
|
|
18
|
+
False, and <code>cmd_self_update</code> raises "boost is not running from a git checkout" with a hint
|
|
19
|
+
to clone the repo — telling a normal PyPI user to abandon their install method. Detect the install
|
|
20
|
+
method and shell out to <code>pip install --upgrade boost-skill-cli</code> /
|
|
21
|
+
<code>pipx upgrade boost-skill-cli</code>, falling back to the git-pull path only for source
|
|
22
|
+
checkouts. Shipped as <code>core/selfupdate.py</code>: detection reads evidence on disk —
|
|
23
|
+
<code>.git</code>, then <code>pipx_metadata.json</code> or <code>uv-receipt.toml</code> in
|
|
24
|
+
<code>sys.prefix</code>, then installed package metadata — and a <code>--dry-run</code> flag
|
|
25
|
+
prints the exact command without running it. Two details carry the weight: the pip branch
|
|
26
|
+
invokes <code>sys.executable -m pip</code>, never a bare <code>pip</code>, because the pip
|
|
27
|
+
first on PATH can belong to another interpreter and would upgrade a different copy while
|
|
28
|
+
reporting success; and an install nothing has a record of reports that plainly instead of
|
|
29
|
+
guessing pip. The new version is read from a freshly spawned <code>boost --version</code>,
|
|
30
|
+
since the running process imported its own version before the upgrade — if that probe says
|
|
31
|
+
nothing, neither does boost.
|
|
@@ -2828,7 +2828,7 @@ same nav and footer as every other page.</p>
|
|
|
2828
2828
|
</article>
|
|
2829
2829
|
|
|
2830
2830
|
<article class="cap rcard" id="self-update-broken-for-pip-pipx-installs">
|
|
2831
|
-
<div class="head"><span class="pill
|
|
2831
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
|
|
2832
2832
|
<h3><code>self-update</code> is non-functional for pip/pipx installs</h3>
|
|
2833
2833
|
<p><code>boost self-update</code> only works when boost runs from a git checkout: <code>paths.repo_root()</code>
|
|
2834
2834
|
resolves inside <code>site-packages</code> for a pip/pipx install, <code>gitutil.is_repo()</code> is
|
|
@@ -2836,7 +2836,16 @@ False, and <code>cmd_self_update</code> raises "boost is not running from a git
|
|
|
2836
2836
|
to clone the repo — telling a normal PyPI user to abandon their install method. Detect the install
|
|
2837
2837
|
method and shell out to <code>pip install --upgrade boost-skill-cli</code> /
|
|
2838
2838
|
<code>pipx upgrade boost-skill-cli</code>, falling back to the git-pull path only for source
|
|
2839
|
-
checkouts
|
|
2839
|
+
checkouts. Shipped as <code>core/selfupdate.py</code>: detection reads evidence on disk —
|
|
2840
|
+
<code>.git</code>, then <code>pipx_metadata.json</code> or <code>uv-receipt.toml</code> in
|
|
2841
|
+
<code>sys.prefix</code>, then installed package metadata — and a <code>--dry-run</code> flag
|
|
2842
|
+
prints the exact command without running it. Two details carry the weight: the pip branch
|
|
2843
|
+
invokes <code>sys.executable -m pip</code>, never a bare <code>pip</code>, because the pip
|
|
2844
|
+
first on PATH can belong to another interpreter and would upgrade a different copy while
|
|
2845
|
+
reporting success; and an install nothing has a record of reports that plainly instead of
|
|
2846
|
+
guessing pip. The new version is read from a freshly spawned <code>boost --version</code>,
|
|
2847
|
+
since the running process imported its own version before the upgrade — if that probe says
|
|
2848
|
+
nothing, neither does boost.</p>
|
|
2840
2849
|
<div class="meta">
|
|
2841
2850
|
<span class="m">Complexity <b>M</b></span>
|
|
2842
2851
|
<span class="m hi">Impact <b>High</b></span>
|
{boost_skill_cli-1.0.231 → boost_skill_cli-1.0.232}/tests/functional/test_cli_configuration.py
RENAMED
|
@@ -20,6 +20,7 @@ import urllib.request
|
|
|
20
20
|
import pytest
|
|
21
21
|
|
|
22
22
|
from boost_cli.core import frontmatter, journal, paths, policy, util
|
|
23
|
+
from boost_cli.errors import BoostError
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
def _git(cwd, *args):
|
|
@@ -846,13 +847,108 @@ class TestMcp:
|
|
|
846
847
|
# ---------------------------------------------------------------- self-update
|
|
847
848
|
|
|
848
849
|
class TestSelfUpdate:
|
|
849
|
-
def
|
|
850
|
-
|
|
851
|
-
|
|
850
|
+
def _not_a_checkout(self, monkeypatch, sandbox):
|
|
851
|
+
"""repo_root() normally resolves to the real boost checkout (a git repo
|
|
852
|
+
both locally and in CI) — point it at the sandbox so the pip/pipx paths
|
|
853
|
+
are reachable, and make a real upgrade impossible.
|
|
854
|
+
|
|
855
|
+
The second half is not paranoia: while these tests were being written,
|
|
856
|
+
a detection bug sent one of them down the pip branch for real, and it
|
|
857
|
+
installed boost-skill-cli from PyPI over the editable checkout. A test
|
|
858
|
+
must not be one bad branch away from mutating the machine.
|
|
859
|
+
"""
|
|
852
860
|
monkeypatch.setattr("boost_cli.core.paths.repo_root", lambda: sandbox)
|
|
861
|
+
|
|
862
|
+
def never(cmd, **kw):
|
|
863
|
+
raise AssertionError("this test must not run an upgrade: %s" % cmd)
|
|
864
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade", never)
|
|
865
|
+
|
|
866
|
+
def _pipx_install(self, monkeypatch, sandbox):
|
|
867
|
+
self._not_a_checkout(monkeypatch, sandbox)
|
|
868
|
+
prefix = sandbox / "pipx" / "venvs" / "boost-skill-cli"
|
|
869
|
+
prefix.mkdir(parents=True)
|
|
870
|
+
(prefix / "pipx_metadata.json").write_text("{}", encoding="utf-8")
|
|
871
|
+
monkeypatch.setattr("sys.prefix", str(prefix))
|
|
872
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.shutil.which",
|
|
873
|
+
lambda t: "/opt/bin/" + t)
|
|
874
|
+
|
|
875
|
+
def test_pipx_install_upgrades_with_pipx(self, boost, sandbox, monkeypatch):
|
|
876
|
+
# The old behaviour: rc=1, "boost is not running from a git checkout",
|
|
877
|
+
# and a hint telling a PyPI user to go clone the repo instead.
|
|
878
|
+
self._pipx_install(monkeypatch, sandbox)
|
|
879
|
+
r = boost("self-update", "--dry-run")
|
|
880
|
+
assert "installed with: pipx" in r.out
|
|
881
|
+
assert "would run: /opt/bin/pipx upgrade boost-skill-cli" in r.out
|
|
882
|
+
|
|
883
|
+
def test_plain_pip_install_upgrades_with_this_interpreter(
|
|
884
|
+
self, boost, sandbox, monkeypatch):
|
|
885
|
+
self._not_a_checkout(monkeypatch, sandbox)
|
|
886
|
+
monkeypatch.setattr("sys.prefix", str(sandbox))
|
|
887
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.installed_version",
|
|
888
|
+
lambda: "1.0.0")
|
|
889
|
+
r = boost("self-update", "--dry-run")
|
|
890
|
+
assert "installed with: pip" in r.out
|
|
891
|
+
assert ("would run: %s -m pip install --upgrade boost-skill-cli"
|
|
892
|
+
% sys.executable) in r.out
|
|
893
|
+
|
|
894
|
+
def test_pipx_upgrade_reports_the_new_version(self, boost, sandbox,
|
|
895
|
+
monkeypatch):
|
|
896
|
+
self._pipx_install(monkeypatch, sandbox)
|
|
897
|
+
ran = []
|
|
898
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade",
|
|
899
|
+
lambda cmd, **kw: ran.append(cmd))
|
|
900
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.observed_version",
|
|
901
|
+
lambda: "9.9.9")
|
|
902
|
+
r = boost("self-update")
|
|
903
|
+
from boost_cli import __version__
|
|
904
|
+
assert ran == [["/opt/bin/pipx", "upgrade", "boost-skill-cli"]]
|
|
905
|
+
assert ("boost v%s → v9.9.9" % __version__) in r.out
|
|
906
|
+
ev = journal.events(action="self-update")[0]
|
|
907
|
+
assert ev["subject"] == "9.9.9" and ev["method"] == "pipx"
|
|
908
|
+
|
|
909
|
+
def test_upgrade_that_reveals_no_version_does_not_claim_one(
|
|
910
|
+
self, boost, sandbox, monkeypatch):
|
|
911
|
+
self._pipx_install(monkeypatch, sandbox)
|
|
912
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade",
|
|
913
|
+
lambda cmd, **kw: None)
|
|
914
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.observed_version",
|
|
915
|
+
lambda: None)
|
|
916
|
+
r = boost("self-update")
|
|
917
|
+
assert "upgraded via pipx; run `boost --version` to confirm" in r.out
|
|
918
|
+
assert "→" not in r.out
|
|
919
|
+
|
|
920
|
+
def test_failed_upgrade_surfaces_the_managers_message(
|
|
921
|
+
self, boost, sandbox, monkeypatch):
|
|
922
|
+
self._pipx_install(monkeypatch, sandbox)
|
|
923
|
+
|
|
924
|
+
def boom(cmd, **kw):
|
|
925
|
+
raise BoostError("upgrade failed (pipx exited 1)",
|
|
926
|
+
hint="ERROR: No matching distribution")
|
|
927
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.run_upgrade", boom)
|
|
928
|
+
r = boost("self-update", expect=1)
|
|
929
|
+
assert "upgrade failed (pipx exited 1)" in r.err
|
|
930
|
+
assert "No matching distribution" in r.err
|
|
931
|
+
|
|
932
|
+
def test_unknown_install_says_so_instead_of_guessing_pip(
|
|
933
|
+
self, boost, sandbox, monkeypatch):
|
|
934
|
+
self._not_a_checkout(monkeypatch, sandbox)
|
|
935
|
+
monkeypatch.setattr("sys.prefix", str(sandbox))
|
|
936
|
+
monkeypatch.setattr("boost_cli.core.selfupdate.installed_version",
|
|
937
|
+
lambda: None)
|
|
853
938
|
r = boost("self-update", expect=1)
|
|
854
|
-
assert "
|
|
855
|
-
assert "
|
|
939
|
+
assert "cannot work out how boost was installed" in r.err
|
|
940
|
+
assert "pipx upgrade boost-skill-cli" in r.err
|
|
941
|
+
|
|
942
|
+
def test_git_checkout_dry_run_changes_nothing(self, boost, sandbox,
|
|
943
|
+
monkeypatch):
|
|
944
|
+
monkeypatch.setattr("boost_cli.core.gitutil.is_repo", lambda p: True)
|
|
945
|
+
|
|
946
|
+
def no_git(*a, **kw):
|
|
947
|
+
raise AssertionError("--dry-run must not run git")
|
|
948
|
+
monkeypatch.setattr("boost_cli.core.gitutil.run", no_git)
|
|
949
|
+
r = boost("self-update", "--dry-run")
|
|
950
|
+
assert "installed with: git checkout" in r.out
|
|
951
|
+
assert "pull --ff-only" in r.out
|
|
856
952
|
|
|
857
953
|
def _fake_git(self, monkeypatch, *, before, after, described):
|
|
858
954
|
"""Stub gitutil so self-update sees a controlled HEAD move + describe.
|