boost-skill-cli 1.0.398__tar.gz → 1.0.400__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.398 → boost_skill_cli-1.0.400}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/discovery.py +14 -3
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/pkg.py +8 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/rag.py +49 -2
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/commands.html +4 -3
- boost_skill_cli-1.0.400/docs/roadmap/items/search-never-notices-a-new-tap.md +54 -0
- boost_skill_cli-1.0.400/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +46 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap.html +97 -1
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_discovery.py +53 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_pkg.py +35 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_rag.py +135 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.gitattributes +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.gitignore +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/.vale.ini +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/LICENSE +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/Makefile +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/README.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/codecov.yml +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/index.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/README.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/examples/README.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/index.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/noxfile.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/setup.cfg +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/README.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/boost.css +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/boost.js +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/style/demo.html +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.398 → boost_skill_cli-1.0.400}/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.400'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 400)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -104,9 +104,20 @@ def cmd_search(argv):
|
|
|
104
104
|
# every user gets BM25 ranking without having to know about `boost reindex`.
|
|
105
105
|
# rag.ensure() is incremental, offline, and degrades to frontmatter search
|
|
106
106
|
# if the build fails — so a search never hard-fails on an indexing problem.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
#
|
|
108
|
+
# `and not rag.stale()`, not a bare `rag.ready()`: ready() only asks whether
|
|
109
|
+
# an index exists, so once one did, `boost tap X` followed by a search
|
|
110
|
+
# answered "no matches" for a skill `boost info X` could describe from the
|
|
111
|
+
# same machine — and pointed the user at `boost discover` to go searching
|
|
112
|
+
# GitHub for something already on disk.
|
|
113
|
+
fresh = rag.ready() and not rag.stale()
|
|
114
|
+
use_rag = fresh
|
|
115
|
+
if not fresh:
|
|
116
|
+
# Name which one it is: a first build and a refresh cost the user the
|
|
117
|
+
# same pause, and only one of them is explained by "first run".
|
|
118
|
+
with spin.Spinner("refreshing the search index (taps changed)"
|
|
119
|
+
if rag.ready() else
|
|
120
|
+
"building the search index (first run)"):
|
|
110
121
|
use_rag = rag.ensure()
|
|
111
122
|
engine = ""
|
|
112
123
|
if use_rag:
|
|
@@ -716,6 +716,14 @@ def cmd_update(argv: List[str]) -> int:
|
|
|
716
716
|
ap.add_argument("tap", nargs="?", metavar="TAP", help="refresh only this tap")
|
|
717
717
|
ap.add_argument("--taps-only", action="store_true",
|
|
718
718
|
help="refresh tap clones & catalogs without touching skills")
|
|
719
|
+
# Declared because this command *advertises* it: a skipped risky update
|
|
720
|
+
# prints "review the diff, then `boost update --yes` to apply", and without
|
|
721
|
+
# this line that instruction died on `unrecognized arguments: --yes` — the
|
|
722
|
+
# only escape from the confirmation was a flag the parser rejected. The
|
|
723
|
+
# behaviour needs nothing else: out.confirm() already honours --yes/-y off
|
|
724
|
+
# sys.argv, so this makes the printed advice true rather than adding a path.
|
|
725
|
+
ap.add_argument("-y", "--yes", action="store_true",
|
|
726
|
+
help="skip the confirmation prompt")
|
|
719
727
|
args = ap.parse_args(argv)
|
|
720
728
|
results = registry.update(args.tap or None)
|
|
721
729
|
if not results:
|
|
@@ -447,15 +447,62 @@ def ready() -> bool:
|
|
|
447
447
|
return bool(raw and raw.get("docs") and postings_path().exists())
|
|
448
448
|
|
|
449
449
|
|
|
450
|
+
def stale() -> bool:
|
|
451
|
+
"""True when the index no longer reflects the taps on disk.
|
|
452
|
+
|
|
453
|
+
``ready()`` only asks whether an index *exists*, which is why ``ensure()``
|
|
454
|
+
would serve a first build forever: ``boost tap X`` rebuilds X's catalog
|
|
455
|
+
cache but nothing rebuilt the BM25 index, so ``boost search`` answered "no
|
|
456
|
+
matches" — and suggested searching GitHub — for a skill ``boost info`` could
|
|
457
|
+
already describe from the same machine.
|
|
458
|
+
|
|
459
|
+
Deliberately **stat-only**. The obvious test, comparing ``_tap_commits()``
|
|
460
|
+
against the stored commits, means parsing every tap's catalog JSON on every
|
|
461
|
+
search — reintroducing exactly the cold-start cost that moving postings into
|
|
462
|
+
SQLite existed to remove. Two cheap signals cover it instead:
|
|
463
|
+
|
|
464
|
+
* the tap set must still match the set the index recorded (catches a tap
|
|
465
|
+
added or removed, neither of which need touch an existing cache file);
|
|
466
|
+
* no tap's catalog cache may be newer than the index (catches a tap whose
|
|
467
|
+
contents moved, since ``build()`` writes the index only after every
|
|
468
|
+
catalog cache it consumed).
|
|
469
|
+
|
|
470
|
+
The residual gap is a cache rewritten inside the same filesystem mtime tick
|
|
471
|
+
as the index; the next tap operation catches it, and paying a full parse on
|
|
472
|
+
every search to close it is the worse trade.
|
|
473
|
+
"""
|
|
474
|
+
raw = _load_raw()
|
|
475
|
+
if raw is None:
|
|
476
|
+
return True
|
|
477
|
+
taps = registry.list_taps()
|
|
478
|
+
if {t.safe_name for t in taps} != set(raw.get("commits") or {}):
|
|
479
|
+
return True
|
|
480
|
+
try:
|
|
481
|
+
built_at = index_path().stat().st_mtime
|
|
482
|
+
except OSError:
|
|
483
|
+
return True
|
|
484
|
+
for t in taps:
|
|
485
|
+
try:
|
|
486
|
+
if t.cache_file.stat().st_mtime > built_at:
|
|
487
|
+
return True
|
|
488
|
+
except OSError:
|
|
489
|
+
continue # no cache yet — build() will pick it up regardless
|
|
490
|
+
return False
|
|
491
|
+
|
|
492
|
+
|
|
450
493
|
def ensure() -> bool:
|
|
451
|
-
"""Ensure a
|
|
494
|
+
"""Ensure a *current* full-content index exists, building it on first use.
|
|
452
495
|
|
|
453
496
|
This makes BM25 search the default for every surface (CLI + MCP) without the
|
|
454
497
|
user having to run ``boost reindex`` first. Returns True when RAG is usable.
|
|
455
498
|
Never raises: with no taps, or if the build fails, it returns False so the
|
|
456
499
|
caller degrades to frontmatter search instead of erroring.
|
|
500
|
+
|
|
501
|
+
A stale index rebuilds rather than being served: ``build()`` reuses every
|
|
502
|
+
tap whose commit is unchanged, so noticing one new tap costs one tap's
|
|
503
|
+
indexing, not the whole corpus.
|
|
457
504
|
"""
|
|
458
|
-
if ready():
|
|
505
|
+
if ready() and not stale():
|
|
459
506
|
return True
|
|
460
507
|
if not registry.list_taps():
|
|
461
508
|
return False
|
|
@@ -342,6 +342,7 @@ docs/roadmap/items/sbom-release-event-never-fires.md
|
|
|
342
342
|
docs/roadmap/items/scan-and-sync-rules-and-workflows.md
|
|
343
343
|
docs/roadmap/items/scheduled-toolchain-lock-regeneration.md
|
|
344
344
|
docs/roadmap/items/scorecard-findings-triage.md
|
|
345
|
+
docs/roadmap/items/search-never-notices-a-new-tap.md
|
|
345
346
|
docs/roadmap/items/second-type-checker-pyright.md
|
|
346
347
|
docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md
|
|
347
348
|
docs/roadmap/items/secret-scanning-gitleaks-push-protection.md
|
|
@@ -366,6 +367,7 @@ docs/roadmap/items/typosquat-and-name-confusion-detection.md
|
|
|
366
367
|
docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md
|
|
367
368
|
docs/roadmap/items/uninstall-has-no-confirmation-prompt.md
|
|
368
369
|
docs/roadmap/items/untrack-generated-build-noise.md
|
|
370
|
+
docs/roadmap/items/update-advertises-a-flag-it-rejects.md
|
|
369
371
|
docs/roadmap/items/update-diff-before-apply.md
|
|
370
372
|
docs/roadmap/items/update-refreshes-rules-and-workflows.md
|
|
371
373
|
docs/roadmap/items/update-reinstall-widens-agent-scope.md
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
<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 --no-mcp name">install</a>
|
|
105
105
|
<a class="cmd-link" href="#cmd-uninstall" data-search="uninstall remove an installed skill, rule, workflow, or config --local -y, --yes name">uninstall</a>
|
|
106
106
|
<a class="cmd-link" href="#cmd-sync" data-search="sync reconcile installed skills & symlinks against the lock file --diff --prune --json">sync</a>
|
|
107
|
-
<a class="cmd-link" href="#cmd-update" data-search="update sync taps or update installed skills --taps-only tap">update</a>
|
|
107
|
+
<a class="cmd-link" href="#cmd-update" data-search="update sync taps or update installed skills --taps-only -y, --yes tap">update</a>
|
|
108
108
|
<a class="cmd-link" href="#cmd-reinstall" data-search="reinstall reinstall a skill or all skills (force) --all name">reinstall</a>
|
|
109
109
|
<a class="cmd-link" href="#cmd-bundle" data-search="bundle export/install skill sets via a boostfile {dump,install} file">bundle</a>
|
|
110
110
|
<a class="cmd-link" href="#cmd-import" data-search="import import skills from a github url or local path --name n --all --agent a url_or_path">import</a>
|
|
@@ -253,10 +253,10 @@
|
|
|
253
253
|
<div class="arg"><code>--json</code><span>machine-readable output</span></div>
|
|
254
254
|
</div>
|
|
255
255
|
</section>
|
|
256
|
-
<section class="cmd" id="cmd-update" data-search="update sync taps or update installed skills --taps-only tap">
|
|
256
|
+
<section class="cmd" id="cmd-update" data-search="update sync taps or update installed skills --taps-only -y, --yes tap">
|
|
257
257
|
<h3><span class="cname">update</span><span class="gtag">pkg</span></h3>
|
|
258
258
|
<p class="summary">Sync taps or update installed skills</p>
|
|
259
|
-
<pre class="syn">boost update [--taps-only] [TAP]</pre>
|
|
259
|
+
<pre class="syn">boost update [--taps-only] [--yes] [TAP]</pre>
|
|
260
260
|
<div class="args-h">Arguments</div>
|
|
261
261
|
<div class="args">
|
|
262
262
|
<div class="arg"><code>TAP</code><span>refresh only this tap</span></div>
|
|
@@ -264,6 +264,7 @@
|
|
|
264
264
|
<div class="args-h">Options</div>
|
|
265
265
|
<div class="args">
|
|
266
266
|
<div class="arg"><code>--taps-only</code><span>refresh tap clones & catalogs without touching skills</span></div>
|
|
267
|
+
<div class="arg"><code>-y, --yes</code><span>skip the confirmation prompt</span></div>
|
|
267
268
|
</div>
|
|
268
269
|
</section>
|
|
269
270
|
<section class="cmd" id="cmd-reinstall" data-search="reinstall reinstall a skill or all skills (force) --all name">
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: search-never-notices-a-new-tap
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: search said "no matches" for a skill `boost info` described from the same machine
|
|
11
|
+
order: 93
|
|
12
|
+
owner: loop/rag-index-stale-after-tap
|
|
13
|
+
title: <code>boost search</code> never noticed a tap added after the first search
|
|
14
|
+
---
|
|
15
|
+
<code>boost tap X</code> followed by <code>boost search</code> could not find anything in
|
|
16
|
+
<code>X</code> — not until the user happened to run <code>boost reindex</code>, a command nothing
|
|
17
|
+
told them to run. Worse than a miss: search answered <b>"no matches"</b> and suggested
|
|
18
|
+
<code>boost discover</code> to go searching GitHub, for a skill sitting on the user's own disk that
|
|
19
|
+
<code>boost info</code> would describe on request.
|
|
20
|
+
|
|
21
|
+
<b>Reproduced before it was diagnosed</b>, in a throwaway <code>HOME</code> with two fixture taps:
|
|
22
|
+
|
|
23
|
+
<code>boost tap fixB</code> → <i>"✓ Tapped fixB (6 skills)"</i> ·
|
|
24
|
+
<code>boost info zeppelin-telemetry</code> → <i>"[not installed] [fixB]"</i>, describing it
|
|
25
|
+
happily · <code>boost search "zeppelin telemetry airship"</code> → <i>"no matches"</i>,
|
|
26
|
+
plus the suggestion to try <code>boost discover</code>. The catalog cache for <code>fixB</code> had
|
|
27
|
+
just been written; the BM25 index files still carried the timestamp from before the tap existed.
|
|
28
|
+
|
|
29
|
+
<b>Two layers, and only fixing the first would have looked right and changed nothing.</b>
|
|
30
|
+
<code>rag.ensure()</code> short-circuited on <code>ready()</code>, and <code>ready()</code> only asks
|
|
31
|
+
whether an index <i>exists</i> — never whether it still describes the taps on disk. But
|
|
32
|
+
<code>cmd_search</code> did not call <code>ensure()</code> at all once an index existed: it called
|
|
33
|
+
<code>rag.ready()</code> itself and reached <code>ensure()</code> only on the cold path. So a fix
|
|
34
|
+
confined to <code>ensure()</code> passed its unit tests and left the CLI exactly as broken. The
|
|
35
|
+
comment above that line already claimed "rag.ensure() is incremental… so a search never hard-fails",
|
|
36
|
+
describing a call the code no longer made.
|
|
37
|
+
|
|
38
|
+
<b>The check is deliberately stat-only.</b> The obvious test — compare the stored per-tap commits
|
|
39
|
+
against <code>_tap_commits()</code> — parses every tap's catalog JSON on every search, which is the
|
|
40
|
+
cold-start cost that moving postings into SQLite existed to remove. Instead <code>rag.stale()</code>
|
|
41
|
+
asks two cheap questions: does the tap set still match the set the index recorded (a new or removed
|
|
42
|
+
tap need not touch any existing cache file), and is any tap's catalog cache newer than the index
|
|
43
|
+
(<code>build()</code> writes the index only after every cache it consumed). Measured after the fix: a
|
|
44
|
+
warm repeat search is <b>0.107 s</b> and leaves the index mtime untouched, so there is no rebuild
|
|
45
|
+
loop. Refreshing is cheap anyway — <code>build()</code> reuses every tap whose commit is unchanged,
|
|
46
|
+
so noticing one new tap costs one tap's indexing, not the corpus.
|
|
47
|
+
|
|
48
|
+
<b>Verification worth naming.</b> Nine hand-applied mutants of <code>stale()</code> — including
|
|
49
|
+
<code>></code>→<code>>=</code> on the mtime compare and <code>!=</code>→<code>==</code> on the
|
|
50
|
+
tap-set compare — were all killed by the new tests. The functional test was then confirmed to
|
|
51
|
+
<i>fail</i> with the fix reverted, because a regression test that passes either way pins nothing.
|
|
52
|
+
That same check demoted its sibling: the untap case passes with or without this change, since
|
|
53
|
+
<code>rag.retrieve</code> already filters hits against the live catalog, so its docstring now says it
|
|
54
|
+
guards that filter rather than pretending to be evidence for this fix.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: update-advertises-a-flag-it-rejects
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Bug
|
|
7
|
+
complexity: XS
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: the only escape from the security gate was a flag the parser refused
|
|
11
|
+
order: 94
|
|
12
|
+
owner: loop/update-yes-flag
|
|
13
|
+
title: <code>boost update</code> told you to run a flag it then rejected
|
|
14
|
+
---
|
|
15
|
+
Decline the risky-update confirmation and <code>boost update</code> printed the way out:
|
|
16
|
+
<i>"update skipped — review the diff, then <code>boost update --yes</code> to apply"</i>. Doing
|
|
17
|
+
exactly that produced <code>Error: unrecognized arguments: --yes</code>.
|
|
18
|
+
|
|
19
|
+
<b>Why it mattered more than a typo.</b> That gate is a <i>security</i> feature: it fires when an
|
|
20
|
+
incoming update adds executable-looking instructions — shell commands, pipe-to-shell, a shebang — so
|
|
21
|
+
a poisoned update is seen before it lands. Declining is therefore the careful user's path, and the
|
|
22
|
+
message is the only thing telling them how to proceed afterwards. The instruction was a dead end,
|
|
23
|
+
so the sole documented escape from the gate did not exist, and the remaining options were to
|
|
24
|
+
re-run and answer the prompt interactively or to reach for <code>BOOST_ASSUME_YES</code> — which is
|
|
25
|
+
strictly worse, since it approves <i>every</i> prompt rather than this one.
|
|
26
|
+
|
|
27
|
+
<b>The fix is one <code>add_argument</code>, and deliberately nothing else.</b>
|
|
28
|
+
<code>out.confirm()</code> already honours <code>--yes</code>/<code>-y</code> by reading
|
|
29
|
+
<code>sys.argv</code> directly, so the behaviour was wired the whole time — every other command that
|
|
30
|
+
prompts (<code>install</code>, <code>uninstall</code>, <code>tap</code>, <code>bmad</code>) declares
|
|
31
|
+
the flag, and <code>update</code> was the one that forgot. Declaring it makes the printed advice
|
|
32
|
+
true rather than adding a new code path. <code>docs/commands.html</code> is generated from the
|
|
33
|
+
parsers, so the flag documents itself.
|
|
34
|
+
|
|
35
|
+
<b>Found by taking the advice literally</b> — running the exact string the CLI prints — rather than
|
|
36
|
+
by reading the parser. The regression test does the same thing: it declines the gate, asserts the
|
|
37
|
+
message, then runs the command that message names and asserts the upgrade lands. It was confirmed
|
|
38
|
+
to fail without the fix, with the original <code>unrecognized arguments</code> error.
|
|
39
|
+
|
|
40
|
+
Two traps that shaped the test. It drives the <i>real</i> <code>out.confirm()</code> instead of
|
|
41
|
+
patching it, because the suite sets <code>BOOST_ASSUME_YES=1</code> — leaving that set would
|
|
42
|
+
auto-approve and the test would pass whether or not <code>--yes</code> did anything. And it must
|
|
43
|
+
never call <code>monkeypatch.undo()</code> to shed that env var: the <code>sandbox</code> fixture's
|
|
44
|
+
<code>HOME</code> lives on the same monkeypatch, so undoing drops the test out of its sandbox and
|
|
45
|
+
onto the developer's real <code>~/.boost</code>. The first draft did exactly that and spent four
|
|
46
|
+
minutes pulling real tap clones over the network before failing.
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
126
126
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
127
127
|
<div class="stat"><b>8</b><span>Planned</span></div>
|
|
128
|
-
<div class="stat"><b>
|
|
128
|
+
<div class="stat"><b>213</b><span>Loop finds</span></div>
|
|
129
129
|
<!-- /ROADMAP:stats -->
|
|
130
130
|
</div>
|
|
131
131
|
</section>
|
|
@@ -3236,6 +3236,102 @@ no judgement in it: the 18 safe <code>UP017</code> fixes (<code>timezone.utc</co
|
|
|
3236
3236
|
<span class="m">the floor was blocking a CVE fix and a dependency major at once</span>
|
|
3237
3237
|
</div>
|
|
3238
3238
|
</article>
|
|
3239
|
+
|
|
3240
|
+
<article class="cap rcard" id="search-never-notices-a-new-tap">
|
|
3241
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
|
|
3242
|
+
<h3><code>boost search</code> never noticed a tap added after the first search</h3>
|
|
3243
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3244
|
+
<p><code>boost tap X</code> followed by <code>boost search</code> could not find anything in
|
|
3245
|
+
<code>X</code> — not until the user happened to run <code>boost reindex</code>, a command nothing
|
|
3246
|
+
told them to run. Worse than a miss: search answered <b>"no matches"</b> and suggested
|
|
3247
|
+
<code>boost discover</code> to go searching GitHub, for a skill sitting on the user's own disk that
|
|
3248
|
+
<code>boost info</code> would describe on request.
|
|
3249
|
+
|
|
3250
|
+
<b>Reproduced before it was diagnosed</b>, in a throwaway <code>HOME</code> with two fixture taps:
|
|
3251
|
+
|
|
3252
|
+
<code>boost tap fixB</code> → <i>"✓ Tapped fixB (6 skills)"</i> ·
|
|
3253
|
+
<code>boost info zeppelin-telemetry</code> → <i>"[not installed] [fixB]"</i>, describing it
|
|
3254
|
+
happily · <code>boost search "zeppelin telemetry airship"</code> → <i>"no matches"</i>,
|
|
3255
|
+
plus the suggestion to try <code>boost discover</code>. The catalog cache for <code>fixB</code> had
|
|
3256
|
+
just been written; the BM25 index files still carried the timestamp from before the tap existed.
|
|
3257
|
+
|
|
3258
|
+
<b>Two layers, and only fixing the first would have looked right and changed nothing.</b>
|
|
3259
|
+
<code>rag.ensure()</code> short-circuited on <code>ready()</code>, and <code>ready()</code> only asks
|
|
3260
|
+
whether an index <i>exists</i> — never whether it still describes the taps on disk. But
|
|
3261
|
+
<code>cmd_search</code> did not call <code>ensure()</code> at all once an index existed: it called
|
|
3262
|
+
<code>rag.ready()</code> itself and reached <code>ensure()</code> only on the cold path. So a fix
|
|
3263
|
+
confined to <code>ensure()</code> passed its unit tests and left the CLI exactly as broken. The
|
|
3264
|
+
comment above that line already claimed "rag.ensure() is incremental… so a search never hard-fails",
|
|
3265
|
+
describing a call the code no longer made.
|
|
3266
|
+
|
|
3267
|
+
<b>The check is deliberately stat-only.</b> The obvious test — compare the stored per-tap commits
|
|
3268
|
+
against <code>_tap_commits()</code> — parses every tap's catalog JSON on every search, which is the
|
|
3269
|
+
cold-start cost that moving postings into SQLite existed to remove. Instead <code>rag.stale()</code>
|
|
3270
|
+
asks two cheap questions: does the tap set still match the set the index recorded (a new or removed
|
|
3271
|
+
tap need not touch any existing cache file), and is any tap's catalog cache newer than the index
|
|
3272
|
+
(<code>build()</code> writes the index only after every cache it consumed). Measured after the fix: a
|
|
3273
|
+
warm repeat search is <b>0.107 s</b> and leaves the index mtime untouched, so there is no rebuild
|
|
3274
|
+
loop. Refreshing is cheap anyway — <code>build()</code> reuses every tap whose commit is unchanged,
|
|
3275
|
+
so noticing one new tap costs one tap's indexing, not the corpus.
|
|
3276
|
+
|
|
3277
|
+
<b>Verification worth naming.</b> Nine hand-applied mutants of <code>stale()</code> — including
|
|
3278
|
+
<code>></code>→<code>>=</code> on the mtime compare and <code>!=</code>→<code>==</code> on the
|
|
3279
|
+
tap-set compare — were all killed by the new tests. The functional test was then confirmed to
|
|
3280
|
+
<i>fail</i> with the fix reverted, because a regression test that passes either way pins nothing.
|
|
3281
|
+
That same check demoted its sibling: the untap case passes with or without this change, since
|
|
3282
|
+
<code>rag.retrieve</code> already filters hits against the live catalog, so its docstring now says it
|
|
3283
|
+
guards that filter rather than pretending to be evidence for this fix.</p></details>
|
|
3284
|
+
<div class="meta">
|
|
3285
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3286
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
3287
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3288
|
+
<span class="m">search said "no matches" for a skill `boost info` described from the same machine</span>
|
|
3289
|
+
</div>
|
|
3290
|
+
</article>
|
|
3291
|
+
|
|
3292
|
+
<article class="cap rcard" id="update-advertises-a-flag-it-rejects">
|
|
3293
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
|
|
3294
|
+
<h3><code>boost update</code> told you to run a flag it then rejected</h3>
|
|
3295
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3296
|
+
<p>Decline the risky-update confirmation and <code>boost update</code> printed the way out:
|
|
3297
|
+
<i>"update skipped — review the diff, then <code>boost update --yes</code> to apply"</i>. Doing
|
|
3298
|
+
exactly that produced <code>Error: unrecognized arguments: --yes</code>.
|
|
3299
|
+
|
|
3300
|
+
<b>Why it mattered more than a typo.</b> That gate is a <i>security</i> feature: it fires when an
|
|
3301
|
+
incoming update adds executable-looking instructions — shell commands, pipe-to-shell, a shebang — so
|
|
3302
|
+
a poisoned update is seen before it lands. Declining is therefore the careful user's path, and the
|
|
3303
|
+
message is the only thing telling them how to proceed afterwards. The instruction was a dead end,
|
|
3304
|
+
so the sole documented escape from the gate did not exist, and the remaining options were to
|
|
3305
|
+
re-run and answer the prompt interactively or to reach for <code>BOOST_ASSUME_YES</code> — which is
|
|
3306
|
+
strictly worse, since it approves <i>every</i> prompt rather than this one.
|
|
3307
|
+
|
|
3308
|
+
<b>The fix is one <code>add_argument</code>, and deliberately nothing else.</b>
|
|
3309
|
+
<code>out.confirm()</code> already honours <code>--yes</code>/<code>-y</code> by reading
|
|
3310
|
+
<code>sys.argv</code> directly, so the behaviour was wired the whole time — every other command that
|
|
3311
|
+
prompts (<code>install</code>, <code>uninstall</code>, <code>tap</code>, <code>bmad</code>) declares
|
|
3312
|
+
the flag, and <code>update</code> was the one that forgot. Declaring it makes the printed advice
|
|
3313
|
+
true rather than adding a new code path. <code>docs/commands.html</code> is generated from the
|
|
3314
|
+
parsers, so the flag documents itself.
|
|
3315
|
+
|
|
3316
|
+
<b>Found by taking the advice literally</b> — running the exact string the CLI prints — rather than
|
|
3317
|
+
by reading the parser. The regression test does the same thing: it declines the gate, asserts the
|
|
3318
|
+
message, then runs the command that message names and asserts the upgrade lands. It was confirmed
|
|
3319
|
+
to fail without the fix, with the original <code>unrecognized arguments</code> error.
|
|
3320
|
+
|
|
3321
|
+
Two traps that shaped the test. It drives the <i>real</i> <code>out.confirm()</code> instead of
|
|
3322
|
+
patching it, because the suite sets <code>BOOST_ASSUME_YES=1</code> — leaving that set would
|
|
3323
|
+
auto-approve and the test would pass whether or not <code>--yes</code> did anything. And it must
|
|
3324
|
+
never call <code>monkeypatch.undo()</code> to shed that env var: the <code>sandbox</code> fixture's
|
|
3325
|
+
<code>HOME</code> lives on the same monkeypatch, so undoing drops the test out of its sandbox and
|
|
3326
|
+
onto the developer's real <code>~/.boost</code>. The first draft did exactly that and spent four
|
|
3327
|
+
minutes pulling real tap clones over the network before failing.</p></details>
|
|
3328
|
+
<div class="meta">
|
|
3329
|
+
<span class="m">Complexity <b>XS</b></span>
|
|
3330
|
+
<span class="m">Impact <b>Med</b></span>
|
|
3331
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
3332
|
+
<span class="m">the only escape from the security gate was a flag the parser refused</span>
|
|
3333
|
+
</div>
|
|
3334
|
+
</article>
|
|
3239
3335
|
<!-- /ROADMAP:cards -->
|
|
3240
3336
|
|
|
3241
3337
|
</div>
|
|
@@ -1084,6 +1084,59 @@ class TestReindex:
|
|
|
1084
1084
|
r = boost("search", "brainstorming")
|
|
1085
1085
|
assert "ranked by full-content BM25" in r.out
|
|
1086
1086
|
|
|
1087
|
+
def test_search_sees_a_tap_added_after_the_index_was_built(
|
|
1088
|
+
self, boost, tapped, tmp_path):
|
|
1089
|
+
"""`boost tap X` then `boost search` must find X, with no reindex.
|
|
1090
|
+
|
|
1091
|
+
The regression this pins: `cmd_search` gated on `rag.ready()`, which
|
|
1092
|
+
only asks whether an index *exists*. Once one did, a newly tapped repo
|
|
1093
|
+
stayed invisible to search forever — while `boost info` described it
|
|
1094
|
+
happily from the same machine, and search told the user to go looking
|
|
1095
|
+
on GitHub for something already on their disk.
|
|
1096
|
+
"""
|
|
1097
|
+
boost("search", "brainstorming") # builds the index over `tapped`
|
|
1098
|
+
|
|
1099
|
+
root = tmp_path / "second-tap"
|
|
1100
|
+
second = root / "skills" / "zeppelin-telemetry"
|
|
1101
|
+
second.mkdir(parents=True)
|
|
1102
|
+
(second / "SKILL.md").write_text(
|
|
1103
|
+
"---\nname: zeppelin-telemetry\n"
|
|
1104
|
+
"description: Stream airship gondola telemetry to a ground station.\n"
|
|
1105
|
+
"---\n\n# Zeppelin telemetry\n\n"
|
|
1106
|
+
"Mount the gondola sensor array and stream zeppelin telemetry "
|
|
1107
|
+
"frames to the ground station dashboard.\n",
|
|
1108
|
+
encoding="utf-8")
|
|
1109
|
+
# `boost tap` clones its source, so the source has to be a real repo.
|
|
1110
|
+
for cmd in (("init", "-q"),
|
|
1111
|
+
("config", "user.email", "fixture@boost.test"),
|
|
1112
|
+
("config", "user.name", "fixture"),
|
|
1113
|
+
("add", "-A"),
|
|
1114
|
+
("commit", "-qm", "second tap")):
|
|
1115
|
+
subprocess.run(("git", *cmd), cwd=str(root),
|
|
1116
|
+
check=True, capture_output=True)
|
|
1117
|
+
boost("tap", str(root))
|
|
1118
|
+
|
|
1119
|
+
# Deliberately no `boost reindex` — that is the whole point.
|
|
1120
|
+
r = boost("search", "zeppelin telemetry gondola")
|
|
1121
|
+
assert "zeppelin-telemetry" in r.out
|
|
1122
|
+
assert "no matches" not in r.out
|
|
1123
|
+
|
|
1124
|
+
def test_search_stops_offering_an_untapped_repo(self, boost, tapped):
|
|
1125
|
+
"""After `boost untap`, its skills must stop ranking.
|
|
1126
|
+
|
|
1127
|
+
Note what actually carries this: `rag.retrieve` filters every hit
|
|
1128
|
+
against the live catalog, so a removed tap's documents are dropped even
|
|
1129
|
+
from a stale index. It therefore passes with or without the staleness
|
|
1130
|
+
check, and is a guard on that filter rather than on `rag.stale`; the
|
|
1131
|
+
removal branch of `stale()` is pinned by its own unit test. Worth
|
|
1132
|
+
keeping as the end-to-end statement of the promise, not as evidence for
|
|
1133
|
+
the fix beside it.
|
|
1134
|
+
"""
|
|
1135
|
+
assert "brainstorming" in boost("search", "brainstorming").out
|
|
1136
|
+
boost("untap", tapped.name) # untap takes the tap's name
|
|
1137
|
+
r = boost("search", "brainstorming", expect=None)
|
|
1138
|
+
assert "brainstorming" not in r.out
|
|
1139
|
+
|
|
1087
1140
|
def test_dense_skipped_when_no_backend_at_all(self, boost, tapped, monkeypatch):
|
|
1088
1141
|
"""No key and no local model: BM25 still builds, dense says why it didn't.
|
|
1089
1142
|
|
|
@@ -429,6 +429,41 @@ class TestUpdateDiffGate:
|
|
|
429
429
|
assert "upgraded" not in r.out
|
|
430
430
|
assert _lock()["brainstorming"]["version"] == "1.4.0"
|
|
431
431
|
|
|
432
|
+
def test_the_yes_flag_the_skip_message_advertises_is_accepted(
|
|
433
|
+
self, boost, fixture_tap_src, tmp_path, monkeypatch):
|
|
434
|
+
"""Declining prints "then `boost update --yes` to apply" — so that has
|
|
435
|
+
to parse.
|
|
436
|
+
|
|
437
|
+
It did not: `boost update` never declared -y/--yes, so following its own
|
|
438
|
+
instruction died on `unrecognized arguments: --yes`, and the only escape
|
|
439
|
+
from the gate was a flag the parser rejected.
|
|
440
|
+
"""
|
|
441
|
+
tap_dir = _copy_tap(fixture_tap_src, tmp_path / "risk-tap3")
|
|
442
|
+
boost("tap", tap_dir)
|
|
443
|
+
boost("install", "brainstorming")
|
|
444
|
+
_poison(tap_dir, "brainstorming", "1.4.0", "1.5.0")
|
|
445
|
+
|
|
446
|
+
# Drive the real out.confirm() rather than patching it: drop conftest's
|
|
447
|
+
# BOOST_ASSUME_YES (it would auto-approve and hide whether --yes did
|
|
448
|
+
# anything) and set sys.argv explicitly, which is where confirm() looks
|
|
449
|
+
# for the flag. With neither set and stdin not a tty, confirm returns
|
|
450
|
+
# its default — False — so the gate declines on its own.
|
|
451
|
+
# NB: never monkeypatch.undo() here; the sandbox fixture's HOME is on
|
|
452
|
+
# the same monkeypatch, so undoing drops the test out of its sandbox and
|
|
453
|
+
# onto the developer's real ~/.boost.
|
|
454
|
+
monkeypatch.delenv("BOOST_ASSUME_YES", raising=False)
|
|
455
|
+
monkeypatch.setattr("sys.argv", ["boost", "update"])
|
|
456
|
+
r = boost("update")
|
|
457
|
+
assert "`boost update --yes` to apply" in r.out # the advice is given
|
|
458
|
+
assert _lock()["brainstorming"]["version"] == "1.4.0"
|
|
459
|
+
|
|
460
|
+
# Now take that advice verbatim.
|
|
461
|
+
monkeypatch.setattr("sys.argv", ["boost", "update", "--yes"])
|
|
462
|
+
r2 = boost("update", "--yes")
|
|
463
|
+
assert "unrecognized arguments" not in r2.err
|
|
464
|
+
assert "upgraded brainstorming v1.4.0 → v1.5.0" in r2.out
|
|
465
|
+
assert _lock()["brainstorming"]["version"] == "1.5.0"
|
|
466
|
+
|
|
432
467
|
def test_routine_bump_applies_without_gate(
|
|
433
468
|
self, boost, fixture_tap_src, tmp_path):
|
|
434
469
|
tap_dir = _copy_tap(fixture_tap_src, tmp_path / "clean-tap")
|