boost-skill-cli 1.2.89__tar.gz → 1.2.90__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.89/boost_skill_cli.egg-info → boost_skill_cli-1.2.90}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/hooks.py +5 -2
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/intelligence.py +16 -6
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/quality.py +6 -3
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/team.py +20 -8
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/claude_settings.py +29 -12
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/config.py +33 -16
- boost_skill_cli-1.2.90/boost_cli/core/jsonstate.py +76 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/registry.py +12 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/DEBUGGING.md +36 -0
- boost_skill_cli-1.2.90/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-corrupt-settings-config-state-json-silently-read-as-empty-th.md +7 -3
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-drift-findings.md +4 -4
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap.html +9 -4
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_hooks.py +26 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_quality.py +14 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_team.py +23 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_claude_settings.py +37 -1
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_config.py +51 -0
- boost_skill_cli-1.2.90/tests/unit/test_drift_hint.py +55 -0
- boost_skill_cli-1.2.90/tests/unit/test_jsonstate.py +100 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry.py +28 -0
- boost_skill_cli-1.2.89/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.gitattributes +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.gitignore +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale/styles/boost/AIWriting.yml +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/.vale.ini +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/DCO +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/GOVERNANCE.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/LICENSE +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/MAINTAINERS.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/Makefile +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/README.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/SUPPORT.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/quickstart.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/aihost.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/hookhost.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/typedvalue.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/codecov.yml +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/bmad.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/code-review.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/commit-audit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/dependencies.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/index.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/openssf-badge.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/BOOST-D27.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ai-backend-fanout.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-absorb-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-adapt-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-adapt-renders-every-sibling-of-a-flat-agents-dir-workflow-as.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-adapt-run-stats-edit-tag-export-reject-the-tap-name-qualifie.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-ai-degrade-note-blames-path-api-keys-regardless-of-cause-sev.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-attest-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-audit-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-bmad-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-browse-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-bundle-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-catalog-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-catalog-resolve-one-s-duplicate-name-hint-advertises-path-to.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-changelog-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-chat-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-clean-counts-failed-removals-as-cleaned-journals-the-inflate.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-cli-py-commands-summaries-and-parser-help-contradict-behavio.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-cohort-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-completions-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-config-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-config-policy-set-store-type-unchecked-values-consumers-cras.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-context-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-create-distill-infer-absorb-install-silently-replace-an-inst.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-create-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-declined-confirms-never-name-y-boost-assume-yes-snapshot-cle.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-deps-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-discover-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-distill-s-heuristic-merge-drops-repeated-fences-braces-writi.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-doctor-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-dry-runs-disagree-with-the-real-run-compact-counts-bytes-it.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-edit-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-evolve-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-explain-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-export-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-export-o-cohort-create-and-profile-save-silently-overwrite-e.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-fingerprint-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-five-exit-70-crashes-on-bad-paths-data-catalog-export-serve.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-focus-profile-sideline-by-unlinking-without-recording-it-lis.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-git-operations-never-set-git-terminal-prompt-0-so-a-404-priv.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-health-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-hooks-remove-n-cannot-find-hooks-boost-itself-added-unknown.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-import-all-skips-the-injection-secret-scans-and-the-per-skil.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-import-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-index-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-info-stats-explain-render-a-different-smaller-shape-for-rule.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-install-dry-run-promises-agents-the-real-install-never-write.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-install-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-install-local-writes-empties-the-repo-s-mcp-json-silently-of.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-json-accepted-but-ignored-on-many-branches-cohort-config-pol.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-lint-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-log-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-log-simulate-changelog-headings-echo-the-raw-qualified-argum.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-mcp-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-mcp-register-s-boost-first-consent-names-only-the-registered.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-missing-json-on-doctor-test-health-changelog-trending-log-ho.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-name-miss-errors-unknown-tap-qualifier-unnamed-no-close-matc.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-onboard-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-out-table-clips-data-columns-to-an-assumed-80-columns-when-s.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-out-warn-defaults-to-stdout-infer-absorb-corrupt-skill-md-se.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-outdated-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-output-wrap-tokens-splits-punctuation-off-backtick-spans-ins.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-pinned-taps-silently-moved-to-head-by-update-re-clone-and-co.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-policy-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-preview-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-profile-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-project-scope-seams-uninstall-verify-list-info-reinstall-dis.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-protocol-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-pulse-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-quarantine-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-quarantine-pin-state-invisible-list-info-doctor-report-links.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-quickstart-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-recommend-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-reindex-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-reinstall-sync-repair-and-audit-resolve-by-name-tap-ignoring.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-replay-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-root-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-rules-workflows-reported-as-skills-uninstall-claims-a-store.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-run-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-schedule-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-search-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-simulate-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-singular-plural-misses-1-skills-1-issue-need-1-skill-pass-ac.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-six-count-flags-tap-chat-absorb-lint-changelog-hooks-skip-ut.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-skill-profile-name-slugging-is-inconsistent-distill-o-accept.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-snapshot-restore-replaces-the-lock-wholesale-orphaning-newer.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-stale-prose-after-shipped-changes-catalog-export-live-discov.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-stray-positionals-and-inapplicable-flags-silently-ignored-ac.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-sweep-positionals-json-lack-help-strings-and-no-command-help.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-sync-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-tag-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-tap-dry-run-is-silently-ignored-outside-catalog-spec-and-def.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-tap-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-taps-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-taps-outdated-decay-policy-snapshot-json-emit-display-string.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-test-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-trust-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-trust-verify-labels-a-manifest-tampered-after-signing-by-a-t.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-unpin-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-untap-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-update-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-verify-drift-say-nothing-installed-exit-0-and-doctor-says-lo.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-verify-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-who-findings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bm25-has-no-stemming.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bmad-hooks-all-hosts.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/branch-current-gate.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/capability-policy-skips-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/catalog-categories-beyond-curated.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cli-audit-2026-08-full-sweep.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cli-command-audit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/concurrent-rag-builds-delete-each-others-temp-index.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/delay-true-defeats-the-log-suppress.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-reindex-has-no-progress-or-durability.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-reindex-reuses-whole-taps.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dense-store-holds-every-vector-once-per-copy.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-duplicate-skill-discovery.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-hooks-host-aware.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gemini-mcp-parity.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/gstack-tap-first-then-coexistence.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-cannot-read-a-skill-before-installing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mutation-shards-rerun-full-set-every-push.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/near-identical-copies-still-eat-the-slots.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-best-practices-badge.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-gold-ceiling.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-playbook.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/openssf-silver.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/osps-baseline-levels.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/publish-the-keyword-index.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/published-shards-have-no-consumer.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/readme-prune-and-search-guide.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/relicence-apache-2.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/reproducible-release-artifacts.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shard-refresh-skips-processed-commits.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shard-runs-reembed-everything-weekly.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/shrink-the-published-index.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/vex-openvex-feed.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/weekly-vectors-had-no-ingestion-path.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/security-design.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/semantic-search.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/verifying-releases.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/meta.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/openvex.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/gitleaks-secretscan-test-fixtures.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/quality-trust-fingerprint-not-sensitive.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/zizmor-adhoc-packages-lint-runners.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/vex/statements/zizmor-dangerous-triggers-workflow-run.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/README.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/examples/README.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/index.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/noxfile.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/add_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/build_vex.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_branch_current.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_dco.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_reproducible.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/eval_tools.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/measure_near_duplicate_bound.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/publish_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/scripts/shard_plan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/setup.cfg +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/README.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/boost.css +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/boost.js +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/style/demo.html +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/fixtures/claude_init_event.jsonl +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/eval/tool_calls.jsonl +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_bmad_all_hosts.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_hooks_gemini.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_pane_width.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_quickstart.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_tap_pins.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_aihost.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_bot_pr_dco.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_branch_current.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_dco.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_check_reproducible.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_cli_update_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_boilerplate_cluster.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_entry_reuse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_entry_vectors.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_progress.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dense_vector_dedupe.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_distill_merge.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_doctor_output_polish.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_tools.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_eval_tools_probe.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_gstack_coexistence.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_hook_settings_hosts.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_hookhost.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcp_read.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_near_duplicate_collapse.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_normalize_sdist.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_registry_parallel.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_retrieve_any_near_duplicates.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shard_plan.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards_incremental.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards_ingest.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_spdx_headers.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_tap_pins.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_typedvalue.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_version_tags.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_vex.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/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.90'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 90)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -129,12 +129,15 @@ def _add(args) -> int:
|
|
|
129
129
|
if event not in hookhost.events(host):
|
|
130
130
|
out.warn("'%s' is not a known %s hook event — adding anyway"
|
|
131
131
|
% (event, hookhost.event_label(host)))
|
|
132
|
-
cs.add_hook(scope, event, args.name, args.command,
|
|
133
|
-
|
|
132
|
+
snapshot = cs.add_hook(scope, event, args.name, args.command,
|
|
133
|
+
matcher=args.matcher, timeout=args.timeout,
|
|
134
|
+
host=host)
|
|
134
135
|
journal.log("hook-add", args.name, scope=scope, event=event, host=host)
|
|
135
136
|
out.ok("added %s hook '%s' (%s) → %s"
|
|
136
137
|
% (event, args.name, _where(host, scope), args.command))
|
|
137
138
|
out.dim(" settings: %s" % cs.settings_path(scope, host=host))
|
|
139
|
+
if snapshot is not None:
|
|
140
|
+
out.dim(" backup: %s" % snapshot)
|
|
138
141
|
return 0
|
|
139
142
|
|
|
140
143
|
|
|
@@ -28,6 +28,7 @@ from ..core import (
|
|
|
28
28
|
gitutil,
|
|
29
29
|
imperative,
|
|
30
30
|
journal,
|
|
31
|
+
jsonstate,
|
|
31
32
|
lockfile,
|
|
32
33
|
paths,
|
|
33
34
|
registry,
|
|
@@ -95,17 +96,26 @@ def _bump_patch(v: str) -> str:
|
|
|
95
96
|
|
|
96
97
|
def _load_state(fname: str, default: dict) -> dict:
|
|
97
98
|
p = paths.state_dir() / fname
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
data, err = jsonstate.read_object(p)
|
|
100
|
+
if err:
|
|
101
|
+
# stderr unconditionally: some callers (`context status --json`) read
|
|
102
|
+
# this before deciding whether they're printing JSON to stdout, and a
|
|
103
|
+
# warning has no business inside that payload.
|
|
104
|
+
out.warn("%s — reading as the default; the file is left on disk but "
|
|
105
|
+
"the next write here replaces it" % err, stream=sys.stderr)
|
|
106
|
+
if data is None:
|
|
103
107
|
return json.loads(json.dumps(default))
|
|
108
|
+
return data
|
|
104
109
|
|
|
105
110
|
|
|
106
111
|
def _save_state(fname: str, data: dict) -> None:
|
|
107
112
|
paths.ensure_dirs()
|
|
108
|
-
|
|
113
|
+
p = paths.state_dir() / fname
|
|
114
|
+
if jsonstate.is_corrupt(p):
|
|
115
|
+
dest = jsonstate.quarantine(p)
|
|
116
|
+
out.warn("%s was corrupt and has been moved to %s before writing "
|
|
117
|
+
"the new file" % (p, dest), stream=sys.stderr)
|
|
118
|
+
p.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
|
|
109
119
|
|
|
110
120
|
|
|
111
121
|
def _save_generated_fallback(name: str, text: str, reason: str) -> None:
|
|
@@ -266,7 +266,7 @@ _DRIFT_ROLE = {"in-sync": "success", "local-edits": "warn",
|
|
|
266
266
|
"quarantined": "muted"}
|
|
267
267
|
|
|
268
268
|
|
|
269
|
-
def _drift_hint(name: str, status: str) -> str:
|
|
269
|
+
def _drift_hint(name: str, status: str, tap: str = "") -> str:
|
|
270
270
|
if status == "quarantined":
|
|
271
271
|
return "boost quarantine --release %s to restore" % name
|
|
272
272
|
if status == "upstream-moved":
|
|
@@ -274,7 +274,10 @@ def _drift_hint(name: str, status: str) -> str:
|
|
|
274
274
|
if status == "local-edits":
|
|
275
275
|
return "boost reinstall %s to discard local edits" % name
|
|
276
276
|
if status == "source-missing":
|
|
277
|
-
|
|
277
|
+
# `boost update` only refreshes configured taps. When the entry's
|
|
278
|
+
# tap has been untapped, that command is a guaranteed no-op — the
|
|
279
|
+
# only remedy that can actually restore the source is re-tapping it.
|
|
280
|
+
return "boost update" if registry.is_tapped(tap) else "boost tap %s" % tap
|
|
278
281
|
if status == "store-missing":
|
|
279
282
|
return "boost heal"
|
|
280
283
|
return ""
|
|
@@ -861,7 +864,7 @@ def cmd_drift(argv):
|
|
|
861
864
|
status = (_drift_status(name, entry) if kind == "skill"
|
|
862
865
|
else _drift_status_materialized(kind, name, entry))
|
|
863
866
|
rows.append({"name": name, "kind": kind, "status": status,
|
|
864
|
-
"hint": _drift_hint(name, status)})
|
|
867
|
+
"hint": _drift_hint(name, status, entry.get("tap", ""))})
|
|
865
868
|
if args.json:
|
|
866
869
|
print(json.dumps({"skills": rows}))
|
|
867
870
|
return 0
|
|
@@ -9,12 +9,14 @@ import platform
|
|
|
9
9
|
import shutil
|
|
10
10
|
import stat
|
|
11
11
|
import urllib.parse
|
|
12
|
+
from typing import Any
|
|
12
13
|
|
|
13
14
|
from .. import cliparse
|
|
14
15
|
from ..core import (
|
|
15
16
|
catalog,
|
|
16
17
|
complete,
|
|
17
18
|
journal,
|
|
19
|
+
jsonstate,
|
|
18
20
|
lockfile,
|
|
19
21
|
paths,
|
|
20
22
|
registry,
|
|
@@ -258,15 +260,20 @@ def cmd_profile(argv) -> int:
|
|
|
258
260
|
p.error("%s needs a profile NAME" % args.action)
|
|
259
261
|
|
|
260
262
|
if args.action == "list":
|
|
261
|
-
profiles = []
|
|
263
|
+
profiles: list[dict[str, Any]] = []
|
|
262
264
|
for f in sorted(paths.profiles_dir().glob("*.json")):
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
265
|
+
data, _err = jsonstate.read_object(f)
|
|
266
|
+
if data is None:
|
|
267
|
+
# Surfaced rather than skipped: a corrupt profile used to be
|
|
268
|
+
# invisible here yet still block `profile delete` (it parsed
|
|
269
|
+
# the file again as an existence check) — see `delete` below.
|
|
270
|
+
profiles.append({"name": f.stem, "skills": None,
|
|
271
|
+
"saved": None, "unreadable": True})
|
|
266
272
|
continue
|
|
267
273
|
profiles.append({"name": data.get("name", f.stem),
|
|
268
274
|
"skills": len(data.get("skills", {})),
|
|
269
|
-
"saved": data.get("saved", "?")
|
|
275
|
+
"saved": data.get("saved", "?"),
|
|
276
|
+
"unreadable": False})
|
|
270
277
|
if args.json:
|
|
271
278
|
print(json.dumps(profiles, indent=2))
|
|
272
279
|
return 0
|
|
@@ -274,8 +281,11 @@ def cmd_profile(argv) -> int:
|
|
|
274
281
|
out.info("no profiles saved")
|
|
275
282
|
out.info(out.role("snapshot the current setup: `boost profile save daily`", "muted"))
|
|
276
283
|
return 0
|
|
277
|
-
rows = [(pr["name"],
|
|
278
|
-
|
|
284
|
+
rows = [(pr["name"],
|
|
285
|
+
str(pr["skills"]) if not pr["unreadable"] else "?",
|
|
286
|
+
util.rel_time(pr["saved"]) if not pr["unreadable"]
|
|
287
|
+
else out.role("(unreadable)", "danger"))
|
|
288
|
+
for pr in profiles]
|
|
279
289
|
out.table(rows, headers=("PROFILE", "SKILLS", "SAVED"))
|
|
280
290
|
return 0
|
|
281
291
|
|
|
@@ -347,7 +357,9 @@ def cmd_profile(argv) -> int:
|
|
|
347
357
|
return 0
|
|
348
358
|
|
|
349
359
|
if args.action == "delete":
|
|
350
|
-
|
|
360
|
+
if not _profile_path(args.name).exists():
|
|
361
|
+
raise BoostError("no profile named %s" % args.name,
|
|
362
|
+
hint="list profiles with `boost profile list`")
|
|
351
363
|
if not out.confirm("delete profile %s?" % args.name):
|
|
352
364
|
out.info("cancelled")
|
|
353
365
|
return 1
|
|
@@ -32,10 +32,11 @@ from __future__ import annotations
|
|
|
32
32
|
|
|
33
33
|
import contextlib
|
|
34
34
|
import json
|
|
35
|
+
import sys
|
|
35
36
|
from pathlib import Path
|
|
36
37
|
|
|
37
38
|
from ..errors import BoostError
|
|
38
|
-
from . import hookhost, paths, util
|
|
39
|
+
from . import hookhost, jsonstate, output, paths, util
|
|
39
40
|
|
|
40
41
|
SCOPES = ("global", "project")
|
|
41
42
|
MARKER = "# boost:"
|
|
@@ -66,27 +67,39 @@ def _history_dir() -> Path:
|
|
|
66
67
|
|
|
67
68
|
def load(scope: str, project_dir: Path | None = None,
|
|
68
69
|
host: str = hookhost.CLAUDE) -> dict:
|
|
69
|
-
"""Parse a scope's settings.json ({} if missing or corrupt).
|
|
70
|
+
"""Parse a scope's settings.json ({} if missing or corrupt).
|
|
71
|
+
|
|
72
|
+
A file that exists but fails to parse is warned about by name: it stays
|
|
73
|
+
on disk untouched by this read, but `save` treats an empty `{}` as this
|
|
74
|
+
scope's *whole* settings from here on, so silently swallowing the error
|
|
75
|
+
is how a hooks-only settings.json used to eat the user's `permissions`
|
|
76
|
+
and `model` keys on the next `hooks add`.
|
|
77
|
+
"""
|
|
70
78
|
p = settings_path(scope, project_dir, host)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return data if
|
|
79
|
+
data, err = jsonstate.read_object(p)
|
|
80
|
+
if err:
|
|
81
|
+
output.warn(
|
|
82
|
+
"%s — reading as empty; the file is left on disk but the next "
|
|
83
|
+
"write here replaces its contents (a snapshot lands in %s "
|
|
84
|
+
"first)" % (err, _history_dir()), stream=sys.stderr)
|
|
85
|
+
return data if data is not None else {}
|
|
78
86
|
|
|
79
87
|
|
|
80
88
|
def save(scope: str, data: dict, project_dir: Path | None = None,
|
|
81
|
-
|
|
89
|
+
host: str = hookhost.CLAUDE) -> Path | None:
|
|
82
90
|
"""Write a scope's settings.json, snapshotting the prior version first.
|
|
83
91
|
|
|
84
92
|
Snapshots are named ``<host prefix><scope>-<stamp>.json``. Claude's prefix
|
|
85
93
|
is empty, so its history filenames are exactly what they always were and a
|
|
86
94
|
Gemini write cannot land on top of one.
|
|
95
|
+
|
|
96
|
+
Returns the snapshot path, or None when there was no prior file to
|
|
97
|
+
snapshot — callers that just replaced a scope's settings (`hooks add`)
|
|
98
|
+
use this to tell the user where the previous version went.
|
|
87
99
|
"""
|
|
88
100
|
p = settings_path(scope, project_dir, host)
|
|
89
101
|
p.parent.mkdir(parents=True, exist_ok=True)
|
|
102
|
+
dest = None
|
|
90
103
|
if p.exists():
|
|
91
104
|
hist = _history_dir()
|
|
92
105
|
hist.mkdir(parents=True, exist_ok=True)
|
|
@@ -100,6 +113,7 @@ def save(scope: str, data: dict, project_dir: Path | None = None,
|
|
|
100
113
|
dest.write_text(p.read_text(encoding="utf-8"), encoding="utf-8")
|
|
101
114
|
_prune_history()
|
|
102
115
|
p.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8")
|
|
116
|
+
return dest
|
|
103
117
|
|
|
104
118
|
|
|
105
119
|
def _prune_history() -> None:
|
|
@@ -135,7 +149,7 @@ def _hook_name(command: str) -> str | None:
|
|
|
135
149
|
def add_hook(scope: str, event: str, name: str, command: str,
|
|
136
150
|
matcher: str | None = None, timeout: int = 10,
|
|
137
151
|
project_dir: Path | None = None,
|
|
138
|
-
host: str = hookhost.CLAUDE) -> None:
|
|
152
|
+
host: str = hookhost.CLAUDE) -> Path | None:
|
|
139
153
|
"""Idempotently install a boost-managed hook (replaces same-named entry).
|
|
140
154
|
|
|
141
155
|
``timeout`` is in **seconds** whatever the host; ``hookhost.hook_entry``
|
|
@@ -143,6 +157,9 @@ def add_hook(scope: str, event: str, name: str, command: str,
|
|
|
143
157
|
must already be spelled the way ``host`` spells it — translating is the
|
|
144
158
|
command layer's job, because a Claude event with no Gemini counterpart has
|
|
145
159
|
to be refused out loud rather than silently dropped here.
|
|
160
|
+
|
|
161
|
+
Returns `save`'s snapshot path (or None) so the caller can tell the user
|
|
162
|
+
where the pre-edit settings.json went.
|
|
146
163
|
"""
|
|
147
164
|
data = load(scope, project_dir, host)
|
|
148
165
|
event_list = data.setdefault("hooks", {}).setdefault(event, [])
|
|
@@ -154,7 +171,7 @@ def add_hook(scope: str, event: str, name: str, command: str,
|
|
|
154
171
|
block["hooks"] = [hookhost.hook_entry(host, _tag(command, name), timeout,
|
|
155
172
|
name=name)]
|
|
156
173
|
event_list.append(block)
|
|
157
|
-
save(scope, data, project_dir, host)
|
|
174
|
+
return save(scope, data, project_dir, host)
|
|
158
175
|
|
|
159
176
|
|
|
160
177
|
def remove_hook(scope: str, event: str, name: str,
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
6
|
import json
|
|
7
|
+
import sys
|
|
7
8
|
from copy import deepcopy
|
|
8
9
|
from typing import Any
|
|
9
10
|
|
|
10
|
-
from . import paths, typedvalue, util
|
|
11
|
+
from . import jsonstate, output, paths, typedvalue, util
|
|
11
12
|
|
|
12
13
|
DEFAULTS = {
|
|
13
14
|
"agents": {
|
|
@@ -201,13 +202,20 @@ def _stat_stamp(p: Any) -> tuple:
|
|
|
201
202
|
return (str(p), st.st_mtime_ns, st.st_size)
|
|
202
203
|
|
|
203
204
|
|
|
205
|
+
def _warn_corrupt(err: str) -> None:
|
|
206
|
+
output.warn(
|
|
207
|
+
"%s — reading as empty for this command; the file on disk is left "
|
|
208
|
+
"untouched, but the next `config set`/`config unset` will move it "
|
|
209
|
+
"aside to '<name>.corrupt' before writing a fresh one" % err,
|
|
210
|
+
stream=sys.stderr)
|
|
211
|
+
|
|
212
|
+
|
|
204
213
|
def _read() -> dict:
|
|
205
214
|
p = paths.config_path()
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
except (json.JSONDecodeError, OSError):
|
|
215
|
+
user, err = jsonstate.read_object(p)
|
|
216
|
+
if err:
|
|
217
|
+
_warn_corrupt(err)
|
|
218
|
+
if user is None:
|
|
211
219
|
return deepcopy(DEFAULTS)
|
|
212
220
|
return _merge(DEFAULTS, user)
|
|
213
221
|
|
|
@@ -217,16 +225,14 @@ def _read_raw() -> dict:
|
|
|
217
225
|
|
|
218
226
|
A missing or corrupt file reads as no overrides — the same "absent" the
|
|
219
227
|
merged view falls back to, so a caller walking this dict never has to
|
|
220
|
-
special-case the file not existing.
|
|
228
|
+
special-case the file not existing. Corruption is warned about, not
|
|
229
|
+
silenced: see :func:`_warn_corrupt`.
|
|
221
230
|
"""
|
|
222
231
|
p = paths.config_path()
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
except (json.JSONDecodeError, OSError):
|
|
228
|
-
return {}
|
|
229
|
-
return data if isinstance(data, dict) else {}
|
|
232
|
+
data, err = jsonstate.read_object(p)
|
|
233
|
+
if err:
|
|
234
|
+
_warn_corrupt(err)
|
|
235
|
+
return data if data is not None else {}
|
|
230
236
|
|
|
231
237
|
|
|
232
238
|
def _cached() -> dict:
|
|
@@ -249,10 +255,21 @@ def load() -> dict:
|
|
|
249
255
|
|
|
250
256
|
|
|
251
257
|
def save(cfg: dict) -> None:
|
|
252
|
-
"""Atomically write `cfg` to `~/.boost/config.json`, creating dirs first.
|
|
258
|
+
"""Atomically write `cfg` to `~/.boost/config.json`, creating dirs first.
|
|
259
|
+
|
|
260
|
+
A config.json that exists but fails to parse is quarantined to
|
|
261
|
+
`config.json.corrupt` first, so this never overwrites bytes the read path
|
|
262
|
+
already warned about with a fresh file built from an in-memory view that
|
|
263
|
+
silently dropped them — see `jsonstate.quarantine`.
|
|
264
|
+
"""
|
|
253
265
|
paths.ensure_dirs()
|
|
266
|
+
p = paths.config_path()
|
|
267
|
+
if jsonstate.is_corrupt(p):
|
|
268
|
+
dest = jsonstate.quarantine(p)
|
|
269
|
+
output.warn("%s was corrupt and has been moved to %s before writing "
|
|
270
|
+
"the new config" % (p, dest), stream=sys.stderr)
|
|
254
271
|
util.atomic_write_text(
|
|
255
|
-
|
|
272
|
+
p, json.dumps(cfg, indent=2, sort_keys=False) + "\n")
|
|
256
273
|
|
|
257
274
|
|
|
258
275
|
def get(dotted: str, default=None):
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Copyright the boost contributors.
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
"""Corruption-aware read/quarantine for boost's small JSON state files.
|
|
4
|
+
|
|
5
|
+
Several files under ``~/.boost`` and each agent's dotdir (``config.json``,
|
|
6
|
+
``settings.json``, ``context.json``, a saved profile, ...) are read as "the
|
|
7
|
+
merged view, or defaults/empty if the file is missing" and then, on the next
|
|
8
|
+
write, replaced outright. Before this module every one of those read sites
|
|
9
|
+
folded "missing" and "exists but fails to parse" into the same branch, so a
|
|
10
|
+
truncated write or a hand-edited trailing comma degraded to an empty object
|
|
11
|
+
with no warning — and the next save then overwrote the corrupt bytes with a
|
|
12
|
+
fresh file built from that empty view, discarding whatever was still sitting
|
|
13
|
+
on disk. :func:`read_object` keeps those two cases apart so a caller can warn
|
|
14
|
+
on the one that means something was actually lost; :func:`quarantine` gives a
|
|
15
|
+
writer a way to get the bad bytes out of the way, rather than over them,
|
|
16
|
+
before it writes the replacement.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def read_object(path: Path) -> tuple[dict | None, str | None]:
|
|
25
|
+
"""Parse `path` as a JSON object.
|
|
26
|
+
|
|
27
|
+
Returns ``(data, None)`` when the file is missing (``data`` is ``None``)
|
|
28
|
+
or holds a valid JSON object. Returns ``(None, message)`` when the file
|
|
29
|
+
exists but can't be read as one — unreadable, invalid JSON, or valid JSON
|
|
30
|
+
that isn't an object — where ``message`` names the file and the
|
|
31
|
+
underlying error so a caller can warn instead of quietly treating
|
|
32
|
+
corruption the same as "nothing here yet".
|
|
33
|
+
"""
|
|
34
|
+
if not path.exists():
|
|
35
|
+
return None, None
|
|
36
|
+
try:
|
|
37
|
+
text = path.read_text(encoding="utf-8")
|
|
38
|
+
except OSError as exc:
|
|
39
|
+
return None, "%s: %s" % (path, exc)
|
|
40
|
+
try:
|
|
41
|
+
data = json.loads(text)
|
|
42
|
+
except json.JSONDecodeError as exc:
|
|
43
|
+
return None, "%s: invalid JSON (%s)" % (path, exc)
|
|
44
|
+
if not isinstance(data, dict):
|
|
45
|
+
return None, "%s: expected a JSON object, found %s" % (
|
|
46
|
+
path, type(data).__name__)
|
|
47
|
+
return data, None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def is_corrupt(path: Path) -> bool:
|
|
51
|
+
"""True when `path` exists but :func:`read_object` can't parse it.
|
|
52
|
+
|
|
53
|
+
A missing file is not corrupt — callers that only care about "is there a
|
|
54
|
+
bad file sitting here" (rather than the error text) use this instead of
|
|
55
|
+
unpacking the tuple.
|
|
56
|
+
"""
|
|
57
|
+
_, err = read_object(path)
|
|
58
|
+
return err is not None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def quarantine(path: Path) -> Path:
|
|
62
|
+
"""Move a corrupt `path` aside so a fresh write can land on its name
|
|
63
|
+
without destroying the bad bytes underneath it.
|
|
64
|
+
|
|
65
|
+
Picks `<name>.corrupt`, or `<name>.corrupt.N` for the first `N >= 2` that
|
|
66
|
+
doesn't already exist, so repeated corruption never overwrites an earlier
|
|
67
|
+
quarantined copy. Returns the destination. Caller's job to have already
|
|
68
|
+
established `path` is worth quarantining; this itself doesn't parse it.
|
|
69
|
+
"""
|
|
70
|
+
dest = path.with_name(path.name + ".corrupt")
|
|
71
|
+
n = 2
|
|
72
|
+
while dest.exists():
|
|
73
|
+
dest = path.with_name("%s.corrupt.%d" % (path.name, n))
|
|
74
|
+
n += 1
|
|
75
|
+
path.rename(dest)
|
|
76
|
+
return dest
|
|
@@ -182,6 +182,18 @@ def get(name: str) -> Tap:
|
|
|
182
182
|
else "list taps with `boost taps`")
|
|
183
183
|
|
|
184
184
|
|
|
185
|
+
def is_tapped(name: str) -> bool:
|
|
186
|
+
"""True if `name` is a currently configured tap's exact ``Tap.name``.
|
|
187
|
+
|
|
188
|
+
Exact match only, unlike ``get()``'s shorthand/ambiguity tiering: a lock
|
|
189
|
+
entry's ``tap`` field always records the full ``owner/repo`` name a skill
|
|
190
|
+
was installed from, so callers checking "is this entry's tap still
|
|
191
|
+
tapped?" want a plain membership test, not a fuzzy lookup that could
|
|
192
|
+
raise on an unrelated ambiguous shorthand.
|
|
193
|
+
"""
|
|
194
|
+
return any(t.name == name for t in list_taps())
|
|
195
|
+
|
|
196
|
+
|
|
185
197
|
def add(spec: str, curated: bool = False, at: str | None = None) -> Tap:
|
|
186
198
|
"""Parse `spec`, shallow-clone it, and record the tap in config.
|
|
187
199
|
|
|
@@ -81,6 +81,7 @@ boost_cli/core/injectscan.py
|
|
|
81
81
|
boost_cli/core/installscan.py
|
|
82
82
|
boost_cli/core/integrity.py
|
|
83
83
|
boost_cli/core/journal.py
|
|
84
|
+
boost_cli/core/jsonstate.py
|
|
84
85
|
boost_cli/core/localembed.py
|
|
85
86
|
boost_cli/core/lockfile.py
|
|
86
87
|
boost_cli/core/logs.py
|
|
@@ -826,6 +827,7 @@ tests/unit/test_distill_merge.py
|
|
|
826
827
|
tests/unit/test_docs_pages_linked.py
|
|
827
828
|
tests/unit/test_docsite_chrome.py
|
|
828
829
|
tests/unit/test_doctor_output_polish.py
|
|
830
|
+
tests/unit/test_drift_hint.py
|
|
829
831
|
tests/unit/test_ed25519.py
|
|
830
832
|
tests/unit/test_embed.py
|
|
831
833
|
tests/unit/test_embed_local.py
|
|
@@ -860,6 +862,7 @@ tests/unit/test_install_permission_error.py
|
|
|
860
862
|
tests/unit/test_installscan.py
|
|
861
863
|
tests/unit/test_integrity.py
|
|
862
864
|
tests/unit/test_journal.py
|
|
865
|
+
tests/unit/test_jsonstate.py
|
|
863
866
|
tests/unit/test_langchain_packaging.py
|
|
864
867
|
tests/unit/test_link_ownership.py
|
|
865
868
|
tests/unit/test_localembed.py
|
|
@@ -203,6 +203,42 @@ plain `upgrade` has already been tried and refused.
|
|
|
203
203
|
|
|
204
204
|
---
|
|
205
205
|
|
|
206
|
+
## A corrupt config/settings/state file
|
|
207
|
+
|
|
208
|
+
boost keeps several small JSON files — `~/.boost/config.json`, each agent's
|
|
209
|
+
`settings.json` (hooks), `~/.boost/state/context.json`/`focus.json`, and a
|
|
210
|
+
saved `boost profile`. If one of these exists but fails to parse (a truncated
|
|
211
|
+
write, a hand-edited trailing comma), the read that notices prints a warning
|
|
212
|
+
to stderr naming the file and the JSON error, then falls back to that file's
|
|
213
|
+
empty/default state for the current command — the bad bytes are left on disk,
|
|
214
|
+
untouched, by the read itself.
|
|
215
|
+
|
|
216
|
+
**The next write to that file is what matters.** Rather than silently
|
|
217
|
+
building a fresh file from the empty/default view and overwriting the corrupt
|
|
218
|
+
one — losing whatever was in it, with no way back — boost moves the corrupt
|
|
219
|
+
file aside first:
|
|
220
|
+
|
|
221
|
+
- `~/.claude/settings.json` (and `~/.gemini/settings.json`) already snapshot
|
|
222
|
+
the *previous* version into `~/.boost/state/claude-settings-history/` on
|
|
223
|
+
every write, corrupt or not, so a corrupt file is preserved there too.
|
|
224
|
+
`boost hooks add` prints that snapshot's path (`backup: ...`) whenever one
|
|
225
|
+
is written, so you don't have to know the history directory exists to use
|
|
226
|
+
it.
|
|
227
|
+
- `~/.boost/config.json` and the `context.json`/`focus.json` state files have
|
|
228
|
+
no such standing history, so the write itself quarantines a corrupt file to
|
|
229
|
+
`<name>.json.corrupt` (or `.corrupt.2`, `.corrupt.3`, ... if that name is
|
|
230
|
+
already taken by an earlier corruption) before writing the new one, and
|
|
231
|
+
says so on stderr.
|
|
232
|
+
- `boost profile list` marks a corrupt profile `(unreadable)` instead of
|
|
233
|
+
hiding it, and `boost profile delete <name>` only checks that the file
|
|
234
|
+
exists — not that it parses — so a corrupt profile can still be deleted.
|
|
235
|
+
|
|
236
|
+
None of this recovers a corrupt file's *content* automatically — it recovers
|
|
237
|
+
the bytes so you can look at them (`<name>.json.corrupt`, or the newest file
|
|
238
|
+
under `claude-settings-history/`) and hand-merge anything worth keeping.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
206
242
|
## Environment variables
|
|
207
243
|
|
|
208
244
|
Everything that changes boost's runtime behaviour, in one place:
|
|
Binary file
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: audit-corrupt-settings-config-state-json-silently-read-as-empty-th
|
|
3
3
|
board: code
|
|
4
4
|
section: dx
|
|
5
|
-
status:
|
|
5
|
+
status: shipped
|
|
6
6
|
category: Safety · Bug
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 2
|
|
10
10
|
note: a trailing comma in settings.json costs the permissions/model block on the next hooks add
|
|
11
11
|
order: 203
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/corrupt-json-state
|
|
13
|
+
pr: 714
|
|
14
14
|
title: "Corrupt settings/config/state JSON silently read as empty, then clobbered on the next write"
|
|
15
15
|
---
|
|
16
16
|
One shared load pattern across four surfaces: a JSON file that exists but does not parse is read as <code>{}</code> (<code>except (JSONDecodeError, OSError)</code> at <code>boost_cli/core/claude_settings.py:74-75</code> and <code>boost_cli/core/config.py:129</code>/<code>196-203</code>/<code>246-250</code>), and the next write replaces it. Verified worst case: with a trailing comma in <code>~/.claude/settings.json</code>, <code>hooks add SessionStart …</code> prints <em>“✓ added SessionStart hook”</em> exit 0 and the file afterwards holds <em>only</em> <code>{"hooks": …}</code> — the user's <code>permissions</code> and <code>model</code> keys are gone, no warning. With a corrupt <code>~/.boost/config.json</code>, <code>config list</code> silently prints the defaults, and <code>config set ai.enabled true</code> rewrites the file to defaults-plus-that-key — a 20-tap list unrecoverable, <b>no backup</b>. <code>context status</code>/<code>context map</code> and <code>focus --status</code> do the same to <code>state/context.json</code>/<code>focus.json</code>; a corrupt profile is invisible to <code>profile list</code> yet <code>profile delete broken</code> <em>refuses</em> with exit 1, because the existence check parses the file before deleting.
|
|
@@ -20,3 +20,7 @@ Verification narrowed the hooks half: <code>claude_settings.save</code> already
|
|
|
20
20
|
Fix centrally, per the verified recommendation: when a JSON state file exists but fails to parse, warn on read naming the file and the JSON error, and before any save either refuse with a BoostError and a fix-it hint or move the bad file to <code><name>.corrupt</code> and say so. <code>hooks add</code> should print the claude-settings-history snapshot path it already writes; <code>profile delete</code> should check <code>_profile_path(name).exists()</code> instead of parsing; <code>profile list</code> should show an <em>(unreadable)</em> marker. Docs: note the corrupt-file behaviour in <code>docs/DEBUGGING.md</code> (config/logging section).
|
|
21
21
|
|
|
22
22
|
Found by the 2026-08 CLI audit (cluster <code>corrupt-json-clobbered</code>); repro in the audit log. Verified 2026-08-31: all four surfaces reproduced.
|
|
23
|
+
|
|
24
|
+
<b>2026-09-02, PR open.</b> New <code>core/jsonstate.py</code> (<code>read_object</code>/<code>is_corrupt</code>/<code>quarantine</code>) centralizes the read-vs-corrupt distinction; <code>config.py</code>, <code>claude_settings.py</code> and <code>commands/intelligence.py</code>'s <code>_load_state</code>/<code>_save_state</code> (context/focus) all warn on a corrupt read and quarantine to <code><name>.corrupt</code> (or reuse the existing history snapshot, for hooks) before the next write. <code>hooks add</code> prints the snapshot path; <code>profile delete</code> checks existence instead of parsing; <code>profile list</code> marks a corrupt profile <em>(unreadable)</em>. <code>docs/DEBUGGING.md</code> has a new section. All four surfaces from the audit are covered. Held <code>inflight</code> at PR-open time because this session's sandbox has no PyPI egress, so the mutation/lint toolchain (mutmut, vulture, xenon, interrogate, refurb, codespell, actionlint, zizmor) could not be installed to run <code>make check</code> locally — ruff, mypy, pyright and pytest (unit+functional, no coverage) were run directly against the changed files and passed clean.
|
|
25
|
+
|
|
26
|
+
<b>Shipped.</b> PR #714's branch was briefly behind <code>main</code> (a train of 8 other PRs landed while CI ran); merged <code>main</code> in, re-verified locally, and CI ran clean end to end on the merged head: <code>lint</code>, <code>check</code>, the full OS×Python test matrix, <code>evals</code>, all six <code>mutation-shard</code> jobs plus the <code>mutation</code> gate, <code>smoke</code>/<code>install-smoke</code>, <code>dco</code>, <code>vale</code>, <code>lighthouse</code>, CodeQL and the security scanners — 41/41 checks green, no merge conflict.
|
{boost_skill_cli-1.2.89 → boost_skill_cli-1.2.90}/docs/roadmap/items/audit-drift-findings.md
RENAMED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
id: audit-drift-findings
|
|
3
3
|
board: code
|
|
4
4
|
section: health
|
|
5
|
-
status:
|
|
5
|
+
status: inflight
|
|
6
6
|
category: CLI · Bug
|
|
7
7
|
complexity: S
|
|
8
8
|
impact: Med
|
|
9
9
|
wow: 1
|
|
10
|
-
note:
|
|
10
|
+
note: fix up in #719, awaiting CI + review — sandbox couldn't run the full mutation/eval/smoke gate locally (no PyPI egress)
|
|
11
11
|
order: 264
|
|
12
|
-
owner:
|
|
13
|
-
pr:
|
|
12
|
+
owner: loop/drift-source-missing-hint
|
|
13
|
+
pr: 719
|
|
14
14
|
title: "boost drift: CLI audit findings (2026-08)"
|
|
15
15
|
---
|
|
16
16
|
<b>drift hints <code>boost update</code> for source-missing items whose tap was untapped — a
|
|
@@ -6666,7 +6666,7 @@ excerpts at <code>:159-164</code>) to match. Found by the 2026-08 CLI audit (clu
|
|
|
6666
6666
|
</article>
|
|
6667
6667
|
|
|
6668
6668
|
<article class="cap rcard" id="audit-drift-findings">
|
|
6669
|
-
<div class="head"><span class="pill
|
|
6669
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">CLI · Bug</span></div>
|
|
6670
6670
|
<h3>boost drift: CLI audit findings (2026-08)</h3>
|
|
6671
6671
|
<p><b>drift hints <code>boost update</code> for source-missing items whose tap was untapped — a
|
|
6672
6672
|
guaranteed no-op.</b> After <code>untap Aaronontheweb/dotnet-cursor-rules</code>, drift reports
|
|
@@ -6690,7 +6690,7 @@ entry's tap into <code>_drift_hint</code> (<code>quality.py:255-258</code>) and
|
|
|
6690
6690
|
<span class="m">Complexity <b>S</b></span>
|
|
6691
6691
|
<span class="m">Impact <b>Med</b></span>
|
|
6692
6692
|
<span class="m">Wow <b class="wow">★</b></span>
|
|
6693
|
-
<span class="m">
|
|
6693
|
+
<span class="m">fix up in</span>
|
|
6694
6694
|
</div>
|
|
6695
6695
|
</article>
|
|
6696
6696
|
|
|
@@ -11635,15 +11635,20 @@ Found by the 2026-08 CLI audit (cluster <code>config-policy-set-validation</code
|
|
|
11635
11635
|
</article>
|
|
11636
11636
|
|
|
11637
11637
|
<article class="cap rcard" id="audit-corrupt-settings-config-state-json-silently-read-as-empty-th">
|
|
11638
|
-
<div class="head"><span class="pill
|
|
11638
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Safety · Bug</span></div>
|
|
11639
11639
|
<h3>Corrupt settings/config/state JSON silently read as empty, then clobbered on the next write</h3>
|
|
11640
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
11640
11641
|
<p>One shared load pattern across four surfaces: a JSON file that exists but does not parse is read as <code>{}</code> (<code>except (JSONDecodeError, OSError)</code> at <code>boost_cli/core/claude_settings.py:74-75</code> and <code>boost_cli/core/config.py:129</code>/<code>196-203</code>/<code>246-250</code>), and the next write replaces it. Verified worst case: with a trailing comma in <code>~/.claude/settings.json</code>, <code>hooks add SessionStart …</code> prints <em>“✓ added SessionStart hook”</em> exit 0 and the file afterwards holds <em>only</em> <code>{"hooks": …}</code> — the user's <code>permissions</code> and <code>model</code> keys are gone, no warning. With a corrupt <code>~/.boost/config.json</code>, <code>config list</code> silently prints the defaults, and <code>config set ai.enabled true</code> rewrites the file to defaults-plus-that-key — a 20-tap list unrecoverable, <b>no backup</b>. <code>context status</code>/<code>context map</code> and <code>focus --status</code> do the same to <code>state/context.json</code>/<code>focus.json</code>; a corrupt profile is invisible to <code>profile list</code> yet <code>profile delete broken</code> <em>refuses</em> with exit 1, because the existence check parses the file before deleting.
|
|
11641
11642
|
|
|
11642
11643
|
Verification narrowed the hooks half: <code>claude_settings.save</code> already snapshots the prior file into <code>~/.boost/state/claude-settings-history/</code> before every write (confirmed byte-for-byte), so that path is recoverable — but silently, and nothing tells the user. <code>config.json</code> has no such net: that loss is real. Degrading a corrupt file to defaults on <em>read</em> is arguably deliberate (the <code>config.py</code> comment says so); silently <em>overwriting</em> it on the next write is documented nowhere and destroys user data. The roadmap's atomic-lock-file-writes item covers the lock file only — related pattern, not a duplicate.
|
|
11643
11644
|
|
|
11644
11645
|
Fix centrally, per the verified recommendation: when a JSON state file exists but fails to parse, warn on read naming the file and the JSON error, and before any save either refuse with a BoostError and a fix-it hint or move the bad file to <code><name>.corrupt</code> and say so. <code>hooks add</code> should print the claude-settings-history snapshot path it already writes; <code>profile delete</code> should check <code>_profile_path(name).exists()</code> instead of parsing; <code>profile list</code> should show an <em>(unreadable)</em> marker. Docs: note the corrupt-file behaviour in <code>docs/DEBUGGING.md</code> (config/logging section).
|
|
11645
11646
|
|
|
11646
|
-
Found by the 2026-08 CLI audit (cluster <code>corrupt-json-clobbered</code>); repro in the audit log. Verified 2026-08-31: all four surfaces reproduced
|
|
11647
|
+
Found by the 2026-08 CLI audit (cluster <code>corrupt-json-clobbered</code>); repro in the audit log. Verified 2026-08-31: all four surfaces reproduced.
|
|
11648
|
+
|
|
11649
|
+
<b>2026-09-02, PR open.</b> New <code>core/jsonstate.py</code> (<code>read_object</code>/<code>is_corrupt</code>/<code>quarantine</code>) centralizes the read-vs-corrupt distinction; <code>config.py</code>, <code>claude_settings.py</code> and <code>commands/intelligence.py</code>'s <code>_load_state</code>/<code>_save_state</code> (context/focus) all warn on a corrupt read and quarantine to <code><name>.corrupt</code> (or reuse the existing history snapshot, for hooks) before the next write. <code>hooks add</code> prints the snapshot path; <code>profile delete</code> checks existence instead of parsing; <code>profile list</code> marks a corrupt profile <em>(unreadable)</em>. <code>docs/DEBUGGING.md</code> has a new section. All four surfaces from the audit are covered. Held <code>inflight</code> at PR-open time because this session's sandbox has no PyPI egress, so the mutation/lint toolchain (mutmut, vulture, xenon, interrogate, refurb, codespell, actionlint, zizmor) could not be installed to run <code>make check</code> locally — ruff, mypy, pyright and pytest (unit+functional, no coverage) were run directly against the changed files and passed clean.
|
|
11650
|
+
|
|
11651
|
+
<b>Shipped.</b> PR #714's branch was briefly behind <code>main</code> (a train of 8 other PRs landed while CI ran); merged <code>main</code> in, re-verified locally, and CI ran clean end to end on the merged head: <code>lint</code>, <code>check</code>, the full OS×Python test matrix, <code>evals</code>, all six <code>mutation-shard</code> jobs plus the <code>mutation</code> gate, <code>smoke</code>/<code>install-smoke</code>, <code>dco</code>, <code>vale</code>, <code>lighthouse</code>, CodeQL and the security scanners — 41/41 checks green, no merge conflict.</p></details>
|
|
11647
11652
|
<div class="meta">
|
|
11648
11653
|
<span class="m">Complexity <b>M</b></span>
|
|
11649
11654
|
<span class="m hi">Impact <b>High</b></span>
|