boost-skill-cli 1.1.1__tar.gz → 1.1.2__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.1.1 → boost_skill_cli-1.1.2}/PKG-INFO +1 -1
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/configuration.py +58 -3
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/complete.py +132 -30
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/commands.html +4 -3
- boost_skill_cli-1.1.2/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +82 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap.html +79 -1
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_complete.py +10 -1
- boost_skill_cli-1.1.2/tests/unit/test_complete_rc_block.py +367 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.gitattributes +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.gitignore +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.lycheeignore +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/.vale.ini +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/CLAUDE.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/LICENSE +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/MANIFEST.in +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/Makefile +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/README.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/SECURITY.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/codecov.yml +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/adapters.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/carousel.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/chat.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo.gif +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/demo.tape +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/eval.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/index.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/langchain.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/README.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/__init__.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/baseline.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/metrics.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/examples/README.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/index.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/noxfile.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/pyproject.toml +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/setup.cfg +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/sonar-project.properties +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/README.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/boost.css +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/boost.js +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/style/demo.html +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/conftest.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.1.1 → boost_skill_cli-1.1.2}/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.1.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 1,
|
|
21
|
+
__version__ = version = '1.1.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 1, 2)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -3,6 +3,7 @@ completions, schedule, serve, mcp, self-update."""
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import argparse
|
|
6
|
+
import difflib
|
|
6
7
|
import json
|
|
7
8
|
import os
|
|
8
9
|
import re
|
|
@@ -659,8 +660,42 @@ def _sq(s: str) -> str:
|
|
|
659
660
|
return s.replace("'", "'\\''")
|
|
660
661
|
|
|
661
662
|
|
|
663
|
+
def _report_rc_plan(plan, install: bool, shell: str) -> None:
|
|
664
|
+
"""Print what `--dry-run` would do to an rc file, and nothing else."""
|
|
665
|
+
if not plan.changes:
|
|
666
|
+
out.ok("%s already %s — no change"
|
|
667
|
+
% (_tilde(plan.path),
|
|
668
|
+
"wired for boost completions" if install
|
|
669
|
+
else "free of boost completions"))
|
|
670
|
+
return
|
|
671
|
+
verb = {
|
|
672
|
+
"create": "would create %s and wire boost completions into it",
|
|
673
|
+
"add": "would wire boost completions into %s",
|
|
674
|
+
# `replace` also covers collapsing a duplicated block back to one.
|
|
675
|
+
"replace": "would rewrite the boost completions block in %s",
|
|
676
|
+
"remove": "would remove boost completions from %s",
|
|
677
|
+
}[plan.action]
|
|
678
|
+
out.info(verb % _tilde(plan.path))
|
|
679
|
+
for line in _rc_plan_diff(plan):
|
|
680
|
+
out.dim(" " + line)
|
|
681
|
+
out.dim(" re-run without --dry-run to apply")
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
def _rc_plan_diff(plan) -> list[str]:
|
|
685
|
+
"""The +/- lines between a plan's before and after, for the dry run.
|
|
686
|
+
|
|
687
|
+
The ``---``/``+++``/``@@`` scaffolding is dropped: the file is named on the
|
|
688
|
+
line above, and line numbers earn nothing on a five-line rc edit.
|
|
689
|
+
"""
|
|
690
|
+
return [ln.rstrip("\n")
|
|
691
|
+
for ln in difflib.unified_diff(plan.before.splitlines(),
|
|
692
|
+
plan.after.splitlines(), n=1)
|
|
693
|
+
if not ln.startswith(("---", "+++", "@@"))]
|
|
694
|
+
|
|
695
|
+
|
|
662
696
|
def cmd_completions(argv) -> int:
|
|
663
|
-
"""boost completions [bash|zsh|fish] [--install|--uninstall] [--eval]
|
|
697
|
+
"""boost completions [bash|zsh|fish] [--install|--uninstall] [--eval]
|
|
698
|
+
[--dry-run]"""
|
|
664
699
|
p = cliparse.parser(
|
|
665
700
|
prog="boost completions",
|
|
666
701
|
description="Generate shell tab-completion scripts")
|
|
@@ -669,6 +704,9 @@ def cmd_completions(argv) -> int:
|
|
|
669
704
|
p.add_argument("--eval", action="store_true",
|
|
670
705
|
help="print the variant safe to `eval` directly "
|
|
671
706
|
"(what --install wires up)")
|
|
707
|
+
p.add_argument("--dry-run", action="store_true",
|
|
708
|
+
help="with --install/--uninstall: report what would change "
|
|
709
|
+
"in the rc file without writing it")
|
|
672
710
|
group = p.add_mutually_exclusive_group()
|
|
673
711
|
group.add_argument("--install", action="store_true",
|
|
674
712
|
help="wire completions into the shell's rc file "
|
|
@@ -679,11 +717,28 @@ def cmd_completions(argv) -> int:
|
|
|
679
717
|
|
|
680
718
|
detected = args.shell or Path(os.environ.get("SHELL", "")).name
|
|
681
719
|
|
|
720
|
+
if args.dry_run and not (args.install or args.uninstall):
|
|
721
|
+
p.error("--dry-run qualifies --install or --uninstall; "
|
|
722
|
+
"pass one of them")
|
|
723
|
+
|
|
682
724
|
if args.install or args.uninstall:
|
|
683
|
-
|
|
725
|
+
# Plan first either way, so a malformed rc file is reported before
|
|
726
|
+
# anything is written rather than after.
|
|
727
|
+
plan = (complete.plan_install if args.install
|
|
728
|
+
else complete.plan_uninstall)(detected)
|
|
729
|
+
if args.dry_run:
|
|
730
|
+
_report_rc_plan(plan, install=args.install, shell=detected)
|
|
731
|
+
return 0
|
|
732
|
+
complete.apply(plan)
|
|
733
|
+
if not plan.changes:
|
|
734
|
+
out.ok("%s already %s — no change"
|
|
735
|
+
% (_tilde(plan.path),
|
|
736
|
+
"wired for boost completions" if args.install
|
|
737
|
+
else "free of boost completions"))
|
|
738
|
+
return 0
|
|
684
739
|
out.ok("%s boost completions %s %s"
|
|
685
740
|
% ("wired" if args.install else "removed",
|
|
686
|
-
"into" if args.install else "from", _tilde(
|
|
741
|
+
"into" if args.install else "from", _tilde(plan.path)))
|
|
687
742
|
if args.install:
|
|
688
743
|
out.dim(" restart your shell (or run `exec %s`) to pick it up"
|
|
689
744
|
% detected)
|
|
@@ -29,6 +29,7 @@ from __future__ import annotations
|
|
|
29
29
|
import os
|
|
30
30
|
import re
|
|
31
31
|
from collections.abc import Callable, Sequence
|
|
32
|
+
from dataclasses import dataclass
|
|
32
33
|
from pathlib import Path
|
|
33
34
|
|
|
34
35
|
from ..errors import BoostError
|
|
@@ -257,31 +258,78 @@ def _rc_block(shell: str) -> str:
|
|
|
257
258
|
% (_RC_START, shell, _RC_END))
|
|
258
259
|
|
|
259
260
|
|
|
260
|
-
def
|
|
261
|
+
def _spans(text: str, rc: Path | None = None) -> list[tuple[int, int]]:
|
|
262
|
+
"""Half-open (start, end) index pairs of every managed block in ``text``.
|
|
263
|
+
|
|
264
|
+
Raises :class:`BoostError` for a start marker with no matching end, because
|
|
265
|
+
an rc file in that state cannot be edited safely by index. Both writers used
|
|
266
|
+
to pair the *first* start with the *next* end found anywhere after it, so an
|
|
267
|
+
orphan start marker sitting above real config made the next edit delete
|
|
268
|
+
every line in between — reported as ``✓ wired boost completions``. Refusing
|
|
269
|
+
costs the user one hand-edit; guessing cost them their shell config.
|
|
270
|
+
|
|
271
|
+
An orphan *end* is not an error: nothing pairs to it, it is skipped, and the
|
|
272
|
+
file keeps working. Only an unclosed block is ambiguous.
|
|
273
|
+
"""
|
|
274
|
+
spans: list[tuple[int, int]] = []
|
|
275
|
+
i = 0
|
|
276
|
+
while (s := text.find(_RC_START, i)) != -1:
|
|
277
|
+
after = s + len(_RC_START)
|
|
278
|
+
e = text.find(_RC_END, after)
|
|
279
|
+
nxt = text.find(_RC_START, after)
|
|
280
|
+
# A block must close before the next one opens. Testing only `e == -1`
|
|
281
|
+
# is the original bug in a new place: an orphan start sitting above a
|
|
282
|
+
# real block finds *that* block's end and swallows every line between.
|
|
283
|
+
if e == -1 or (nxt != -1 and nxt < e):
|
|
284
|
+
where = " in %s" % paths.tilde(rc) if rc is not None else ""
|
|
285
|
+
raise BoostError(
|
|
286
|
+
"boost completions block%s starts but never ends" % where,
|
|
287
|
+
hint="%s has no matching %s — delete the stray start line (or "
|
|
288
|
+
"close the block), then re-run"
|
|
289
|
+
% (_RC_START, _RC_END))
|
|
290
|
+
e += len(_RC_END)
|
|
291
|
+
spans.append((s, e))
|
|
292
|
+
i = e
|
|
293
|
+
return spans
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
def _outside(text: str, spans: list[tuple[int, int]]) -> list[str]:
|
|
297
|
+
"""The stretches of ``text`` that sit outside every managed block."""
|
|
298
|
+
parts, prev = [], 0
|
|
299
|
+
for s, e in spans:
|
|
300
|
+
parts.append(text[prev:s])
|
|
301
|
+
prev = e
|
|
302
|
+
parts.append(text[prev:])
|
|
303
|
+
return parts
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _merge_rc(text: str, block: str, rc: Path | None = None) -> str:
|
|
261
307
|
"""Idempotently set ``block`` in ``text``: replace a prior boost block in
|
|
262
308
|
place, or append one after a single blank line. Mirrors
|
|
263
|
-
:func:`core.rules.merge_block`'s shape with rc-file-safe markers.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
309
|
+
:func:`core.rules.merge_block`'s shape with rc-file-safe markers.
|
|
310
|
+
|
|
311
|
+
Collapses to exactly one block. Replacing only the first left a second one
|
|
312
|
+
live, so `--install` was idempotent in content but not in count.
|
|
313
|
+
"""
|
|
314
|
+
spans = _spans(text, rc)
|
|
315
|
+
if not spans:
|
|
316
|
+
base = text.rstrip("\n")
|
|
317
|
+
return (base + "\n\n" + block + "\n") if base else block + "\n"
|
|
318
|
+
parts = _outside(text, spans)
|
|
319
|
+
return (parts[0] + block + "".join(parts[1:])).rstrip("\n") + "\n"
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def _strip_rc(text: str, rc: Path | None = None) -> str:
|
|
323
|
+
"""Inverse of :func:`_merge_rc`: remove every managed block, if present.
|
|
324
|
+
|
|
325
|
+
Every, not the first: `--uninstall` on a doubled block used to report
|
|
326
|
+
"removed" while the shell went on sourcing the survivor.
|
|
327
|
+
"""
|
|
328
|
+
spans = _spans(text, rc)
|
|
329
|
+
if not spans:
|
|
278
330
|
return text
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
return text # no end marker: malformed, leave the file untouched
|
|
282
|
-
j += len(_RC_END)
|
|
283
|
-
before, after = text[:i].rstrip("\n"), text[j:].strip("\n")
|
|
284
|
-
parts = [p for p in (before, after) if p]
|
|
331
|
+
parts = [p.strip("\n") for p in _outside(text, spans)]
|
|
332
|
+
parts = [p for p in parts if p]
|
|
285
333
|
return "\n\n".join(parts) + "\n" if parts else ""
|
|
286
334
|
|
|
287
335
|
|
|
@@ -295,22 +343,76 @@ def _rc_path(shell: str) -> Path:
|
|
|
295
343
|
return paths.expand("~/" + RC_FILE[shell])
|
|
296
344
|
|
|
297
345
|
|
|
346
|
+
@dataclass(frozen=True)
|
|
347
|
+
class RcPlan:
|
|
348
|
+
"""What an install/uninstall would do to one rc file, before it does it.
|
|
349
|
+
|
|
350
|
+
``--dry-run`` prints this; ``install``/``uninstall`` apply it. One code path
|
|
351
|
+
computes both, so the preview cannot disagree with the write.
|
|
352
|
+
"""
|
|
353
|
+
path: Path
|
|
354
|
+
action: str # create | add | replace | remove | none
|
|
355
|
+
before: str
|
|
356
|
+
after: str
|
|
357
|
+
|
|
358
|
+
@property
|
|
359
|
+
def changes(self) -> bool:
|
|
360
|
+
"""True when applying this would alter the file."""
|
|
361
|
+
return self.before != self.after
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def _read_rc(shell: str) -> tuple[Path, str, bool]:
|
|
365
|
+
rc = _rc_path(shell)
|
|
366
|
+
exists = rc.exists()
|
|
367
|
+
return rc, (rc.read_text(encoding="utf-8") if exists else ""), exists
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def plan_install(shell: str) -> RcPlan:
|
|
371
|
+
"""Describe wiring ``shell``'s rc file, writing nothing.
|
|
372
|
+
|
|
373
|
+
Raises :class:`BoostError` for a shell with no rc-file install path, and for
|
|
374
|
+
an rc file holding an unclosed block — so a dry run answers the dangerous
|
|
375
|
+
question too, rather than only the safe one.
|
|
376
|
+
"""
|
|
377
|
+
rc, text, exists = _read_rc(shell)
|
|
378
|
+
after = _merge_rc(text, _rc_block(shell), rc)
|
|
379
|
+
if not exists:
|
|
380
|
+
action = "create"
|
|
381
|
+
elif after == text:
|
|
382
|
+
action = "none"
|
|
383
|
+
elif _spans(text, rc):
|
|
384
|
+
action = "replace"
|
|
385
|
+
else:
|
|
386
|
+
action = "add"
|
|
387
|
+
return RcPlan(path=rc, action=action, before=text, after=after)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def plan_uninstall(shell: str) -> RcPlan:
|
|
391
|
+
"""Describe removing what :func:`install` wired up, writing nothing."""
|
|
392
|
+
rc, text, _ = _read_rc(shell)
|
|
393
|
+
after = _strip_rc(text, rc)
|
|
394
|
+
return RcPlan(path=rc, action=("remove" if after != text else "none"),
|
|
395
|
+
before=text, after=after)
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def apply(plan: RcPlan) -> Path:
|
|
399
|
+
"""Write ``plan``'s result. A no-op when it changes nothing, so an rc file
|
|
400
|
+
keeps its mtime (and its place in the user's backups) on a repeat run."""
|
|
401
|
+
if plan.changes:
|
|
402
|
+
plan.path.write_text(plan.after, encoding="utf-8")
|
|
403
|
+
return plan.path
|
|
404
|
+
|
|
405
|
+
|
|
298
406
|
def install(shell: str) -> Path:
|
|
299
407
|
"""Idempotently wire ``shell``'s rc file to eval boost's completions on
|
|
300
408
|
every startup. Returns the rc file path. Raises :class:`BoostError` for
|
|
301
409
|
a shell with no rc-file install path (currently anything but bash/zsh)."""
|
|
302
|
-
|
|
303
|
-
text = rc.read_text(encoding="utf-8") if rc.exists() else ""
|
|
304
|
-
rc.write_text(_merge_rc(text, _rc_block(shell)), encoding="utf-8")
|
|
305
|
-
return rc
|
|
410
|
+
return apply(plan_install(shell))
|
|
306
411
|
|
|
307
412
|
|
|
308
413
|
def uninstall(shell: str) -> Path:
|
|
309
414
|
"""Remove what :func:`install` wired up. A no-op if never installed."""
|
|
310
|
-
|
|
311
|
-
if rc.exists():
|
|
312
|
-
rc.write_text(_strip_rc(rc.read_text(encoding="utf-8")), encoding="utf-8")
|
|
313
|
-
return rc
|
|
415
|
+
return apply(plan_uninstall(shell))
|
|
314
416
|
|
|
315
417
|
|
|
316
418
|
def detect_shell() -> str:
|
|
@@ -213,6 +213,7 @@ docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
|
|
|
213
213
|
docs/roadmap/items/command-carousel-page.md
|
|
214
214
|
docs/roadmap/items/command-reference-docs-site.md
|
|
215
215
|
docs/roadmap/items/completions-complete-only-command-names.md
|
|
216
|
+
docs/roadmap/items/completions-install-could-eat-your-rc-file.md
|
|
216
217
|
docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md
|
|
217
218
|
docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md
|
|
218
219
|
docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md
|
|
@@ -589,6 +590,7 @@ tests/unit/test_command_reference_fresh.py
|
|
|
589
590
|
tests/unit/test_community_health_files.py
|
|
590
591
|
tests/unit/test_compact.py
|
|
591
592
|
tests/unit/test_complete.py
|
|
593
|
+
tests/unit/test_complete_rc_block.py
|
|
592
594
|
tests/unit/test_config.py
|
|
593
595
|
tests/unit/test_content_dedupe.py
|
|
594
596
|
tests/unit/test_crash_redaction.py
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
<a class="cmd-link" href="#cmd-create" data-search="create scaffold a new skill from a template --description description --dir dir --install name">create</a>
|
|
187
187
|
<a class="cmd-link" href="#cmd-policy" data-search="policy manage & enforce skill governance policies --json {list,set,unset,check} key value">policy</a>
|
|
188
188
|
<a class="cmd-link" href="#cmd-onboard" data-search="onboard add skill-tracker telemetry to a repo & open a pr --repo repo --pr --dry-run -f, --force">onboard</a>
|
|
189
|
-
<a class="cmd-link" href="#cmd-completions" data-search="completions generate shell tab-completion scripts --eval --install --uninstall {bash,zsh,fish}">completions</a>
|
|
189
|
+
<a class="cmd-link" href="#cmd-completions" data-search="completions generate shell tab-completion scripts --eval --dry-run --install --uninstall {bash,zsh,fish}">completions</a>
|
|
190
190
|
<a class="cmd-link" href="#cmd-schedule" data-search="schedule manage automatic skill-sync scheduling --interval {6h,12h,daily} --json {status,enable,disable}">schedule</a>
|
|
191
191
|
<a class="cmd-link" href="#cmd-serve" data-search="serve browse the catalogue in a browser: search, facets and a tap graph --port port --host host">serve</a>
|
|
192
192
|
<a class="cmd-link" href="#cmd-mcp" data-search="mcp register boost as an mcp server (claude code, gemini cli) register boost as an mcp server for your agent clis --host h --stdio --seed --no-seed {register,unregister}">mcp</a>
|
|
@@ -1049,10 +1049,10 @@
|
|
|
1049
1049
|
<div class="arg"><code>-f, --force</code><span>overwrite existing files without confirming</span></div>
|
|
1050
1050
|
</div>
|
|
1051
1051
|
</section>
|
|
1052
|
-
<section class="cmd" id="cmd-completions" data-search="completions generate shell tab-completion scripts --eval --install --uninstall {bash,zsh,fish}">
|
|
1052
|
+
<section class="cmd" id="cmd-completions" data-search="completions generate shell tab-completion scripts --eval --dry-run --install --uninstall {bash,zsh,fish}">
|
|
1053
1053
|
<h3><span class="cname">completions</span><span class="gtag">cfg</span></h3>
|
|
1054
1054
|
<p class="summary">Generate shell tab-completion scripts</p>
|
|
1055
|
-
<pre class="syn">boost completions [--eval] [--install] [--uninstall] [{bash,zsh,fish}]</pre>
|
|
1055
|
+
<pre class="syn">boost completions [--eval] [--dry-run] [--install] [--uninstall] [{bash,zsh,fish}]</pre>
|
|
1056
1056
|
<div class="args-h">Arguments</div>
|
|
1057
1057
|
<div class="args">
|
|
1058
1058
|
<div class="arg"><code>{bash,zsh,fish}</code><span>target shell (default: from $SHELL)</span></div>
|
|
@@ -1060,6 +1060,7 @@
|
|
|
1060
1060
|
<div class="args-h">Options</div>
|
|
1061
1061
|
<div class="args">
|
|
1062
1062
|
<div class="arg"><code>--eval</code><span>print the variant safe to `eval` directly (what --install wires up)</span></div>
|
|
1063
|
+
<div class="arg"><code>--dry-run</code><span>with --install/--uninstall: report what would change in the rc file without writing it</span></div>
|
|
1063
1064
|
<div class="arg"><code>--install</code><span>wire completions into the shell's rc file (bash/zsh — one-shot, no manual editing)</span></div>
|
|
1064
1065
|
<div class="arg"><code>--uninstall</code><span>remove what --install wired up</span></div>
|
|
1065
1066
|
</div>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: completions-install-could-eat-your-rc-file
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Bug
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: two runs of a "no-op" command deleted the lines between two markers
|
|
11
|
+
order: 113
|
|
12
|
+
owner: fix/completions-malformed-block
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>completions --install</code> could delete the config between its own markers
|
|
15
|
+
---
|
|
16
|
+
Found by asking a plain question — <em>is <code>boost completions</code>
|
|
17
|
+
idempotent?</em> — and testing the answer rather than reading the docstring. For
|
|
18
|
+
every ordinary input it is: seven paths reach a fixed point on the second run,
|
|
19
|
+
and the managed block is replaced in place rather than appended. Three states
|
|
20
|
+
were not ordinary, and each is reachable from one hand-edit of a shell rc file.
|
|
21
|
+
|
|
22
|
+
<b>A start marker with no end deleted user config.</b> <code>_merge_rc</code>
|
|
23
|
+
paired the first start marker with the next end marker found <em>anywhere</em>
|
|
24
|
+
after it. With an orphan start above real config, run one appended a second
|
|
25
|
+
block, and run two matched the orphan start against that new block's end and
|
|
26
|
+
removed everything in between — the user's own lines — while printing
|
|
27
|
+
<code>✓ wired boost completions into ~/.zshrc</code>. It converged, to a file
|
|
28
|
+
with the user's aliases gone.
|
|
29
|
+
|
|
30
|
+
<b>The inverse function already refused this exact input</b>, ten lines below:
|
|
31
|
+
<code>_strip_rc</code> carried the comment <em>"no end marker: malformed, leave
|
|
32
|
+
the file untouched."</em> So the state was recognised and only the writer failed
|
|
33
|
+
to handle it. That asymmetry is the whole bug, and it is why this was worth
|
|
34
|
+
fixing rather than filing: the reasoning was already in the file.
|
|
35
|
+
|
|
36
|
+
<b>Uninstall had the same hole from the mirror precondition.</b>
|
|
37
|
+
<code>_strip_rc</code> was safe only while the orphan start was the sole marker.
|
|
38
|
+
Put a well-formed block below it and uninstall paired the orphan with that
|
|
39
|
+
block's end: an rc file of <code>export A=1</code> plus four user lines came
|
|
40
|
+
back as <code>export A=1</code> alone.
|
|
41
|
+
|
|
42
|
+
<b>Two blocks made uninstall lie.</b> It removed the first and left the second,
|
|
43
|
+
so boost reported <em>removed</em> while the shell went on sourcing
|
|
44
|
+
completions — the same shape as the <code>sync</code> defect in
|
|
45
|
+
<code>#515</code>, a command reporting success for work it declined to do.
|
|
46
|
+
|
|
47
|
+
<b>The fix is one scan with the right invariant:</b> a block must close before
|
|
48
|
+
the next one opens. Testing only for a missing end marker is the original bug in
|
|
49
|
+
a new place, which the first draft of this fix reproduced and a test caught.
|
|
50
|
+
Install now collapses to exactly one block, uninstall removes every block, and
|
|
51
|
+
both refuse an unclosed one by name instead of guessing. An orphan
|
|
52
|
+
<em>end</em> marker stays harmless and is pinned as such, so a later
|
|
53
|
+
"tighten the parser" change cannot start rejecting a file that works.
|
|
54
|
+
|
|
55
|
+
<b><code>--dry-run</code> makes it answerable before it is written.</b>
|
|
56
|
+
<code>boost completions --install --dry-run</code> prints the exact +/- lines
|
|
57
|
+
and touches nothing, and it raises on the malformed file too — a validation that
|
|
58
|
+
only reports the safe cases is not a validation. Plan and apply are one code
|
|
59
|
+
path (<code>plan_install</code> → <code>apply</code>), so the preview cannot
|
|
60
|
+
disagree with the write, and a test pins that equality. Applying a no-op change
|
|
61
|
+
now also leaves the file's mtime alone rather than rewriting identical bytes.
|
|
62
|
+
|
|
63
|
+
<b>Verified exhaustively, not just by example.</b> A property test enumerates
|
|
64
|
+
every arrangement of up to four fragments — user line, stray start, stray end,
|
|
65
|
+
real block — and asserts three invariants over all 672 orderings: a user line
|
|
66
|
+
boost does not own is never lost, a successful uninstall never leaves a block,
|
|
67
|
+
and a refusal never modifies the file. Against the pre-fix code the same test
|
|
68
|
+
reports <b>220 violations</b> (198 of the second, 22 of the first); against the
|
|
69
|
+
fix, zero. It runs in 0.38s.
|
|
70
|
+
|
|
71
|
+
That sweep also corrected its own first draft. Its initial invariant counted
|
|
72
|
+
every user line, and flagged 16 "failures" that were the managed block behaving
|
|
73
|
+
exactly as conda, nvm and rbenv do — content between the markers is boost's to
|
|
74
|
+
replace. The real invariant is about lines boost does <em>not</em> own, and the
|
|
75
|
+
reference parser has to resolve the orphan-start ambiguity the way the fix does
|
|
76
|
+
rather than the way the bug did, or it under-reports the data loss it exists to
|
|
77
|
+
catch.
|
|
78
|
+
|
|
79
|
+
An rc file is the user's own hand-written config and the worst file boost owns
|
|
80
|
+
an edit to, which is what moves this from tidy-up to High impact. The old tests
|
|
81
|
+
covered only the well-formed path — a double install leaving one marker — so
|
|
82
|
+
none of the three states had a failing test to find them.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>252</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -8225,6 +8225,84 @@ now pinned on the two facts that enforce it — the row says which kind it is, a
|
|
|
8225
8225
|
<span class="m">the old page listed only what was installed — 147 rows out of 71,695 — with no search, no tags and no way to see what a tap actually is</span>
|
|
8226
8226
|
</div>
|
|
8227
8227
|
</article>
|
|
8228
|
+
|
|
8229
|
+
<article class="cap rcard" id="completions-install-could-eat-your-rc-file">
|
|
8230
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Bug</span></div>
|
|
8231
|
+
<h3><code>completions --install</code> could delete the config between its own markers</h3>
|
|
8232
|
+
<p>Found by asking a plain question — <em>is <code>boost completions</code>
|
|
8233
|
+
idempotent?</em> — and testing the answer rather than reading the docstring. For
|
|
8234
|
+
every ordinary input it is: seven paths reach a fixed point on the second run,
|
|
8235
|
+
and the managed block is replaced in place rather than appended. Three states
|
|
8236
|
+
were not ordinary, and each is reachable from one hand-edit of a shell rc file.
|
|
8237
|
+
|
|
8238
|
+
<b>A start marker with no end deleted user config.</b> <code>_merge_rc</code>
|
|
8239
|
+
paired the first start marker with the next end marker found <em>anywhere</em>
|
|
8240
|
+
after it. With an orphan start above real config, run one appended a second
|
|
8241
|
+
block, and run two matched the orphan start against that new block's end and
|
|
8242
|
+
removed everything in between — the user's own lines — while printing
|
|
8243
|
+
<code>✓ wired boost completions into ~/.zshrc</code>. It converged, to a file
|
|
8244
|
+
with the user's aliases gone.
|
|
8245
|
+
|
|
8246
|
+
<b>The inverse function already refused this exact input</b>, ten lines below:
|
|
8247
|
+
<code>_strip_rc</code> carried the comment <em>"no end marker: malformed, leave
|
|
8248
|
+
the file untouched."</em> So the state was recognised and only the writer failed
|
|
8249
|
+
to handle it. That asymmetry is the whole bug, and it is why this was worth
|
|
8250
|
+
fixing rather than filing: the reasoning was already in the file.
|
|
8251
|
+
|
|
8252
|
+
<b>Uninstall had the same hole from the mirror precondition.</b>
|
|
8253
|
+
<code>_strip_rc</code> was safe only while the orphan start was the sole marker.
|
|
8254
|
+
Put a well-formed block below it and uninstall paired the orphan with that
|
|
8255
|
+
block's end: an rc file of <code>export A=1</code> plus four user lines came
|
|
8256
|
+
back as <code>export A=1</code> alone.
|
|
8257
|
+
|
|
8258
|
+
<b>Two blocks made uninstall lie.</b> It removed the first and left the second,
|
|
8259
|
+
so boost reported <em>removed</em> while the shell went on sourcing
|
|
8260
|
+
completions — the same shape as the <code>sync</code> defect in
|
|
8261
|
+
<code>#515</code>, a command reporting success for work it declined to do.
|
|
8262
|
+
|
|
8263
|
+
<b>The fix is one scan with the right invariant:</b> a block must close before
|
|
8264
|
+
the next one opens. Testing only for a missing end marker is the original bug in
|
|
8265
|
+
a new place, which the first draft of this fix reproduced and a test caught.
|
|
8266
|
+
Install now collapses to exactly one block, uninstall removes every block, and
|
|
8267
|
+
both refuse an unclosed one by name instead of guessing. An orphan
|
|
8268
|
+
<em>end</em> marker stays harmless and is pinned as such, so a later
|
|
8269
|
+
"tighten the parser" change cannot start rejecting a file that works.
|
|
8270
|
+
|
|
8271
|
+
<b><code>--dry-run</code> makes it answerable before it is written.</b>
|
|
8272
|
+
<code>boost completions --install --dry-run</code> prints the exact +/- lines
|
|
8273
|
+
and touches nothing, and it raises on the malformed file too — a validation that
|
|
8274
|
+
only reports the safe cases is not a validation. Plan and apply are one code
|
|
8275
|
+
path (<code>plan_install</code> → <code>apply</code>), so the preview cannot
|
|
8276
|
+
disagree with the write, and a test pins that equality. Applying a no-op change
|
|
8277
|
+
now also leaves the file's mtime alone rather than rewriting identical bytes.
|
|
8278
|
+
|
|
8279
|
+
<b>Verified exhaustively, not just by example.</b> A property test enumerates
|
|
8280
|
+
every arrangement of up to four fragments — user line, stray start, stray end,
|
|
8281
|
+
real block — and asserts three invariants over all 672 orderings: a user line
|
|
8282
|
+
boost does not own is never lost, a successful uninstall never leaves a block,
|
|
8283
|
+
and a refusal never modifies the file. Against the pre-fix code the same test
|
|
8284
|
+
reports <b>220 violations</b> (198 of the second, 22 of the first); against the
|
|
8285
|
+
fix, zero. It runs in 0.38s.
|
|
8286
|
+
|
|
8287
|
+
That sweep also corrected its own first draft. Its initial invariant counted
|
|
8288
|
+
every user line, and flagged 16 "failures" that were the managed block behaving
|
|
8289
|
+
exactly as conda, nvm and rbenv do — content between the markers is boost's to
|
|
8290
|
+
replace. The real invariant is about lines boost does <em>not</em> own, and the
|
|
8291
|
+
reference parser has to resolve the orphan-start ambiguity the way the fix does
|
|
8292
|
+
rather than the way the bug did, or it under-reports the data loss it exists to
|
|
8293
|
+
catch.
|
|
8294
|
+
|
|
8295
|
+
An rc file is the user's own hand-written config and the worst file boost owns
|
|
8296
|
+
an edit to, which is what moves this from tidy-up to High impact. The old tests
|
|
8297
|
+
covered only the well-formed path — a double install leaving one marker — so
|
|
8298
|
+
none of the three states had a failing test to find them.</p>
|
|
8299
|
+
<div class="meta">
|
|
8300
|
+
<span class="m">Complexity <b>S</b></span>
|
|
8301
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
8302
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
8303
|
+
<span class="m">two runs of a "no-op" command deleted the lines between two markers</span>
|
|
8304
|
+
</div>
|
|
8305
|
+
</article>
|
|
8228
8306
|
<!-- /ROADMAP:cards -->
|
|
8229
8307
|
|
|
8230
8308
|
</div>
|
|
@@ -337,10 +337,19 @@ class TestInstallUninstall:
|
|
|
337
337
|
# A start marker with no matching end marker means someone hand-edited
|
|
338
338
|
# the file after boost wrote it — guessing at intent here would risk
|
|
339
339
|
# eating content that was never boost's to remove.
|
|
340
|
+
#
|
|
341
|
+
# The file is still untouched; what changed is that boost now *says so*
|
|
342
|
+
# instead of exiting 0 as though it had done the job. Silently doing
|
|
343
|
+
# nothing was only safe while the orphan start was the sole marker: with
|
|
344
|
+
# a well-formed block below it, the old scan paired the orphan with that
|
|
345
|
+
# block's end and deleted everything between. See
|
|
346
|
+
# tests/unit/test_complete_rc_block.py for both preconditions.
|
|
347
|
+
from boost_cli.errors import BoostError
|
|
340
348
|
rc = sandbox / ".bashrc"
|
|
341
349
|
broken = "before\n# >>> boost completions >>>\nno end marker here\n"
|
|
342
350
|
rc.write_text(broken, encoding="utf-8")
|
|
343
|
-
|
|
351
|
+
with pytest.raises(BoostError):
|
|
352
|
+
complete.uninstall("bash")
|
|
344
353
|
assert rc.read_text(encoding="utf-8") == broken
|
|
345
354
|
|
|
346
355
|
|