boost-skill-cli 1.0.400__tar.gz → 1.0.401__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.400 → boost_skill_cli-1.0.401}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/pkg.py +24 -5
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/gitutil.py +27 -2
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/registry.py +34 -10
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- boost_skill_cli-1.0.401/docs/roadmap/items/one-dead-tap-broke-every-update.md +57 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap.html +56 -1
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_pkg.py +80 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_registry.py +56 -3
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.gitattributes +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.gitignore +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/.vale.ini +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/LICENSE +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/Makefile +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/README.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/codecov.yml +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/index.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/README.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/examples/README.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/index.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/noxfile.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/setup.cfg +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/README.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/boost.css +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/boost.js +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/style/demo.html +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.400 → boost_skill_cli-1.0.401}/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.401'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 401)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -725,19 +725,32 @@ def cmd_update(argv: List[str]) -> int:
|
|
|
725
725
|
ap.add_argument("-y", "--yes", action="store_true",
|
|
726
726
|
help="skip the confirmation prompt")
|
|
727
727
|
args = ap.parse_args(argv)
|
|
728
|
-
results = registry.update(args.tap or None)
|
|
729
|
-
if not results:
|
|
728
|
+
results, failures = registry.update(args.tap or None)
|
|
729
|
+
if not results and not failures:
|
|
730
730
|
out.info("no taps configured — start with `boost tap --defaults`")
|
|
731
731
|
return 0
|
|
732
732
|
for tname, summary in results.items():
|
|
733
733
|
catalog.rebuild_tap(registry.get(tname))
|
|
734
734
|
out.ok("%s: %s" % (tname, summary))
|
|
735
|
+
# Report the dead ones by name, after the successes, so a broken upstream
|
|
736
|
+
# reads as one line of bad news rather than as the whole command failing.
|
|
737
|
+
for tname, err in failures.items():
|
|
738
|
+
out.warn("%s: %s" % (tname, err))
|
|
739
|
+
if failures:
|
|
740
|
+
out.info(out.role(
|
|
741
|
+
"%d of %d taps could not be refreshed — the rest are up to date. "
|
|
742
|
+
"Drop a dead one with `boost untap <name>`."
|
|
743
|
+
% (len(failures), len(results) + len(failures)), "muted"))
|
|
735
744
|
# A pulled tap can add, drop, or rename catalogue entries, so the
|
|
736
745
|
# completion name cache must not survive an update unrefreshed.
|
|
737
746
|
complete.refresh_names()
|
|
738
747
|
journal.log("update", args.tap or "all")
|
|
739
748
|
if args.taps_only:
|
|
740
|
-
|
|
749
|
+
# Same exit-code rule as the end of the full path: non-zero only when
|
|
750
|
+
# nothing was refreshed at all. This early return predates that rule
|
|
751
|
+
# and kept answering 0 with every tap dead — and a cron'd
|
|
752
|
+
# `boost update --taps-only` exists precisely to notice that morning.
|
|
753
|
+
return 1 if failures and not results else 0
|
|
741
754
|
|
|
742
755
|
upgraded = 0
|
|
743
756
|
for name, lk in sorted(lockfile.installed().items()):
|
|
@@ -782,8 +795,14 @@ def cmd_update(argv: List[str]) -> int:
|
|
|
782
795
|
upgraded += _update_materialized("rule", lockfile.installed_rules(), results)
|
|
783
796
|
upgraded += _update_materialized("workflow", lockfile.installed_workflows(), results)
|
|
784
797
|
if not upgraded:
|
|
785
|
-
|
|
786
|
-
|
|
798
|
+
# Don't claim "everything up to date" when some taps were never
|
|
799
|
+
# reached — that is exactly the false all-clear this fix exists to stop.
|
|
800
|
+
out.ok("everything up to date" if not failures
|
|
801
|
+
else "everything up to date, except the taps above")
|
|
802
|
+
# Non-zero only when nothing was refreshed at all. A partial run did the job
|
|
803
|
+
# it could do, and failing it would put us back to one dead upstream
|
|
804
|
+
# breaking `boost update` for the other 79.
|
|
805
|
+
return 1 if failures and not results else 0
|
|
787
806
|
|
|
788
807
|
|
|
789
808
|
# ── reinstall ────────────────────────────────────────────────────────────
|
|
@@ -32,11 +32,36 @@ def run(args: List[str], cwd: Optional[Path] = None, check: bool = True,
|
|
|
32
32
|
except subprocess.TimeoutExpired:
|
|
33
33
|
raise BoostError("git %s timed out after %ds" % (args[0], timeout)) from None
|
|
34
34
|
if check and proc.returncode != 0:
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
raise BoostError("git %s failed: %s"
|
|
36
|
+
% (args[0], _git_error(proc.stderr or proc.stdout or "")))
|
|
37
37
|
return proc
|
|
38
38
|
|
|
39
39
|
|
|
40
|
+
def _git_error(text: str) -> str:
|
|
41
|
+
"""Pull the one useful line out of git's multi-line failure output.
|
|
42
|
+
|
|
43
|
+
git states the cause first and then advises, so the LAST line is usually the
|
|
44
|
+
tail of a prose hint. A missing remote prints::
|
|
45
|
+
|
|
46
|
+
fatal: '/nope' does not appear to be a git repository
|
|
47
|
+
fatal: Could not read from remote repository.
|
|
48
|
+
<blank>
|
|
49
|
+
Please make sure you have the correct access rights
|
|
50
|
+
and the repository exists.
|
|
51
|
+
|
|
52
|
+
Taking the last line surfaced "and the repository exists." — a sentence
|
|
53
|
+
fragment, with the one line that names the bad path thrown away. Prefer the
|
|
54
|
+
first ``fatal:``/``error:`` line, which is git's own convention for the
|
|
55
|
+
cause, and fall back to the last non-empty line for output that has neither.
|
|
56
|
+
"""
|
|
57
|
+
lines = [ln.strip() for ln in text.strip().splitlines() if ln.strip()]
|
|
58
|
+
for line in lines:
|
|
59
|
+
low = line.lower()
|
|
60
|
+
if low.startswith(("fatal:", "error:")):
|
|
61
|
+
return line
|
|
62
|
+
return lines[-1] if lines else "unknown error"
|
|
63
|
+
|
|
64
|
+
|
|
40
65
|
# git's remote-helper transports run arbitrary commands straight from the URL
|
|
41
66
|
# (notably `ext::sh -c …`), so refuse them outright — boost only ever clones
|
|
42
67
|
# real http(s)/ssh/git remotes.
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
import difflib
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import List, Optional
|
|
7
|
+
from typing import List, Optional, Tuple
|
|
8
8
|
|
|
9
9
|
from ..errors import BoostError
|
|
10
10
|
from . import config, gitutil, paths, policy, util
|
|
@@ -151,14 +151,38 @@ def remove(name: str) -> Tap:
|
|
|
151
151
|
return tap
|
|
152
152
|
|
|
153
153
|
|
|
154
|
-
def update(name: Optional[str] = None) -> dict:
|
|
155
|
-
"""git-pull one tap (or all). Returns {
|
|
154
|
+
def update(name: Optional[str] = None) -> Tuple[dict, dict]:
|
|
155
|
+
"""git-pull one tap (or all). Returns ``({name: summary}, {name: error})``.
|
|
156
|
+
|
|
157
|
+
**A named tap still raises.** ``boost update sometap`` is a request about
|
|
158
|
+
that one tap, so its failure is the answer to the question asked.
|
|
159
|
+
|
|
160
|
+
**Across all taps it does not.** Upstream repos get deleted, renamed and
|
|
161
|
+
made private by people who have never heard of this machine, and one of them
|
|
162
|
+
used to abort the whole loop: every tap after the dead one went unrefreshed,
|
|
163
|
+
the ones already pulled never had their catalogs rebuilt, and the user saw a
|
|
164
|
+
bare git error naming neither the tap nor the URL. With 80+ taps that is a
|
|
165
|
+
near-certainty rather than an edge case. Collecting failures instead lets the
|
|
166
|
+
other 79 refresh, and lets the caller name the broken one.
|
|
167
|
+
|
|
168
|
+
This mirrors what the skill-update loop in ``cmd_update`` already does — warn
|
|
169
|
+
per item and carry on. The tap loop was the one place that did not.
|
|
170
|
+
"""
|
|
156
171
|
targets = [get(name)] if name else list_taps()
|
|
157
|
-
results = {}
|
|
172
|
+
results: dict = {}
|
|
173
|
+
failures: dict = {}
|
|
158
174
|
for tap in targets:
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
175
|
+
try:
|
|
176
|
+
if not tap.is_cloned:
|
|
177
|
+
gitutil.clone_shallow(tap.url, tap.path)
|
|
178
|
+
results[tap.name] = "cloned"
|
|
179
|
+
else:
|
|
180
|
+
results[tap.name] = gitutil.pull(tap.path)
|
|
181
|
+
except BoostError as err:
|
|
182
|
+
if name:
|
|
183
|
+
raise
|
|
184
|
+
# The caller prefixes the tap name, which is the part git never
|
|
185
|
+
# says; git's own first line already carries the URL or path. See
|
|
186
|
+
# gitutil._git_error for why that line is now the one we show.
|
|
187
|
+
failures[tap.name] = err.message
|
|
188
|
+
return results, failures
|
|
@@ -293,6 +293,7 @@ docs/roadmap/items/negative-limit-inverts-log-pulse-output.md
|
|
|
293
293
|
docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md
|
|
294
294
|
docs/roadmap/items/one-command-every-env-nox.md
|
|
295
295
|
docs/roadmap/items/one-commit-can-cut-two-releases.md
|
|
296
|
+
docs/roadmap/items/one-dead-tap-broke-every-update.md
|
|
296
297
|
docs/roadmap/items/one-shared-atomic-write-helper.md
|
|
297
298
|
docs/roadmap/items/package-metadata-validation-twine-check-friends.md
|
|
298
299
|
docs/roadmap/items/patch-coverage-gate-diff-cover.md
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: one-dead-tap-broke-every-update
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: found on the maintainer's own machine — 80+ taps, one deleted upstream, no updates for any of them
|
|
11
|
+
order: 95
|
|
12
|
+
owner: loop/update-survives-a-dead-tap
|
|
13
|
+
title: one deleted upstream stopped <code>boost update</code> for every other tap
|
|
14
|
+
---
|
|
15
|
+
<code>registry.update()</code> looped over the configured taps with <b>no error handling at all</b>.
|
|
16
|
+
The first tap whose upstream had been deleted, renamed or made private raised, and everything after
|
|
17
|
+
it never ran: later taps went unrefreshed, the taps that <i>had</i> already pulled never had their
|
|
18
|
+
catalogs rebuilt, and the whole command exited non-zero.
|
|
19
|
+
|
|
20
|
+
<b>Found by accident, on real data.</b> A test escaped its sandbox and ran <code>boost update</code>
|
|
21
|
+
against the maintainer's actual <code>~/.boost</code>, which died on
|
|
22
|
+
<code>MikroJit-Technologies/claude-skills</code> — a repo that no longer exists. With 80+ taps
|
|
23
|
+
configured, an upstream disappearing is routine rather than an edge case, and one of them was
|
|
24
|
+
silently costing every other tap its updates.
|
|
25
|
+
|
|
26
|
+
<b>The error was unactionable twice over.</b> It named no tap, and it was not even a sentence:
|
|
27
|
+
<i>"git -C failed: and the repository exists."</i> That is the last line of git's output, and git
|
|
28
|
+
states the cause <i>first</i> and advises after —
|
|
29
|
+
|
|
30
|
+
<code>fatal: '/nope' does not appear to be a git repository</code> ·
|
|
31
|
+
<code>fatal: Could not read from remote repository.</code> · <i>(blank)</i> ·
|
|
32
|
+
<code>Please make sure you have the correct access rights</code> ·
|
|
33
|
+
<code>and the repository exists.</code>
|
|
34
|
+
|
|
35
|
+
— so <code>detail[-1]</code> surfaced the tail of a prose hint and threw away the one line that
|
|
36
|
+
names the bad path. <code>gitutil._git_error</code> now prefers the first
|
|
37
|
+
<code>fatal:</code>/<code>error:</code> line, git's own convention for the cause, and falls back to
|
|
38
|
+
the last non-empty line. That improves <i>every</i> git failure boost reports, not just this one.
|
|
39
|
+
|
|
40
|
+
<b>The shape of the fix was already in the codebase.</b> The skill-update loop in
|
|
41
|
+
<code>cmd_update</code> has caught <code>BoostError</code> per item and carried on with a warning
|
|
42
|
+
for a long time; the tap loop was the one place that did not. <code>update()</code> now returns
|
|
43
|
+
<code>(results, failures)</code>, and a named tap — <code>boost update sometap</code> — still
|
|
44
|
+
raises, because asking about one tap makes its failure the answer to the question asked. Only the
|
|
45
|
+
all-taps path is forgiving.
|
|
46
|
+
|
|
47
|
+
<b>Exit code and wording, both deliberate.</b> A partial run returns <b>0</b>: failing it would put
|
|
48
|
+
us back to one dead upstream breaking the command for the other 79. But it must not print a clean
|
|
49
|
+
bill of health either, so the closing line becomes <i>"everything up to date, except the taps
|
|
50
|
+
above"</i>, and a count plus the fix (<code>boost untap <name></code>) is printed. Non-zero is
|
|
51
|
+
reserved for the case where nothing refreshed at all. Skills belonging to a failed tap are skipped
|
|
52
|
+
automatically — the update pass already gates on <code>tapname not in results</code>, so a failed
|
|
53
|
+
tap simply never appears there.
|
|
54
|
+
|
|
55
|
+
<b>Verified by reversion</b>: the git-message test was confirmed to fail with the old
|
|
56
|
+
<code>detail[-1]</code> restored, reproducing <i>"git -C failed: and the repository exists."</i>
|
|
57
|
+
exactly.
|
|
@@ -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>214</b><span>Loop finds</span></div>
|
|
129
129
|
<!-- /ROADMAP:stats -->
|
|
130
130
|
</div>
|
|
131
131
|
</section>
|
|
@@ -3332,6 +3332,61 @@ minutes pulling real tap clones over the network before failing.</p></details>
|
|
|
3332
3332
|
<span class="m">the only escape from the security gate was a flag the parser refused</span>
|
|
3333
3333
|
</div>
|
|
3334
3334
|
</article>
|
|
3335
|
+
|
|
3336
|
+
<article class="cap rcard" id="one-dead-tap-broke-every-update">
|
|
3337
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Bug</span></div>
|
|
3338
|
+
<h3>one deleted upstream stopped <code>boost update</code> for every other tap</h3>
|
|
3339
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3340
|
+
<p><code>registry.update()</code> looped over the configured taps with <b>no error handling at all</b>.
|
|
3341
|
+
The first tap whose upstream had been deleted, renamed or made private raised, and everything after
|
|
3342
|
+
it never ran: later taps went unrefreshed, the taps that <i>had</i> already pulled never had their
|
|
3343
|
+
catalogs rebuilt, and the whole command exited non-zero.
|
|
3344
|
+
|
|
3345
|
+
<b>Found by accident, on real data.</b> A test escaped its sandbox and ran <code>boost update</code>
|
|
3346
|
+
against the maintainer's actual <code>~/.boost</code>, which died on
|
|
3347
|
+
<code>MikroJit-Technologies/claude-skills</code> — a repo that no longer exists. With 80+ taps
|
|
3348
|
+
configured, an upstream disappearing is routine rather than an edge case, and one of them was
|
|
3349
|
+
silently costing every other tap its updates.
|
|
3350
|
+
|
|
3351
|
+
<b>The error was unactionable twice over.</b> It named no tap, and it was not even a sentence:
|
|
3352
|
+
<i>"git -C failed: and the repository exists."</i> That is the last line of git's output, and git
|
|
3353
|
+
states the cause <i>first</i> and advises after —
|
|
3354
|
+
|
|
3355
|
+
<code>fatal: '/nope' does not appear to be a git repository</code> ·
|
|
3356
|
+
<code>fatal: Could not read from remote repository.</code> · <i>(blank)</i> ·
|
|
3357
|
+
<code>Please make sure you have the correct access rights</code> ·
|
|
3358
|
+
<code>and the repository exists.</code>
|
|
3359
|
+
|
|
3360
|
+
— so <code>detail[-1]</code> surfaced the tail of a prose hint and threw away the one line that
|
|
3361
|
+
names the bad path. <code>gitutil._git_error</code> now prefers the first
|
|
3362
|
+
<code>fatal:</code>/<code>error:</code> line, git's own convention for the cause, and falls back to
|
|
3363
|
+
the last non-empty line. That improves <i>every</i> git failure boost reports, not just this one.
|
|
3364
|
+
|
|
3365
|
+
<b>The shape of the fix was already in the codebase.</b> The skill-update loop in
|
|
3366
|
+
<code>cmd_update</code> has caught <code>BoostError</code> per item and carried on with a warning
|
|
3367
|
+
for a long time; the tap loop was the one place that did not. <code>update()</code> now returns
|
|
3368
|
+
<code>(results, failures)</code>, and a named tap — <code>boost update sometap</code> — still
|
|
3369
|
+
raises, because asking about one tap makes its failure the answer to the question asked. Only the
|
|
3370
|
+
all-taps path is forgiving.
|
|
3371
|
+
|
|
3372
|
+
<b>Exit code and wording, both deliberate.</b> A partial run returns <b>0</b>: failing it would put
|
|
3373
|
+
us back to one dead upstream breaking the command for the other 79. But it must not print a clean
|
|
3374
|
+
bill of health either, so the closing line becomes <i>"everything up to date, except the taps
|
|
3375
|
+
above"</i>, and a count plus the fix (<code>boost untap <name></code>) is printed. Non-zero is
|
|
3376
|
+
reserved for the case where nothing refreshed at all. Skills belonging to a failed tap are skipped
|
|
3377
|
+
automatically — the update pass already gates on <code>tapname not in results</code>, so a failed
|
|
3378
|
+
tap simply never appears there.
|
|
3379
|
+
|
|
3380
|
+
<b>Verified by reversion</b>: the git-message test was confirmed to fail with the old
|
|
3381
|
+
<code>detail[-1]</code> restored, reproducing <i>"git -C failed: and the repository exists."</i>
|
|
3382
|
+
exactly.</p></details>
|
|
3383
|
+
<div class="meta">
|
|
3384
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3385
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
3386
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3387
|
+
<span class="m">found on the maintainer's own machine — 80+ taps, one deleted upstream, no updates for any of them</span>
|
|
3388
|
+
</div>
|
|
3389
|
+
</article>
|
|
3335
3390
|
<!-- /ROADMAP:cards -->
|
|
3336
3391
|
|
|
3337
3392
|
</div>
|
|
@@ -317,6 +317,44 @@ class TestUpdate:
|
|
|
317
317
|
assert "fixture-tap: already up to date" in r.out
|
|
318
318
|
assert "everything up to date" in r.out
|
|
319
319
|
|
|
320
|
+
def test_a_dead_upstream_does_not_take_the_other_taps_down(
|
|
321
|
+
self, boost, fixture_tap_src, tmp_path):
|
|
322
|
+
"""One deleted upstream must cost you that tap, not the whole command.
|
|
323
|
+
|
|
324
|
+
It used to cost the whole command: `registry.update()` had no error
|
|
325
|
+
handling, so the loop aborted on the dead tap and every later tap went
|
|
326
|
+
unrefreshed — while the user got a bare git error naming neither the tap
|
|
327
|
+
nor the URL. With 80+ taps a dead upstream is routine, not an edge case.
|
|
328
|
+
"""
|
|
329
|
+
dead = _copy_tap(fixture_tap_src, tmp_path / "dead-tap")
|
|
330
|
+
live = _copy_tap(fixture_tap_src, tmp_path / "live-tap")
|
|
331
|
+
boost("tap", dead)
|
|
332
|
+
boost("tap", live)
|
|
333
|
+
shutil.rmtree(dead) # upstream deleted out from under us
|
|
334
|
+
|
|
335
|
+
r = boost("update", expect=None)
|
|
336
|
+
assert "live-tap: already up to date" in r.out # the healthy tap ran
|
|
337
|
+
assert "dead-tap" in r.out # named, not anonymous
|
|
338
|
+
assert "1 of 2 taps could not be refreshed" in r.out
|
|
339
|
+
# and it must not claim a clean bill of health
|
|
340
|
+
assert "everything up to date, except the taps above" in r.out
|
|
341
|
+
assert r.rc == 0 # partial success is still success
|
|
342
|
+
|
|
343
|
+
def test_the_git_error_names_the_cause_not_the_hint_tail(
|
|
344
|
+
self, boost, fixture_tap_src, tmp_path):
|
|
345
|
+
"""git states the cause first and advises after.
|
|
346
|
+
|
|
347
|
+
Reporting the LAST line of git's output surfaced "and the repository
|
|
348
|
+
exists." — the tail of a prose hint — and discarded the line naming the
|
|
349
|
+
missing path.
|
|
350
|
+
"""
|
|
351
|
+
dead = _copy_tap(fixture_tap_src, tmp_path / "gone-tap")
|
|
352
|
+
boost("tap", dead)
|
|
353
|
+
shutil.rmtree(dead)
|
|
354
|
+
r = boost("update", expect=None)
|
|
355
|
+
assert "and the repository exists" not in r.out
|
|
356
|
+
assert "does not appear to be a git repository" in r.out
|
|
357
|
+
|
|
320
358
|
def test_upgrades_unpinned_skips_pinned(self, boost, fixture_tap_src,
|
|
321
359
|
tmp_path):
|
|
322
360
|
tap_dir = _copy_tap(fixture_tap_src, tmp_path / "up-tap")
|
|
@@ -345,6 +383,48 @@ class TestUpdate:
|
|
|
345
383
|
assert "upgraded" not in r.out
|
|
346
384
|
assert _lock()["brainstorming"]["version"] == "1.4.0"
|
|
347
385
|
|
|
386
|
+
def test_taps_only_with_every_tap_dead_is_a_failure(
|
|
387
|
+
self, boost, fixture_tap_src, tmp_path):
|
|
388
|
+
"""`--taps-only` must obey the same exit-code rule as the full path.
|
|
389
|
+
|
|
390
|
+
It didn't: `if args.taps_only: return 0` sat above the
|
|
391
|
+
`1 if failures and not results else 0` rule, so with every upstream
|
|
392
|
+
dead the taps-only path answered 0 while the full path answered 1.
|
|
393
|
+
A cron'd `boost update --taps-only` is exactly the caller that reads
|
|
394
|
+
nothing but the exit code — it would have slept through every tap
|
|
395
|
+
being gone.
|
|
396
|
+
"""
|
|
397
|
+
dead = _copy_tap(fixture_tap_src, tmp_path / "only-dead-tap")
|
|
398
|
+
boost("tap", dead)
|
|
399
|
+
shutil.rmtree(dead) # upstream deleted out from under us
|
|
400
|
+
r = boost("update", "--taps-only", expect=None)
|
|
401
|
+
assert "only-dead-tap" in r.out # still named, same as the full path
|
|
402
|
+
assert r.rc == 1, "every tap failed and --taps-only said success"
|
|
403
|
+
|
|
404
|
+
def test_taps_only_partial_failure_is_still_success(
|
|
405
|
+
self, boost, fixture_tap_src, tmp_path):
|
|
406
|
+
# The other half of the rule: a partial run did the job it could do,
|
|
407
|
+
# and failing it would put us back to one dead upstream breaking
|
|
408
|
+
# `boost update` for the other 79.
|
|
409
|
+
dead = _copy_tap(fixture_tap_src, tmp_path / "half-dead-tap")
|
|
410
|
+
live = _copy_tap(fixture_tap_src, tmp_path / "half-live-tap")
|
|
411
|
+
boost("tap", dead)
|
|
412
|
+
boost("tap", live)
|
|
413
|
+
shutil.rmtree(dead)
|
|
414
|
+
r = boost("update", "--taps-only", expect=None)
|
|
415
|
+
assert "half-live-tap" in r.out
|
|
416
|
+
assert r.rc == 0
|
|
417
|
+
|
|
418
|
+
def test_every_tap_dead_is_a_failure_on_the_full_path_too(
|
|
419
|
+
self, boost, fixture_tap_src, tmp_path):
|
|
420
|
+
# Pins the rule itself, not just the taps-only copy of it — this is
|
|
421
|
+
# the assertion that keeps the two paths from drifting apart again.
|
|
422
|
+
dead = _copy_tap(fixture_tap_src, tmp_path / "all-dead-tap")
|
|
423
|
+
boost("tap", dead)
|
|
424
|
+
shutil.rmtree(dead)
|
|
425
|
+
r = boost("update", expect=None)
|
|
426
|
+
assert r.rc == 1
|
|
427
|
+
|
|
348
428
|
def test_refreshes_the_completion_cache(self, boost, fixture_tap_src,
|
|
349
429
|
tmp_path):
|
|
350
430
|
from boost_cli.core import complete
|
|
@@ -271,13 +271,13 @@ class TestUpdate:
|
|
|
271
271
|
origin = _make_repo(tmp_path / "pullme")
|
|
272
272
|
tap = registry.add(str(origin))
|
|
273
273
|
util.rmtree(tap.path)
|
|
274
|
-
assert registry.update("pullme") == {"pullme": "cloned"}
|
|
274
|
+
assert registry.update("pullme") == ({"pullme": "cloned"}, {})
|
|
275
275
|
assert tap.is_cloned
|
|
276
276
|
|
|
277
277
|
def test_update_already_up_to_date(self, sandbox, tmp_path):
|
|
278
278
|
origin = _make_repo(tmp_path / "pullme")
|
|
279
279
|
registry.add(str(origin))
|
|
280
|
-
assert registry.update() == {"pullme": "already up to date"}
|
|
280
|
+
assert registry.update() == ({"pullme": "already up to date"}, {})
|
|
281
281
|
|
|
282
282
|
def test_update_pulls_new_commit(self, sandbox, tmp_path):
|
|
283
283
|
origin = _make_repo(tmp_path / "pullme")
|
|
@@ -286,7 +286,7 @@ class TestUpdate:
|
|
|
286
286
|
(origin / "b.txt").write_text("two\n", encoding="utf-8")
|
|
287
287
|
_git("add", "-A", cwd=origin)
|
|
288
288
|
_git("commit", "-qm", "add b", cwd=origin)
|
|
289
|
-
summary = registry.update("pullme")["pullme"]
|
|
289
|
+
summary = registry.update("pullme")[0]["pullme"]
|
|
290
290
|
after = gitutil.head_commit(tap.path)
|
|
291
291
|
assert re.fullmatch(r"[0-9a-f]{7} → [0-9a-f]{7}", summary)
|
|
292
292
|
assert summary == "%s → %s" % (before[:7], after[:7])
|
|
@@ -295,3 +295,56 @@ class TestUpdate:
|
|
|
295
295
|
def test_update_unknown_tap_raises(self, sandbox):
|
|
296
296
|
with pytest.raises(BoostError):
|
|
297
297
|
registry.update("nope")
|
|
298
|
+
|
|
299
|
+
def test_one_dead_upstream_does_not_stop_the_others(self, sandbox, tmp_path):
|
|
300
|
+
"""The regression: `update()` had no error handling, so the first tap
|
|
301
|
+
with a deleted upstream aborted the loop and every later tap went
|
|
302
|
+
unrefreshed — with the successful pulls thrown away unreported.
|
|
303
|
+
"""
|
|
304
|
+
dead_origin = _make_repo(tmp_path / "deadtap")
|
|
305
|
+
registry.add(str(dead_origin))
|
|
306
|
+
live_origin = _make_repo(tmp_path / "livetap")
|
|
307
|
+
registry.add(str(live_origin))
|
|
308
|
+
util.rmtree(dead_origin) # upstream deleted out from under us
|
|
309
|
+
|
|
310
|
+
results, failures = registry.update()
|
|
311
|
+
assert "livetap" in results # the healthy tap still refreshed
|
|
312
|
+
assert "deadtap" not in results # and is not reported as a success
|
|
313
|
+
assert "deadtap" in failures
|
|
314
|
+
assert failures["deadtap"] # carries a reason, not an empty string
|
|
315
|
+
|
|
316
|
+
def test_a_named_dead_tap_still_raises(self, sandbox, tmp_path):
|
|
317
|
+
"""Asking about one tap makes its failure the answer, not a warning."""
|
|
318
|
+
origin = _make_repo(tmp_path / "solo")
|
|
319
|
+
registry.add(str(origin))
|
|
320
|
+
util.rmtree(origin)
|
|
321
|
+
with pytest.raises(BoostError):
|
|
322
|
+
registry.update("solo")
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class TestGitErrorLine:
|
|
326
|
+
"""gitutil._git_error — git states the cause first, then advises."""
|
|
327
|
+
|
|
328
|
+
def test_prefers_the_first_fatal_line_over_the_hint_tail(self):
|
|
329
|
+
# Real `git fetch` output for a missing remote. The last line is the
|
|
330
|
+
# tail of a prose hint; the first names the bad path.
|
|
331
|
+
text = ("fatal: '/nope' does not appear to be a git repository\n"
|
|
332
|
+
"fatal: Could not read from remote repository.\n"
|
|
333
|
+
"\n"
|
|
334
|
+
"Please make sure you have the correct access rights\n"
|
|
335
|
+
"and the repository exists.\n")
|
|
336
|
+
assert gitutil._git_error(text) == (
|
|
337
|
+
"fatal: '/nope' does not appear to be a git repository")
|
|
338
|
+
|
|
339
|
+
def test_error_prefix_counts_too(self):
|
|
340
|
+
assert gitutil._git_error("error: pathspec 'x' did not match\ntrailing\n") == (
|
|
341
|
+
"error: pathspec 'x' did not match")
|
|
342
|
+
|
|
343
|
+
def test_falls_back_to_last_line_without_a_marker(self):
|
|
344
|
+
assert gitutil._git_error("something odd\nlast word\n") == "last word"
|
|
345
|
+
|
|
346
|
+
def test_blank_output_is_named_rather_than_empty(self):
|
|
347
|
+
assert gitutil._git_error(" \n\n") == "unknown error"
|
|
348
|
+
|
|
349
|
+
def test_skips_blank_lines_when_falling_back(self):
|
|
350
|
+
assert gitutil._git_error("only line\n\n\n") == "only line"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|