boost-skill-cli 1.2.167__tar.gz → 1.2.169__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.2.167 → boost_skill_cli-1.2.169}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/pkg.py +67 -4
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/scopes.py +38 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/store.py +187 -5
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- boost_skill_cli-1.2.169/docs/demo.gif +0 -0
- boost_skill_cli-1.2.169/docs/roadmap/items/install-writes-through-a-redirected-dotdir-uninstall-will-not.md +46 -0
- boost_skill_cli-1.2.169/docs/roadmap/items/project-uninstall-deletes-any-in-repo-directory-the-lock-names.md +118 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap.html +47 -23
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_workspace_scope.py +136 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_store.py +456 -2
- boost_skill_cli-1.2.167/docs/demo.gif +0 -0
- boost_skill_cli-1.2.167/docs/roadmap/items/project-uninstall-deletes-any-in-repo-directory-the-lock-names.md +0 -36
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.gitattributes +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.gitignore +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/.vale.ini +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/DCO +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/LICENSE +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/Makefile +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/README.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/archive.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/cohort.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/compact.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/deps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/discovery.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/jsonstate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/prereq.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/report.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/typedvalue.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/codecov.yml +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/index.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a-correct-link-in-a-locked-dir-reads-as-refused.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a-new-shipped-card-always-404s-its-own-write-up-link.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a-refusal-and-its-remedy-never-wrapped.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/agent-dir-shapes-install-still-trips-on.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/an-item-materialized-nowhere-reads-ok-in-verify-health-drift.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-absorb-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-adapt-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-attest-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-audit-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-bmad-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-browse-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-bundle-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-catalog-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-changelog-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-chat-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-cohort-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-completions-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-config-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-context-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-create-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-deps-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-discover-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-doctor-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-drift-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-edit-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-evolve-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-explain-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-export-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-health-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-import-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-index-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-install-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-lint-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-log-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-mcp-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-onboard-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-outdated-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-policy-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-preview-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-profile-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-protocol-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-pulse-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-recommend-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-reindex-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-replay-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-root-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-run-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-schedule-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-search-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-simulate-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-sync-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-tag-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-tap-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-taps-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-test-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-trust-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-unpin-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-untap-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-update-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-verify-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/audit-who-findings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bare-boost-never-names-an-entry-point.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/because-that-was-not-the-reason.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bm25-empty-tokenization-kills-catalog-fallback.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-done-contract-ignores-the-track.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-gemini-gets-claude-hook-output.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-personas-delegate-outside-the-router.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-roster-drifted-from-bmad-6-12.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-route-ignores-autopilot-state.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-router-one-keyword-decides-the-track.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bmad-router-reads-each-prompt-alone.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cache-writers-that-still-crash-on-a-read-only-cache.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/canary-deps-check-skips-in-the-required-job.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-summary-reports-the-wrong-coverage-gate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/claude-md-instructs-the-wrong-licence-header.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/codex-hooks-timeout-units-are-unestablished.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/codex-is-not-an-mcp-host.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/compact-answers-a-named-tap-with-a-global-all-clear.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/concurrency-probe-measured-a-race-not-the-pool.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/config-json-edge-shapes-crash-or-disagree.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/corpus-refresh-updates-data-not-prose.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/corrupt-config-reads-as-ready-to-set-up.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/count-flags-that-silently-invert.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-kill-switch-has-no-reason-state.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-local-built-store-displaced-by-a-key.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-no-key-guard-is-unreachable.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-ready-but-embedder-cannot-run.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/doctor-prescribes-sync-that-deletes-live-links.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/err-colour-judged-by-stdout.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/err-multiline-hint-colours-across-the-newline.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-counted-by-the-method-the-repo-disavows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-duplication-is-intra-tap-not-mirrors.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-floor-calibration-stale-after-pin-refresh.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-gate-scores-a-body-less-corpus.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/exemplar-graded-golden-set-runs-in-no-gate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/explain-outline-has-no-cap.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/floors-job-never-installed-setuptools.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/free-threaded-canary-warns-about-nothing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gate-parity-test-ignores-k-and-golden.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gated-golden-set-has-zero-exemplars.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/hooks-list-drops-the-name-before-the-host.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/identifier-columns-shrink-to-a-name-no-command-accepts.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/import-budget-gate-passes-when-boost-cannot-import.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/info-deps-materialize-a-dir-they-then-reject.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-cannot-tell-a-skill-needs-another-one.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-paths-that-still-drop-the-result.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/is-dir-follows-a-symlink-at-eleven-rmtree-call-sites.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/keyed-no-store-hint-disagrees-with-shard-remedy.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lighthouse-flips-on-byte-identical-input.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/links-job-503s-its-own-write-up-links.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lock-kept-links-it-had-just-removed.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/manifest-in-prunes-only-the-root-copy.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-doctor-says-healthy-where-mcp-search-says-nothing-is-tapped.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-install-description-omits-antigravity.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-miss-reply-echoes-the-whole-query.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-registration-writes-outside-a-sandboxed-home.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-cost-overstated-on-keyless-machines.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-server-dies-on-a-valid-json-message-that-is-not-an-object.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-session-dies-on-a-deeply-nested-json-line.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-skip-list-absent-from-tool-descriptions.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-shard-balance-hints-are-a-release-behind.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-bad-agent-dir-silences-the-whole-doctor-report.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-failed-shard-job-drops-registries-from-the-manifest.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/panel-fits-data-to-an-assumed-80-in-a-pipe.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/project-scope-in-an-unmarked-tree-does-not-walk-up.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-drops-incompatible-shard-status.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-manifest-error-drops-hint-and-misnames-cause.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-rerun-retargets-tapped-registries.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-says-ready-exit-0-after-every-tap-failed.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/quickstart-shard-download-invisible-in-preview-and-run.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/read-only-boost-home-with-no-cache-dir.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/readme-81-command-table-lists-80-omits-quickstart.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/readme-hero-installs-a-name-no-starter-registry-ships.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reclone-leaves-a-clone-on-head-when-it-cannot-reach-the-pin.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/recommend-recomputes-its-columns-per-row.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/refresh-strands-the-natural-set-baseline.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reindex-reported-a-completeness-share-it-could-not-compute.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/release-guard-fails-open-when-it-cannot-read-tags.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/required-eval-gate-still-grades-by-name.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-boards-advertise-python-39.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rule-and-workflow-rows-carry-a-scope-nothing-but-list-local-reads.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sandbox-fixture-does-not-sandbox-the-working-directory.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-caps-the-two-copyable-identifiers.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-drops-symbol-language-queries-silently.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-footer-not-fitted-to-the-pane-its-rows-were-fitted-to.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-footer-overflows-40-col-pane-gate-passes-by-luck.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-relevance-meter-is-constant-on-default-page.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/search-rows-use-term-width-so-piping-drops-the-tap-column.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shard-weights-do-not-predict-the-job-timeout.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/shrink-the-published-index.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/stale-gate-sizes-in-readme-and-contributing.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/stale-tap-hint-dead-for-tap-only-installs.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/surface-dehyphenation-rationale-is-false.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sweep-died-at-a-page-not-at-launch.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-repairs-a-disabled-agents-row-every-run.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/table-fit-widths-floor-destroys-columns-and-still-overflows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/taps-vouches-for-a-clone-that-is-not-there.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/text-io-leaves-its-encoding-to-the-locale.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-install-path-hands-agy-claudes-mcp-argv.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-links-concurrency-cap-did-not-hold.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-model-back-off-mixes-two-clocks.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/the-windows-test-cap-is-five-minutes-from-the-measurement.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/tier3-ceiling-unreachable-at-default-n.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/typos-reported-as-boost-bugs.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/uninstall-local-cannot-remove-a-rule-or-workflow-list-local-shows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unreadable-tap-cache-healthy-doctor-crashing-heal.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unwritable-agent-dir-has-no-remedy.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/unwritable-rule-or-workflow-dir-crashes-install.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/util-rmtree-chmods-a-symlink-target-outside-the-tree.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/wrap-width-judged-by-stdout.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/writers-whose-bytes-are-compared-do-not-pin-their-newline.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/README.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/examples/README.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/index.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/noxfile.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/eval_tools.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/measure_near_duplicate_bound.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/setup.cfg +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/README.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/boost.css +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/boost.js +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/style/demo.html +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/eval/tool_calls.jsonl +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_bad_input_is_not_a_crash.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_bmad_personas_scope.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_hooks_codex.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_identifier_columns.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_json_reports.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_context_sees_an_unborn_branch.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_count_flags_reject_nonpositive.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_keyed_no_store_hint.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_recommend_because_is_true.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_repo_root_guard_covers_real_installs.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_reports_match_reality.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/data/bmad-skills-6.12.0.json +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_archive.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_bot_pr_dco.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_canary_deps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalog_distinct.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalog_keyword_words.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_claude_settings_codex.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_cli_update_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_cohort.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_corpus_prose.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_count_flags_use_positive_int.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_coverage_gate_prose.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_entry_vectors.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_model_unavailable.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dense_vector_dedupe.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_deps.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_discovery.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_distill_merge.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_doctor_output_polish.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_drift_hint.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_dry_run_parity.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed_outranking.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_corpus_bodies.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_query_sets.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_tools.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_eval_tools_probe.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_first_run_pointer.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_gstack_coexistence.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_help_contracts.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_hookhost_codex.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_jsonstate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_launcher_python_floor.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_lighthouse_budgets.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp_install_sandbox_home.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcp_read.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutation_weights_drift.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_near_duplicate_collapse.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_output_table_drop.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_output_table_whole.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_prereq.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_quickstart_readiness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_completeness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_extra_hint.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_read_text_arg.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_repo_root_guard.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_report.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sandbox_fixture_cwd.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_schedule_plist.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sdist_contents.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_carry_forward.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_ingest.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sync_lost_lock.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_text_io_names_its_encoding.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_typedvalue.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_upstream_path.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_visual_harness_capture.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.167 → boost_skill_cli-1.2.169}/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.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.169'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 169)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -832,10 +832,73 @@ def cmd_uninstall(argv: list[str]) -> int:
|
|
|
832
832
|
else "removed from"
|
|
833
833
|
out.ok("%s %s" % (verb, " · ".join(info["unlinked"])))
|
|
834
834
|
if is_project:
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
835
|
+
refused = info.get("refused") or []
|
|
836
|
+
escaped = info.get("escaped") or []
|
|
837
|
+
redirected = info.get("redirected") or []
|
|
838
|
+
at = _tilde(info.get("base", "this repo"))
|
|
839
|
+
# Only claim a removal that happened, and read it off what came
|
|
840
|
+
# off disk rather than off `unlinked`, which is the *agent* list:
|
|
841
|
+
# a lock row need not name an agent, and gating on the agent list
|
|
842
|
+
# told a user whose row was agentless that nothing had been
|
|
843
|
+
# removed while the directory was gone. An unconditional "removed
|
|
844
|
+
# from <repo>" over an empty removal is the green panel this
|
|
845
|
+
# change exists to stop the user trusting, and this is the same
|
|
846
|
+
# sentence in the other direction. The lock *entry* does go
|
|
847
|
+
# either way, so the summary panel still counts the skill.
|
|
848
|
+
if info.get("removed_count"):
|
|
849
|
+
# Where it actually went, not where a user-scope install
|
|
850
|
+
# would have put it — a project skill never touches the
|
|
851
|
+
# canonical store.
|
|
852
|
+
out.ok("removed from %s" % at)
|
|
853
|
+
elif refused or escaped or redirected:
|
|
854
|
+
out.warn("nothing removed from %s — every path the lock named "
|
|
855
|
+
"was left alone" % at, wrap=True)
|
|
856
|
+
# A lock row boost will not act on, named rather than swallowed:
|
|
857
|
+
# the row is in a committed file, so a user who sees nothing has
|
|
858
|
+
# no way to learn their lock was edited. Through `out.plain`
|
|
859
|
+
# because the row *is* the attacker-controlled input — a path
|
|
860
|
+
# carrying `\x1b[1A\x1b[2K` would erase the lines above it.
|
|
861
|
+
for row in refused:
|
|
862
|
+
out.warn("left alone: the lock names %s, which is not a path "
|
|
863
|
+
"boost removes here" % out.plain(row), wrap=True)
|
|
864
|
+
# Worded apart from the above on purpose: this row may well be a
|
|
865
|
+
# path an install writes, with the lie in the filesystem rather
|
|
866
|
+
# than in the string.
|
|
867
|
+
for row in escaped:
|
|
868
|
+
out.warn("left alone: the lock names %s, which resolves "
|
|
869
|
+
"outside this repo" % out.plain(row), wrap=True)
|
|
870
|
+
# And this one *is* a path an install writes — it is in the
|
|
871
|
+
# derived set by construction, which is why it must not borrow
|
|
872
|
+
# `refused`'s wording: that printed "not a path boost removes
|
|
873
|
+
# here" directly above a list containing the same string. The
|
|
874
|
+
# remedy is a real one, because `rm` follows the committed
|
|
875
|
+
# symlink exactly as the install did.
|
|
876
|
+
for row in redirected:
|
|
877
|
+
out.warn("left alone: the lock names %s, but a symlink inside "
|
|
878
|
+
"the repo redirects the path to it. boost will not "
|
|
879
|
+
"delete through a symlink it did not create; "
|
|
880
|
+
"`rm -rf %s/%s` removes it if it is yours."
|
|
881
|
+
% (out.plain(row), at, out.plain(row)), wrap=True)
|
|
882
|
+
if refused:
|
|
883
|
+
# The derived set, not a `<repo>/<dotdir>/skills/<name>`
|
|
884
|
+
# shape: the leaf comes from the agent's `dir`, so the shape
|
|
885
|
+
# told a user with a renamed skills dir that their path was
|
|
886
|
+
# not one an install writes — directly above a shape it
|
|
887
|
+
# matched. And worded as what boost *removes* rather than
|
|
888
|
+
# what an install *writes*, because the set keeps disabled
|
|
889
|
+
# agents on purpose and an install skips them.
|
|
890
|
+
#
|
|
891
|
+
# Gated on `refused` alone. A redirected row is in `expected`
|
|
892
|
+
# by construction, so printing this under one contradicts the
|
|
893
|
+
# line above it; its own message carries its own remedy.
|
|
894
|
+
expected = info.get("expected") or []
|
|
895
|
+
out.info(("boost only removes %s here. The lock entry is gone "
|
|
896
|
+
"from your working copy; the directory is not, so "
|
|
897
|
+
"remove it by hand if it is not yours."
|
|
898
|
+
% ", ".join(expected)) if expected else
|
|
899
|
+
("boost cannot derive where this skill installs, so "
|
|
900
|
+
"every row was left alone; remove the directories "
|
|
901
|
+
"by hand if they are yours"), wrap=True)
|
|
839
902
|
unregistered = info.get("mcp_unregistered") or []
|
|
840
903
|
if unregistered:
|
|
841
904
|
from ..core import mcpdecl
|
|
@@ -246,6 +246,44 @@ def resolve_in_base(base, rel: str) -> Path | None:
|
|
|
246
246
|
return candidate
|
|
247
247
|
|
|
248
248
|
|
|
249
|
+
def parent_matches_spelling(base, rel: str) -> bool:
|
|
250
|
+
"""True when walking to ``rel``'s parent is not redirected on the way.
|
|
251
|
+
|
|
252
|
+
The third question about a committed path, and the one the other two miss.
|
|
253
|
+
:func:`contains` resolves and answers "does this end up inside the repo?".
|
|
254
|
+
:func:`resolve_in_base` returns the path *unresolved*, so an identity check
|
|
255
|
+
can compare the strings an install writes. Between them sits a row that is
|
|
256
|
+
contained, and spelled exactly like a legal path, and still points
|
|
257
|
+
somewhere else: a committed ``<repo>/.claude/skills -> ../src`` makes the
|
|
258
|
+
row ``.claude/skills/<name>`` string-equal to the legal target while
|
|
259
|
+
denoting ``src/<name>``. The leaf is honest and an ancestor is not, so a
|
|
260
|
+
guard that only inspects the leaf walks straight through it and
|
|
261
|
+
``rmtree`` takes the victim.
|
|
262
|
+
|
|
263
|
+
So the parent is walked for real and compared against where the spelling
|
|
264
|
+
says it should be, anchored on the **real** base. ``realpath`` on both
|
|
265
|
+
sides, because a repo can sit *under* a symlink without containing one —
|
|
266
|
+
a checkout below ``/tmp`` on macOS, a home directory behind an automount,
|
|
267
|
+
a worktree reached through a convenience link. Resolve the walk and not
|
|
268
|
+
the base and every row of such a repo is compared real-against-nominal,
|
|
269
|
+
matches nothing, and is refused. The symlinked-base test builds that
|
|
270
|
+
link itself rather than relying on the runner's ``$TMPDIR``, which pytest
|
|
271
|
+
resolves before a test ever sees it.
|
|
272
|
+
|
|
273
|
+
The leaf itself is deliberately left unresolved. A materialization that
|
|
274
|
+
*is* a symlink is boost's own, and ``util.remove_path`` unlinks it without
|
|
275
|
+
following it — judging it by what it points at is the bug one layer down.
|
|
276
|
+
"""
|
|
277
|
+
if not rel or not isinstance(rel, str) or Path(rel).is_absolute():
|
|
278
|
+
return False
|
|
279
|
+
try:
|
|
280
|
+
anchor = Path(os.path.realpath(base))
|
|
281
|
+
return Path(os.path.realpath((Path(base) / rel).parent)) == (
|
|
282
|
+
anchor / rel).parent
|
|
283
|
+
except (OSError, ValueError):
|
|
284
|
+
return False
|
|
285
|
+
|
|
286
|
+
|
|
249
287
|
def contains(base, path) -> bool:
|
|
250
288
|
"""True when ``path`` sits inside ``base`` — the guard before any delete.
|
|
251
289
|
|
|
@@ -1327,12 +1327,106 @@ def _install_project_skill(entry: dict, force: bool = False,
|
|
|
1327
1327
|
return res
|
|
1328
1328
|
|
|
1329
1329
|
|
|
1330
|
+
def project_skill_targets(base, name: str) -> set[Path]:
|
|
1331
|
+
"""Every path a project install of ``name`` could legally have written.
|
|
1332
|
+
|
|
1333
|
+
:func:`_install_project_skill` writes exactly
|
|
1334
|
+
``<base>/<dotdir>/<skills dir>/<name>``, once per agent, so the legal set is
|
|
1335
|
+
small and *derivable* — which is the point. :func:`uninstall_project` reads
|
|
1336
|
+
its paths out of a committed lock file and so must decide "is this mine?"
|
|
1337
|
+
from the agent table rather than from the record being checked.
|
|
1338
|
+
|
|
1339
|
+
Built from :func:`agents.known_agents` filtered on ``project_scope``, and
|
|
1340
|
+
deliberately **not** on ``enabled``. An agent turned off after the install
|
|
1341
|
+
still has its directory in the repo, and a legal-set that forgot it would
|
|
1342
|
+
turn ``uninstall`` into a command that silently leaves real directories
|
|
1343
|
+
behind — trading a delete bug for an orphan bug. Disabling an agent stops
|
|
1344
|
+
boost writing there; it does not stop boost cleaning up what it wrote.
|
|
1345
|
+
|
|
1346
|
+
Derived from *this* machine's config, which has a cost worth stating: the
|
|
1347
|
+
project lock is committed and read on other people's machines, so any drift
|
|
1348
|
+
between the config that wrote a row and the config that reads it refuses a
|
|
1349
|
+
directory a real install wrote. An agent deleted from ``config.json``, one
|
|
1350
|
+
hand-added on a teammate's machine but not here, one whose ``dir`` was
|
|
1351
|
+
renamed since — all three leave the copy in the repo rather than removing
|
|
1352
|
+
it. That is deliberate and it is the fail-closed direction: the user is
|
|
1353
|
+
told which row was skipped *and* what boost removes here, so the drift is
|
|
1354
|
+
on screen and the directory can go by hand. The other way round, boost
|
|
1355
|
+
deletes a path it can no longer explain — and the alternative that would
|
|
1356
|
+
cover drift (checking the path's *shape* rather than deriving it) reads the
|
|
1357
|
+
dotdir back out of the lock, which is the attacker-controlled input this
|
|
1358
|
+
whole function exists not to trust.
|
|
1359
|
+
"""
|
|
1360
|
+
out: set[Path] = set()
|
|
1361
|
+
for agent, spec in agents.known_agents().items():
|
|
1362
|
+
if not spec.get("project_scope"):
|
|
1363
|
+
continue
|
|
1364
|
+
skills_dir = spec["dir"]
|
|
1365
|
+
try:
|
|
1366
|
+
out.add(scopes.skill_target(
|
|
1367
|
+
skills_dir, name, base=base,
|
|
1368
|
+
dotdir=agents.project_dotdir(agent, skills_dir)))
|
|
1369
|
+
except BoostError:
|
|
1370
|
+
# An unusable skill name is the *caller's* problem to report, not
|
|
1371
|
+
# a reason for the legal set to be wrong. Nothing matches it.
|
|
1372
|
+
return set()
|
|
1373
|
+
return out
|
|
1374
|
+
|
|
1375
|
+
|
|
1330
1376
|
def uninstall_project(name: str, base=None) -> dict:
|
|
1331
1377
|
"""Remove a project-scoped skill: its per-agent copies and its lock entry.
|
|
1332
1378
|
|
|
1333
|
-
Every recorded path is re-derived and checked
|
|
1334
|
-
|
|
1335
|
-
anyone with merge rights can edit, so a path out of it is
|
|
1379
|
+
Every recorded path is re-derived and checked against the set of paths an
|
|
1380
|
+
install could have produced (:func:`project_skill_targets`) — the lock is a
|
|
1381
|
+
committed file anyone with merge rights can edit, so a path out of it is
|
|
1382
|
+
input, not truth.
|
|
1383
|
+
|
|
1384
|
+
Containment inside the project was the whole guard and is not enough:
|
|
1385
|
+
``{"path": "src/core"}`` is inside the base, so it passed, and the repo's
|
|
1386
|
+
own source tree was removed under a command the user typed with boost
|
|
1387
|
+
having already said the path was safe. Being *inside the project* is the
|
|
1388
|
+
weaker property; being *a path this install writes* is the real one, and
|
|
1389
|
+
it is derivable.
|
|
1390
|
+
|
|
1391
|
+
Derivable, and then checked twice, because a path is a string and a place.
|
|
1392
|
+
The string must be in the derived set, and the walk to it must not be
|
|
1393
|
+
redirected by a committed symlink at an ancestor — ``.claude/skills -> src``
|
|
1394
|
+
makes the legal spelling denote ``src/<name>``, so a set-membership test
|
|
1395
|
+
alone passes it *by construction*. The first revision of this change
|
|
1396
|
+
shipped with exactly that open. :func:`scopes.parent_matches_spelling` is
|
|
1397
|
+
the second half.
|
|
1398
|
+
|
|
1399
|
+
Rows boost will not act on come back in three lists, because the remedy
|
|
1400
|
+
differs. ``refused`` is a contained row that is not one of the paths an
|
|
1401
|
+
uninstall removes here. ``escaped`` is one containment stopped outright —
|
|
1402
|
+
absolute, climbing out with ``..``, or sitting on a symlink that resolves
|
|
1403
|
+
out of the repo — which may well be a path an install writes, with the lie
|
|
1404
|
+
in the filesystem rather than in the string. ``redirected`` is the third
|
|
1405
|
+
and the quiet one: a row *in* the derived set whose walk is bent by a
|
|
1406
|
+
committed symlink at an ancestor. None is deleted and all three are
|
|
1407
|
+
reported; an escaped row used to be dropped in silence, and a redirected
|
|
1408
|
+
one used to be reported as ``refused``, which printed "not a path boost
|
|
1409
|
+
removes here" directly above a list containing that exact string.
|
|
1410
|
+
|
|
1411
|
+
A ``redirected`` row is also where install and uninstall disagree, and the
|
|
1412
|
+
disagreement is deliberate. ``_install_project_skill`` gates on
|
|
1413
|
+
:func:`scopes.ensure_in_base`, which is containment only, so
|
|
1414
|
+
``boost install --local`` writes straight through an in-repo
|
|
1415
|
+
``<repo>/.cursor -> config/cursor`` and records the row it spelled.
|
|
1416
|
+
Uninstall will not delete through that redirect, because a committed
|
|
1417
|
+
symlink is input: the benign layout and the attack
|
|
1418
|
+
(``.claude/skills -> ../src``) are byte-identical on disk, and no test
|
|
1419
|
+
distinguishes the intent behind them. Creating through a redirect is safe
|
|
1420
|
+
and destroying through one is not, so the asymmetry is the right way
|
|
1421
|
+
round — but it does leave boost's own copy behind, which the message says
|
|
1422
|
+
by path. Making install refuse too is its own card.
|
|
1423
|
+
|
|
1424
|
+
The lock entry goes in all four cases (see the ``refused`` note in the
|
|
1425
|
+
body), so the command still exits 0 on an all-refused run. That is also
|
|
1426
|
+
why a redirected row does not hold the entry open: an attacker commits a
|
|
1427
|
+
redirect as easily as a doctored path, so keeping it would be the same
|
|
1428
|
+
denial of service by another route. ``uninstall`` has no ``--json``, so
|
|
1429
|
+
the warning lines are the whole signal a caller gets.
|
|
1336
1430
|
"""
|
|
1337
1431
|
resolved_base = _resolve_base(scopes.SCOPE_PROJECT, base)
|
|
1338
1432
|
entry = projectlock.get_skill(resolved_base, name) if resolved_base else None
|
|
@@ -1340,8 +1434,64 @@ def uninstall_project(name: str, base=None) -> dict:
|
|
|
1340
1434
|
raise BoostError("%s is not installed in this project" % name,
|
|
1341
1435
|
hint="see what is with `boost list --local`")
|
|
1342
1436
|
removed: list[str] = []
|
|
1437
|
+
refused: list[str] = []
|
|
1438
|
+
redirected: list[str] = []
|
|
1439
|
+
escaped: list[str] = []
|
|
1440
|
+
gone = 0
|
|
1441
|
+
legal = project_skill_targets(resolved_base, name)
|
|
1343
1442
|
for m in entry.get("materializations") or []:
|
|
1443
|
+
row = str(m.get("path"))
|
|
1344
1444
|
path = scopes.resolve_in_base(resolved_base, m.get("path"))
|
|
1445
|
+
if path is None:
|
|
1446
|
+
# Empty, absolute, climbing out with `..` — or spelled legally and
|
|
1447
|
+
# sitting on a symlink that resolves out of the repo, which
|
|
1448
|
+
# `contains` catches because it resolves. Containment already
|
|
1449
|
+
# stopped the delete; what was missing is saying so. This was the
|
|
1450
|
+
# one doctored row that produced *no* output at all, under a
|
|
1451
|
+
# change whose whole argument is that a silent survival teaches
|
|
1452
|
+
# the user nothing. Kept apart from `refused` because the two need
|
|
1453
|
+
# different words: this row may well be a path an install writes,
|
|
1454
|
+
# with the lie in the filesystem rather than in the string.
|
|
1455
|
+
escaped.append(row)
|
|
1456
|
+
continue
|
|
1457
|
+
# Identity, in two parts, because a path is a string *and* a place.
|
|
1458
|
+
#
|
|
1459
|
+
# The string must be one an install writes, compared **unresolved**,
|
|
1460
|
+
# and that is load-bearing rather than incidental: resolving both
|
|
1461
|
+
# sides reopens the hole this function closes. The legal path is
|
|
1462
|
+
# itself a repo path, so a commit can make `.claude/skills/<name>` a
|
|
1463
|
+
# *symlink* to `src/core` and file a row of `src/core`; both sides
|
|
1464
|
+
# then resolve to `<base>/src/core`, the row is accepted, and the
|
|
1465
|
+
# source tree is deleted again. Resolving is strictly weaker in the
|
|
1466
|
+
# benign direction too — a user's own `<repo>/my-link ->
|
|
1467
|
+
# .claude/skills/<name>` starts matching, and boost unlinks an alias
|
|
1468
|
+
# it never created.
|
|
1469
|
+
#
|
|
1470
|
+
# And the walk to it must not be redirected, which comparing strings
|
|
1471
|
+
# cannot tell on its own. `<repo>/.claude/skills` committed as a
|
|
1472
|
+
# symlink to `src` leaves the row `.claude/skills/<name>` *equal to
|
|
1473
|
+
# the legal path by construction* while denoting `src/<name>`:
|
|
1474
|
+
# `is_dir()` follows the ancestor happily and `rmtree` takes the
|
|
1475
|
+
# victim, which is this card's bug one component up. The leaf is
|
|
1476
|
+
# honest and the ancestor is not, so the leaf-only check sees nothing.
|
|
1477
|
+
# `scopes.parent_matches_spelling` walks the parent for real.
|
|
1478
|
+
#
|
|
1479
|
+
# Pinned by `test_a_legal_path_symlinked_at_an_in_repo_target_stays_a_
|
|
1480
|
+
# string`, `test_a_users_own_symlink_to_the_skill_dir_is_refused` and
|
|
1481
|
+
# `test_a_symlinked_skills_dir_does_not_redirect_the_delete`.
|
|
1482
|
+
#
|
|
1483
|
+
# The two halves fail differently and are reported differently. A row
|
|
1484
|
+
# outside the derived set is not a path an uninstall writes here. A row
|
|
1485
|
+
# *in* the set whose walk is redirected is the opposite — it is in
|
|
1486
|
+
# `expected` by construction, so folding it into `refused` printed "not
|
|
1487
|
+
# a path boost removes here" directly above a list containing that
|
|
1488
|
+
# exact string.
|
|
1489
|
+
if path not in legal:
|
|
1490
|
+
refused.append(row)
|
|
1491
|
+
continue
|
|
1492
|
+
if not scopes.parent_matches_spelling(resolved_base, row):
|
|
1493
|
+
redirected.append(row)
|
|
1494
|
+
continue
|
|
1345
1495
|
# `resolve_in_base` checks containment against the *resolved* path but
|
|
1346
1496
|
# returns the unresolved one, so a materialization recorded as a
|
|
1347
1497
|
# symlink arrives here as a symlink. A link out of the project was
|
|
@@ -1357,10 +1507,18 @@ def uninstall_project(name: str, base=None) -> dict:
|
|
|
1357
1507
|
# link rather than through it — must not decide it by accident. A link
|
|
1358
1508
|
# is still removed whatever it points at, because the link is boost's
|
|
1359
1509
|
# and unlinking it leaves the target untouched.
|
|
1360
|
-
if
|
|
1361
|
-
continue #
|
|
1510
|
+
if not (path.is_symlink() or path.is_dir()):
|
|
1511
|
+
continue # absent, or a plain file we did not create
|
|
1362
1512
|
if not util.remove_path(path):
|
|
1363
1513
|
continue # vanished between the check and the call
|
|
1514
|
+
gone += 1
|
|
1515
|
+
# `removed` is the *agent* list, and a lock row need not name one. The
|
|
1516
|
+
# delete above is not gated on `agent` and must not be: an agentless
|
|
1517
|
+
# row at a legal path is still the skill's own directory. So the count
|
|
1518
|
+
# of what came off disk is tracked separately — gating the caller's
|
|
1519
|
+
# "removed from <repo>" line on the agent list told a user whose lock
|
|
1520
|
+
# had an agentless row that nothing had been removed, while the
|
|
1521
|
+
# directory was gone.
|
|
1364
1522
|
if m.get("agent"):
|
|
1365
1523
|
removed.append(m["agent"])
|
|
1366
1524
|
projectlock.remove_skill(resolved_base, name)
|
|
@@ -1371,6 +1529,30 @@ def uninstall_project(name: str, base=None) -> dict:
|
|
|
1371
1529
|
unregistered = unregister_project_mcp(resolved_base, name)
|
|
1372
1530
|
journal.log("uninstall", name, scope=scopes.SCOPE_PROJECT)
|
|
1373
1531
|
return {"name": name, "unlinked": removed, "entry": entry,
|
|
1532
|
+
# How many paths actually came off disk, which `unlinked` does not
|
|
1533
|
+
# answer — see the `gone` note in the body.
|
|
1534
|
+
"removed_count": gone,
|
|
1535
|
+
"refused": refused,
|
|
1536
|
+
# In the legal set, but an ancestor of the row is a symlink, so the
|
|
1537
|
+
# walk to it is redirected. Its own list because the remedy is the
|
|
1538
|
+
# opposite of `refused`'s: this *is* a path boost writes, and the
|
|
1539
|
+
# spelling the user is shown still removes it by hand, since `rm`
|
|
1540
|
+
# follows the ancestor the way the install did.
|
|
1541
|
+
"redirected": redirected,
|
|
1542
|
+
# Rows the containment check stopped. Separate from `refused`
|
|
1543
|
+
# because the remedy differs: a refused row is not a path an
|
|
1544
|
+
# install writes, where an escaped one may be exactly that with a
|
|
1545
|
+
# symlink under it that leaves the repo.
|
|
1546
|
+
"escaped": escaped,
|
|
1547
|
+
# What an install writes *here*. The refusal message used to spell
|
|
1548
|
+
# the shape out as `<repo>/<agent dotdir>/skills/<name>`, which
|
|
1549
|
+
# hardcodes a leaf that comes from `spec["dir"]` — so for a renamed
|
|
1550
|
+
# skills dir it told the user their path was "not a path a project
|
|
1551
|
+
# install writes" directly above a shape that path matched. Naming
|
|
1552
|
+
# the derived set instead is true under any config, and it is what
|
|
1553
|
+
# puts config drift on screen.
|
|
1554
|
+
"expected": sorted(scopes.relative_to_base(resolved_base, p)
|
|
1555
|
+
for p in legal),
|
|
1374
1556
|
"mcp_unregistered": unregistered, "kind": "skill",
|
|
1375
1557
|
"scope": scopes.SCOPE_PROJECT, "base": str(resolved_base)}
|
|
1376
1558
|
|
|
@@ -474,6 +474,7 @@ docs/roadmap/items/install-path-disambiguation.md
|
|
|
474
474
|
docs/roadmap/items/install-paths-that-still-drop-the-result.md
|
|
475
475
|
docs/roadmap/items/install-resolves-skill-dependencies.md
|
|
476
476
|
docs/roadmap/items/install-scope-user-or-project.md
|
|
477
|
+
docs/roadmap/items/install-writes-through-a-redirected-dotdir-uninstall-will-not.md
|
|
477
478
|
docs/roadmap/items/installed-skill-trust-audit.md
|
|
478
479
|
docs/roadmap/items/integrity-verification-boost-verify.md
|
|
479
480
|
docs/roadmap/items/internal-architecture-diagrams.md
|
|
Binary file
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: install-writes-through-a-redirected-dotdir-uninstall-will-not
|
|
3
|
+
board: code
|
|
4
|
+
section: trust
|
|
5
|
+
status: planned
|
|
6
|
+
category: Core · Security
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Low
|
|
9
|
+
wow: 2
|
|
10
|
+
note: install gates on containment and writes through an in-repo symlinked dotdir; uninstall refuses to delete through one, so the copy is orphaned
|
|
11
|
+
order: 357
|
|
12
|
+
title: "<code>install --local</code> writes through a redirected dotdir that <code>uninstall --local</code> will not remove"
|
|
13
|
+
---
|
|
14
|
+
A repo that commits <code><repo>/.cursor → config/cursor</code> — an ordinary
|
|
15
|
+
dotfile layout, not an attack — gets two different answers from the two halves of the same
|
|
16
|
+
command. <code>_install_project_skill</code> gates its target with
|
|
17
|
+
<code>scopes.ensure_in_base</code>, which is containment only, so <code>boost install --local</code>
|
|
18
|
+
writes <code>config/cursor/skills/<name></code> and records the row it spelled,
|
|
19
|
+
<code>.cursor/skills/<name></code>. <code>boost uninstall --local</code> then refuses that row,
|
|
20
|
+
because <code>scopes.parent_matches_spelling</code> walks the parent for real and finds the
|
|
21
|
+
redirect. Boost's own copy is left on disk and the lock entry goes anyway, so a second uninstall
|
|
22
|
+
answers <em>not installed in this project</em>.
|
|
23
|
+
|
|
24
|
+
Reproduced on the commit that introduced the guard: install wrote through the symlink, uninstall
|
|
25
|
+
reported the row as <code>redirected</code>, and the directory survived.
|
|
26
|
+
|
|
27
|
+
<b>The uninstall side is right and is not the thing to change.</b> The benign layout and the attack
|
|
28
|
+
are byte-identical on disk: <code>.claude/skills → ../src</code> with a legally-spelled lock row
|
|
29
|
+
is the same two objects in the same two places, and nothing in the filesystem carries the intent
|
|
30
|
+
behind them. Creating through a redirect is safe; destroying through one hands an attacker with
|
|
31
|
+
merge rights an <code>rmtree</code> aimed wherever the symlink points. So the asymmetry stays, and
|
|
32
|
+
<code>uninstall</code> now names the row, says a symlink redirects it, and prints an
|
|
33
|
+
<code>rm -rf</code> that works — because <code>rm</code> follows the ancestor exactly as the
|
|
34
|
+
install did (shipped in #1016).
|
|
35
|
+
|
|
36
|
+
What is left is the other half: <b>install should not write somewhere uninstall cannot reach.</b>
|
|
37
|
+
The options are not equivalent and the choice needs measuring rather than guessing — refuse
|
|
38
|
+
the install outright (safe, breaks a layout that works today); record the <em>resolved</em> path in
|
|
39
|
+
the lock so uninstall's walk agrees (keeps the layout, but the lock then carries a path the repo
|
|
40
|
+
never spells, and a teammate whose clone resolves differently gets a row that matches nothing); or
|
|
41
|
+
record both and match on either (most forgiving, widest attack surface to re-audit). Whichever
|
|
42
|
+
lands, <code>boost doctor</code> should report a project whose lock rows no longer resolve to where
|
|
43
|
+
the install put them, since today nothing notices until an uninstall leaves a directory behind.
|
|
44
|
+
|
|
45
|
+
Related: <code>project-uninstall-deletes-any-in-repo-directory-the-lock-names</code>, which added
|
|
46
|
+
the walk and the <code>redirected</code> reporting this card inherits.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: project-uninstall-deletes-any-in-repo-directory-the-lock-names
|
|
3
|
+
board: code
|
|
4
|
+
section: trust
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Core · Security
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: a materialization path of src/core passes the containment check and is removed
|
|
11
|
+
order: 356
|
|
12
|
+
owner: loop/uninstall-local-dotdir-guard
|
|
13
|
+
pr: 1016
|
|
14
|
+
title: "<code>uninstall --local</code> deletes any in-repo directory the committed lock names"
|
|
15
|
+
---
|
|
16
|
+
<code>store.uninstall_project</code> re-derives every recorded materialization through
|
|
17
|
+
<code>scopes.resolve_in_base</code> and refuses anything outside the project · the guard
|
|
18
|
+
works, and the verification of PR #998 confirmed a planted victim outside the repo survives every
|
|
19
|
+
escape attempt. What it does not check is that the path is an <em>agent skills directory</em>. A
|
|
20
|
+
lock row reading <code>{"path": "src/core"}</code> is inside the base, so it passes, and
|
|
21
|
+
<code>util.rmtree</code> removes the repo's source tree (store.py:1296-1300).
|
|
22
|
+
|
|
23
|
+
<code>.boost/skill-lock.json</code> is a committed file: whoever can land a commit can write that
|
|
24
|
+
row, and the victim runs one ordinary <code>boost uninstall <skill> --local</code>. That is a
|
|
25
|
+
narrower threat than it sounds — someone who can commit to your repo can also commit a
|
|
26
|
+
<code>Makefile</code> — but this is the one path where the damage happens under a boost
|
|
27
|
+
command the user typed, with boost's own containment check having already said yes.
|
|
28
|
+
|
|
29
|
+
<b>Shipped.</b> <code>store.project_skill_targets(base, name)</code> derives the whole legal set
|
|
30
|
+
— <code>_install_project_skill</code> writes
|
|
31
|
+
<code><base>/<dotdir>/<skills dir>/<name></code> and nothing else —
|
|
32
|
+
and <code>uninstall_project</code> now asks "is this a path an install writes?" rather than only
|
|
33
|
+
"is this inside the repo?". A row that is not in the set is returned in <code>refused</code> and
|
|
34
|
+
left on disk; <code>boost uninstall --local</code> names it <em>and prints the derived set
|
|
35
|
+
beside it</em>, because the row is in a committed file and a silent survival teaches the user
|
|
36
|
+
nothing. Printing the set rather than a <code><repo>/<agent
|
|
37
|
+
dotdir>/skills/<name></code> shape matters: the leaf comes from the agent's
|
|
38
|
+
<code>dir</code>, so for a renamed skills dir the old wording told the user their path was not
|
|
39
|
+
one an install writes directly above a shape that path matched.
|
|
40
|
+
|
|
41
|
+
<b>Two decisions the obvious fix gets wrong.</b> The set is built from
|
|
42
|
+
<code>known_agents()</code> filtered on <code>project_scope</code> and deliberately <em>not</em>
|
|
43
|
+
on <code>enabled</code>: an agent switched off after the install still has its copy in the repo,
|
|
44
|
+
and a legal set that forgot it would trade this delete bug for an orphan bug in the command whose
|
|
45
|
+
job is to clean up. And the lock entry is removed even when a row is refused — otherwise the
|
|
46
|
+
one doctored row pins the entry forever and the skill can never be uninstalled.
|
|
47
|
+
|
|
48
|
+
<b>The leaf name is part of the identity, and so is comparing strings.</b> Matching "under an
|
|
49
|
+
agent dotdir" would let <code>.claude/skills/<other skill></code> through, so <code>boost
|
|
50
|
+
uninstall --local a</code> would take <code>b</code> with it. The comparison is against the exact
|
|
51
|
+
path, <em>unresolved</em>, and that half is load-bearing too: the legal path is a repo path, so a
|
|
52
|
+
commit can make <code>.claude/skills/<name></code> a symlink to <code>src/core</code> and
|
|
53
|
+
file a row of <code>src/core</code>. Resolve both sides and they meet at the victim — the
|
|
54
|
+
whole bug, re-entered through the comparison instead of the containment check.
|
|
55
|
+
|
|
56
|
+
<b>A path is a string <em>and</em> a place, and the first revision only checked the string.</b>
|
|
57
|
+
Set membership is equal <em>by construction</em> when the row is spelled as the legal path, so a
|
|
58
|
+
committed <code><repo>/.claude/skills → src</code> left the row
|
|
59
|
+
<code>.claude/skills/<name></code> passing every check while denoting
|
|
60
|
+
<code>src/<name></code>: <code>is_dir()</code> follows the ancestor, <code>rmtree</code>
|
|
61
|
+
takes the victim, and the probe printed <code>refused=[]</code>. The leaf is honest and the
|
|
62
|
+
ancestor is not, which is precisely what a leaf-only guard cannot see — this card's own bug,
|
|
63
|
+
one component up, shipped open in the first revision and found by the verification pass.
|
|
64
|
+
<code>scopes.parent_matches_spelling</code> walks the parent for real and compares it against
|
|
65
|
+
where the spelling says it should be, anchored on <code>realpath(base)</code>. Both sides real: a
|
|
66
|
+
repo can sit <em>under</em> a symlink without containing one — a checkout below
|
|
67
|
+
<code>/tmp</code>, a home behind an automount, a worktree reached through a convenience link
|
|
68
|
+
— and resolving the walk but not the base compares real against nominal, matches nothing,
|
|
69
|
+
and refuses every row of that repo. Its test builds the link itself rather than leaning on the
|
|
70
|
+
runner's <code>$TMPDIR</code>, which pytest resolves before a test sees it; an earlier draft of
|
|
71
|
+
this paragraph claimed the opposite, and re-measuring the table is what caught it.
|
|
72
|
+
|
|
73
|
+
<b>Three refusal lists, because they need different words.</b> <code>refused</code> is a
|
|
74
|
+
contained row that is not a path an uninstall removes here; <code>escaped</code> is one
|
|
75
|
+
containment stopped outright, which may well be a path an install writes with the lie in the
|
|
76
|
+
filesystem rather than the string; <code>redirected</code> is a row <em>in</em> the derived set
|
|
77
|
+
whose walk a committed symlink bends. An escaped row used to fall through every branch to a bare
|
|
78
|
+
<code>continue</code> — no deletion, and no output either, so the most hostile row in the
|
|
79
|
+
set was the one that left no trace. A redirected row is worse than silent: folded into
|
|
80
|
+
<code>refused</code> it printed "not a path boost removes here" three lines above a list
|
|
81
|
+
containing that exact string, because it is in that list <em>by construction</em>. It now says a
|
|
82
|
+
symlink redirects the path and prints an <code>rm -rf</code> that works, since <code>rm</code>
|
|
83
|
+
follows the ancestor the way the install did.
|
|
84
|
+
|
|
85
|
+
<b>And that row is where install and uninstall disagree, deliberately.</b>
|
|
86
|
+
<code>_install_project_skill</code> gates on <code>scopes.ensure_in_base</code> —
|
|
87
|
+
containment only — so <code>install --local</code> writes straight through a committed
|
|
88
|
+
<code><repo>/.cursor → config/cursor</code>, and uninstall then will not delete through
|
|
89
|
+
it, leaving boost's own copy behind. The benign layout and the attack are byte-identical on disk,
|
|
90
|
+
so nothing distinguishes the intent: creating through a redirect is safe and destroying through
|
|
91
|
+
one is not, and that is the right way round. Fixing the install side is
|
|
92
|
+
<code>install-writes-through-a-redirected-dotdir-uninstall-will-not</code>. The two tests that
|
|
93
|
+
set that layout up are skipped on Windows, where <code>install</code> cannot stage a copy
|
|
94
|
+
through a relative directory symlink at all — the guard is still covered there by the two
|
|
95
|
+
ancestor tests, which symlink after the install rather than before it. And the success line is now gated on a count of what actually came off disk, not on
|
|
96
|
+
<code>unlinked</code>: an all-refused uninstall printed "removed from <repo>" over an empty
|
|
97
|
+
removal, which is the green panel this whole change exists to stop the user trusting — and
|
|
98
|
+
gating it on the <em>agent</em> list then told the same lie backwards, since a lock row need not
|
|
99
|
+
name an agent and the delete is not gated on one. It still exits 0, because the lock entry does
|
|
100
|
+
go; <code>uninstall</code> has no <code>--json</code>, so the warning lines are the whole signal a
|
|
101
|
+
scripted caller gets.
|
|
102
|
+
|
|
103
|
+
<b>The cost, stated.</b> The legal set comes from <em>this</em> machine's agent table while the
|
|
104
|
+
lock is committed and read on others, so config drift refuses a directory a real install wrote:
|
|
105
|
+
an agent hand-added on a teammate's machine, or one whose <code>dir</code> was renamed since. The
|
|
106
|
+
copy stays in the repo and the lock entry goes, so the user is told by path and has to remove it
|
|
107
|
+
by hand. That is deliberate. The alternative that would cover drift — checking the path's
|
|
108
|
+
<em>shape</em> rather than deriving it — reads the dotdir back out of the lock, which is the
|
|
109
|
+
attacker-controlled input the guard exists not to trust.
|
|
110
|
+
|
|
111
|
+
Related: <code>util-rmtree-chmods-a-symlink-target-outside-the-tree</code>, and
|
|
112
|
+
<code>is-dir-follows-a-symlink-at-eleven-rmtree-call-sites</code>, which brought
|
|
113
|
+
<code>util.remove_path</code> in. Its
|
|
114
|
+
<code>test_a_materialization_naming_a_plain_file_is_left_alone</code> deferred the wider "what may
|
|
115
|
+
a lock row name?" question by name, and this change had quietly made that test vacuous — it
|
|
116
|
+
pointed at <code>pyproject.toml</code>, which the new identity check refuses two guards before the
|
|
117
|
+
type check it exists to pin. It now names a legal path holding a plain file, so the guard is what
|
|
118
|
+
saves the file again.
|