boost-skill-cli 1.2.20__tar.gz → 1.2.22__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.20 → boost_skill_cli-1.2.22}/.vale/styles/config/vocabularies/boost/accept.txt +4 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/CLAUDE.md +18 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/discovery.py +28 -5
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/info.py +1 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/intelligence.py +11 -5
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/quality.py +10 -7
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/team.py +10 -4
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/output.py +124 -9
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/rag.py +65 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/SOURCES.txt +1 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/eval-latest.json +2 -2
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/rag-architecture.md +14 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bm25-has-no-stemming.md +28 -10
- boost_skill_cli-1.2.22/docs/roadmap/items/long-hints-overflow-narrow-panes.md +69 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap.html +79 -30
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/explain.feature +2 -2
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/cli_steps.py +14 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_discovery.py +24 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_info.py +1 -1
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_intelligence.py +25 -12
- boost_skill_cli-1.2.22/tests/functional/test_cli_pane_width.py +137 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_quality.py +2 -2
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_team.py +6 -2
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_output.py +217 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rag.py +123 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/package-lock.json +12 -12
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/package.json +1 -1
- boost_skill_cli-1.2.20/docs/roadmap/items/long-hints-overflow-narrow-panes.md +0 -38
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.gitattributes +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.gitignore +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/.vale.ini +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/LICENSE +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/Makefile +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/codecov.yml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/index.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/cli-output-ignored-the-terminal.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/examples/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/index.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/noxfile.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/setup.cfg +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/boost.css +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/boost.js +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/style/demo.html +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/tests/visual/visual_check.mjs +0 -0
|
@@ -212,6 +212,24 @@ line coverage. Target `boost_cli/core` behavior with assertions, not just import
|
|
|
212
212
|
a workflow is rendered per agent (TOML for Gemini, see
|
|
213
213
|
`workflows.TOML_COMMAND_AGENTS`). Installing a rule therefore edits a file the
|
|
214
214
|
user reads every session — treat it as more invasive than a skill, not less.
|
|
215
|
+
- **A long line is either chrome or data, and only chrome may be wrapped.**
|
|
216
|
+
`out.wrap()` folds prose to the pane, and the emitters take it opt-in —
|
|
217
|
+
`warn`/`info`/`dim`/`kv` accept `wrap=True` and each pays for its own prefix,
|
|
218
|
+
so continuations align under the message rather than folding to column zero.
|
|
219
|
+
It is opt-in because always-on wrapping would fold the lines that must stay
|
|
220
|
+
long: `pulse`'s `source=` paths and `fingerprint`'s 64-character hash are the
|
|
221
|
+
information the line exists to carry, and a hash split across two lines
|
|
222
|
+
cannot be compared by eye. **A backtick span is one atomic token**, spaces
|
|
223
|
+
and all — `doctor` and `search` both interpolate `dense.fix_hint()`, whose
|
|
224
|
+
answers end in `pip install 'boost-skill-cli[rag]'`, and a wrap that splits
|
|
225
|
+
that hands the user a command which does not run. A token wider than the pane
|
|
226
|
+
overflows whole rather than breaking. Wrap *before* adding color: `out.role`
|
|
227
|
+
brackets its argument with a start code and a reset, so coloring first and
|
|
228
|
+
splitting after leaves line one unterminated and line two plain. And
|
|
229
|
+
budget the emitter's own indent — wrapping to the full `term_width()` and
|
|
230
|
+
then letting `out.info` add two spaces is what put `boost search`'s hint one
|
|
231
|
+
column past the pane it had just been fitted to.
|
|
232
|
+
|
|
215
233
|
- **Sub-actions of one action repo move in lockstep.** `github/codeql-action/{init,
|
|
216
234
|
analyze,upload-sarif}` and `actions/cache{,/save,/restore}` are each *one repo at
|
|
217
235
|
one commit*, but Dependabot tracks one `uses:` path as one dependency and raises a
|
|
@@ -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.22'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 22)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -12,7 +12,6 @@ import re
|
|
|
12
12
|
import shutil
|
|
13
13
|
import subprocess
|
|
14
14
|
import sys
|
|
15
|
-
import textwrap
|
|
16
15
|
import threading
|
|
17
16
|
import time
|
|
18
17
|
import urllib.parse
|
|
@@ -152,7 +151,7 @@ def cmd_search(argv):
|
|
|
152
151
|
if reranked:
|
|
153
152
|
scored, ranker = reranked, "Claude Haiku relevance"
|
|
154
153
|
else:
|
|
155
|
-
out.warn(ai.fallback_note())
|
|
154
|
+
out.warn(ai.fallback_note(), wrap=True)
|
|
156
155
|
shown = scored[:args.limit]
|
|
157
156
|
# The dot marks "a skill by this name is installed" — a name match, with
|
|
158
157
|
# the known homonym caveat (13 real skills share `code-reviewer`). A lock
|
|
@@ -176,10 +175,29 @@ def cmd_search(argv):
|
|
|
176
175
|
installed=e["name"] in installed, lay=lay))
|
|
177
176
|
out.info(out.role("%d match%s · ranked by %s"
|
|
178
177
|
% (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
|
|
178
|
+
if use_rag:
|
|
179
|
+
_note_stem_expansions(query)
|
|
179
180
|
_hint_semantic_search(engine)
|
|
180
181
|
return 0
|
|
181
182
|
|
|
182
183
|
|
|
184
|
+
def _note_stem_expansions(query: str) -> None:
|
|
185
|
+
"""Say when a query term was widened to the word actually indexed.
|
|
186
|
+
|
|
187
|
+
Staying quiet would be a worse answer than the old empty one: the user
|
|
188
|
+
asked for `brainstorm` and is looking at results for `brainstorming`, and
|
|
189
|
+
only one of those is a word they typed.
|
|
190
|
+
"""
|
|
191
|
+
subs = rag.stem_expansions(rag.tokenize(query))
|
|
192
|
+
if not subs:
|
|
193
|
+
return
|
|
194
|
+
said = ", ".join("%r" % term for term in subs)
|
|
195
|
+
shown = ", ".join("%r" % term for term in subs.values())
|
|
196
|
+
out.info(out.role(out.truncate(
|
|
197
|
+
"no exact match for %s — showing %s" % (said, shown),
|
|
198
|
+
max(0, out.term_width() - 2)), "muted"))
|
|
199
|
+
|
|
200
|
+
|
|
183
201
|
def _hint_semantic_search(engine: str) -> None:
|
|
184
202
|
"""Say that a better engine exists, when BM25 answered alone.
|
|
185
203
|
|
|
@@ -209,8 +227,12 @@ def _hint_semantic_search(engine: str) -> None:
|
|
|
209
227
|
# runnable — a copy-pasteable `pip install ...` matters more than a hard
|
|
210
228
|
# clamp, and _FIX is tested to hold no token long enough to overflow.
|
|
211
229
|
msg = "semantic search is off — %s" % dense.fix_hint(st.get("reason", ""), st)
|
|
212
|
-
for
|
|
213
|
-
|
|
230
|
+
# `- 2` pays for the indent `out.info` adds: wrapping to the full width and
|
|
231
|
+
# then indenting is what put this hint one column over the pane. Wrap
|
|
232
|
+
# first, colour each line after — `out.role` brackets its argument with a
|
|
233
|
+
# start code and a reset, so colouring first and splitting after leaves the
|
|
234
|
+
# first line unterminated and the second uncoloured.
|
|
235
|
+
for line in out.wrap(msg, max(out.term_width() - 2, 20)):
|
|
214
236
|
out.info(out.role(line, "muted"))
|
|
215
237
|
|
|
216
238
|
|
|
@@ -296,7 +318,8 @@ def cmd_reindex(argv):
|
|
|
296
318
|
", ".join(stats["reindexed"]) or "none"), "muted"))
|
|
297
319
|
if args.dense:
|
|
298
320
|
if dense_stats is None:
|
|
299
|
-
out.warn("dense index skipped — %s" % embed.fallback_note()
|
|
321
|
+
out.warn("dense index skipped — %s" % embed.fallback_note(),
|
|
322
|
+
wrap=True)
|
|
300
323
|
else:
|
|
301
324
|
failed = dense_stats.get("failed") or []
|
|
302
325
|
if failed:
|
|
@@ -694,7 +694,7 @@ def cmd_explain(argv):
|
|
|
694
694
|
"extractive summary instead"
|
|
695
695
|
% ", ".join(faithfulness.ungrounded_terms(reply, text)[:4]))
|
|
696
696
|
else:
|
|
697
|
-
out.warn(ai.fallback_note())
|
|
697
|
+
out.warn(ai.fallback_note(), wrap=True)
|
|
698
698
|
meta, body = frontmatter.parse(text)
|
|
699
699
|
desc = str(meta.get("description") or "").strip()
|
|
700
700
|
if desc:
|
|
@@ -46,7 +46,7 @@ def _note_fallback() -> None:
|
|
|
46
46
|
"""Warn once per invocation that the AI path is unavailable."""
|
|
47
47
|
global _warned_fallback
|
|
48
48
|
if not _warned_fallback:
|
|
49
|
-
out.warn(ai.fallback_note())
|
|
49
|
+
out.warn(ai.fallback_note(), wrap=True)
|
|
50
50
|
_warned_fallback = True
|
|
51
51
|
|
|
52
52
|
|
|
@@ -279,8 +279,12 @@ def cmd_simulate(argv: list[str]) -> int:
|
|
|
279
279
|
out.info(" • (no imperative rules found in the skill body)")
|
|
280
280
|
desc = str(meta.get("description") or "").strip()
|
|
281
281
|
if desc:
|
|
282
|
-
|
|
283
|
-
|
|
282
|
+
# Clipped to 100 characters, which is a length and not a width: at
|
|
283
|
+
# 80 columns the quoted description ran seven past the pane. Wrapping
|
|
284
|
+
# shows the same clipped text and fits it.
|
|
285
|
+
trigger = 'likely triggers when the task involves: "%s"' % desc[:100]
|
|
286
|
+
for line in out.wrap(trigger, max(out.term_width() - 2, 20)):
|
|
287
|
+
out.info(out.role(line, "muted"))
|
|
284
288
|
return 0
|
|
285
289
|
|
|
286
290
|
|
|
@@ -1191,8 +1195,10 @@ def _chat_session(args) -> int:
|
|
|
1191
1195
|
if not ai.available():
|
|
1192
1196
|
# Worth saying up front rather than letting every answer look terse for
|
|
1193
1197
|
# an unexplained reason.
|
|
1194
|
-
|
|
1195
|
-
|
|
1198
|
+
note = ("no AI configured — answers are the grounded matches "
|
|
1199
|
+
"themselves (%s)" % ai.fallback_note())
|
|
1200
|
+
for line in out.wrap(note, max(out.term_width() - 2, 20)):
|
|
1201
|
+
out.info(out.role(line, "muted"))
|
|
1196
1202
|
out.info(out.role("ask about skills; blank line or Ctrl-D to exit", "muted"))
|
|
1197
1203
|
history: list[chat_engine.Turn] = []
|
|
1198
1204
|
while True:
|
|
@@ -364,10 +364,10 @@ def cmd_doctor(argv):
|
|
|
364
364
|
|
|
365
365
|
out.heading("boost doctor")
|
|
366
366
|
|
|
367
|
-
def bad(msg):
|
|
367
|
+
def bad(msg, wrap=False):
|
|
368
368
|
nonlocal issues
|
|
369
369
|
issues += 1
|
|
370
|
-
out.warn(msg)
|
|
370
|
+
out.warn(msg, wrap=wrap)
|
|
371
371
|
|
|
372
372
|
if gitutil.has_git():
|
|
373
373
|
out.ok("git on PATH")
|
|
@@ -633,11 +633,12 @@ def _report_search_engine(bad) -> None:
|
|
|
633
633
|
elif st["reason"] == "empty":
|
|
634
634
|
detail += " but holds no vectors"
|
|
635
635
|
bad("semantic search silently off — %d-chunk vector store %s; "
|
|
636
|
-
"searches are using BM25. %s" % (st["chunks"], detail, fix)
|
|
636
|
+
"searches are using BM25. %s" % (st["chunks"], detail, fix),
|
|
637
|
+
wrap=True)
|
|
637
638
|
return
|
|
638
639
|
|
|
639
640
|
out.info("semantic search not configured — using the full-content BM25 "
|
|
640
|
-
"engine (%s)" % fix)
|
|
641
|
+
"engine (%s)" % fix, wrap=True)
|
|
641
642
|
|
|
642
643
|
|
|
643
644
|
def _print_skipped(skipped: list[dict]) -> None:
|
|
@@ -1010,7 +1011,7 @@ def cmd_conflict(argv):
|
|
|
1010
1011
|
if i in confirmed:
|
|
1011
1012
|
p["kind"] = "ai-confirmed"
|
|
1012
1013
|
elif heuristic and not args.json:
|
|
1013
|
-
out.warn(ai.fallback_note())
|
|
1014
|
+
out.warn(ai.fallback_note(), wrap=True)
|
|
1014
1015
|
|
|
1015
1016
|
if args.json:
|
|
1016
1017
|
print(json.dumps({"pairs": pairs}))
|
|
@@ -1058,8 +1059,10 @@ def cmd_changelog(argv):
|
|
|
1058
1059
|
if not lines:
|
|
1059
1060
|
out.warn("no history found for %s in %s" % (rel, tap.name))
|
|
1060
1061
|
if len(lines) < 3:
|
|
1061
|
-
|
|
1062
|
-
|
|
1062
|
+
note = ("(shallow clone: run `git -C %s fetch --unshallow` "
|
|
1063
|
+
"for full history)" % _tilde(tap.path))
|
|
1064
|
+
for line in out.wrap(note, max(out.term_width() - 2, 20)):
|
|
1065
|
+
print(out.role(" " + line, "muted"))
|
|
1063
1066
|
return 0
|
|
1064
1067
|
|
|
1065
1068
|
|
|
@@ -481,8 +481,14 @@ def cmd_protocol(argv) -> int:
|
|
|
481
481
|
if system == "Linux":
|
|
482
482
|
out.kv("desktop", _tilde(_desktop_file())
|
|
483
483
|
if _desktop_file().exists() else "not registered")
|
|
484
|
-
|
|
485
|
-
|
|
484
|
+
# One form per row rather than a `·`-joined run: the run was 100 columns,
|
|
485
|
+
# and wrapping it strands a bare `·` at the start of a line, because the
|
|
486
|
+
# separator is a word to any wrapper. A form per row needs no separator and
|
|
487
|
+
# reads the same at every width.
|
|
488
|
+
for i, form in enumerate(("boost://install/<skill>",
|
|
489
|
+
"boost://install/<tap>:<skill>",
|
|
490
|
+
"boost://tap/<owner>/<repo>")):
|
|
491
|
+
out.kv("URL forms" if i == 0 else "", form)
|
|
486
492
|
out.dim(" try it: boost protocol open boost://install/brainstorming")
|
|
487
493
|
return 0
|
|
488
494
|
|
|
@@ -713,7 +719,7 @@ def cmd_who(argv) -> int:
|
|
|
713
719
|
out.table(rows[:20], headers=("WHEN", "USER", "ACTION"))
|
|
714
720
|
print()
|
|
715
721
|
out.dim("based on the local journal — in a team setup, pulse feeds "
|
|
716
|
-
"aggregate via `boost onboard`")
|
|
722
|
+
"aggregate via `boost onboard`", wrap=True)
|
|
717
723
|
return 0
|
|
718
724
|
|
|
719
725
|
users: dict[str, dict] = {}
|
|
@@ -738,5 +744,5 @@ def cmd_who(argv) -> int:
|
|
|
738
744
|
out.table(board, headers=("USER", "EVENTS", "SKILLS", "INSTALLS", "LAST ACTIVE"))
|
|
739
745
|
print()
|
|
740
746
|
out.dim("based on the local journal — in a team setup, pulse feeds aggregate "
|
|
741
|
-
"via `boost onboard`")
|
|
747
|
+
"via `boost onboard`", wrap=True)
|
|
742
748
|
return 0
|
|
@@ -200,20 +200,38 @@ def gradient(text: str, stream=None) -> str:
|
|
|
200
200
|
return "".join(out)
|
|
201
201
|
|
|
202
202
|
|
|
203
|
+
def _wrap_lines(msg: str, lead: int) -> list[str]:
|
|
204
|
+
"""Wrap `msg` for an emitter whose own prefix costs `lead` columns.
|
|
205
|
+
|
|
206
|
+
Returns at least one line so an emitter never silently prints nothing for a
|
|
207
|
+
message it was given; the emitter decides what its prefix and continuation
|
|
208
|
+
padding look like.
|
|
209
|
+
"""
|
|
210
|
+
return wrap(msg, term_width() - lead) or [msg]
|
|
211
|
+
|
|
212
|
+
|
|
203
213
|
def ok(msg: str) -> None:
|
|
204
214
|
"""Print msg as an indented success line with a green check mark."""
|
|
205
215
|
print(" " + role("✓", "success") + " " + msg)
|
|
206
216
|
|
|
207
217
|
|
|
208
|
-
def warn(msg: str, stream=None) -> None:
|
|
218
|
+
def warn(msg: str, stream=None, wrap: bool = False) -> None:
|
|
209
219
|
"""Print msg as an indented `!` warning line, all in the warn role.
|
|
210
220
|
|
|
211
221
|
``stream`` exists for the commands that also speak JSON on stdout: a notice
|
|
212
222
|
about *which corpus answered* has to survive `--json`, and the old choice
|
|
213
223
|
was between corrupting the JSON and suppressing the notice entirely. Passing
|
|
214
224
|
``sys.stderr`` keeps both.
|
|
225
|
+
|
|
226
|
+
``wrap`` is opt-in per call site rather than always-on, because not every
|
|
227
|
+
long line is prose: `pulse`'s `source=` paths and `fingerprint`'s hash are
|
|
228
|
+
data, and folding those destroys the information the line exists to carry.
|
|
229
|
+
Prose hints pass it; data lines do not.
|
|
215
230
|
"""
|
|
216
|
-
|
|
231
|
+
body = _wrap_lines(msg, 4) if wrap else [msg]
|
|
232
|
+
for i, line in enumerate(body):
|
|
233
|
+
lead = " " + role("!", "warn") + " " if i == 0 else " "
|
|
234
|
+
print(lead + role(line, "warn"), file=stream)
|
|
217
235
|
|
|
218
236
|
|
|
219
237
|
def err(msg: str, hint: str | None = None) -> None:
|
|
@@ -223,11 +241,17 @@ def err(msg: str, hint: str | None = None) -> None:
|
|
|
223
241
|
print(c(" hint: " + hint, DIM), file=sys.stderr)
|
|
224
242
|
|
|
225
243
|
|
|
226
|
-
def info(msg: str = "", stream=None) -> None:
|
|
244
|
+
def info(msg: str = "", stream=None, wrap: bool = False) -> None:
|
|
227
245
|
"""Print msg indented two spaces; a blank line when msg is empty.
|
|
228
246
|
|
|
229
247
|
``stream`` as in :func:`warn` — so a hint can accompany a stderr notice.
|
|
248
|
+
``wrap`` as in :func:`warn`, and it never turns the empty message into no
|
|
249
|
+
output at all: a caller printing a blank spacer still gets its blank line.
|
|
230
250
|
"""
|
|
251
|
+
if wrap and msg:
|
|
252
|
+
for line in _wrap_lines(msg, 2):
|
|
253
|
+
print(" " + line, file=stream)
|
|
254
|
+
return
|
|
231
255
|
print(" " + msg if msg else "", file=stream)
|
|
232
256
|
|
|
233
257
|
|
|
@@ -252,9 +276,14 @@ def plain(text: object) -> str:
|
|
|
252
276
|
return _CONTROL_RE.sub("", str(text))
|
|
253
277
|
|
|
254
278
|
|
|
255
|
-
def dim(msg: str) -> None:
|
|
256
|
-
"""Print msg in the muted role (dim when color is on).
|
|
257
|
-
|
|
279
|
+
def dim(msg: str, wrap: bool = False) -> None:
|
|
280
|
+
"""Print msg in the muted role (dim when color is on).
|
|
281
|
+
|
|
282
|
+
``wrap`` as in :func:`warn`. `dim` prints flush left, so the wrapped
|
|
283
|
+
continuations are flush left too — there is no marker to align under.
|
|
284
|
+
"""
|
|
285
|
+
for line in (_wrap_lines(msg, 0) if wrap else [msg]):
|
|
286
|
+
print(role(line, "muted"))
|
|
258
287
|
|
|
259
288
|
|
|
260
289
|
def heading(msg: str) -> None:
|
|
@@ -310,6 +339,80 @@ def visible_len(s: str) -> int:
|
|
|
310
339
|
return len(_ANSI_RE.sub("", s))
|
|
311
340
|
|
|
312
341
|
|
|
342
|
+
_CODE_SPAN_RE = re.compile(r"`[^`]*`")
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def _wrap_tokens(text: str) -> list[str]:
|
|
346
|
+
"""Split text into wrap units, keeping each `code span` whole.
|
|
347
|
+
|
|
348
|
+
A backtick span is one token even though it contains spaces, because the
|
|
349
|
+
spans in boost's hints are shell commands the user is meant to select and
|
|
350
|
+
paste — `pip install 'boost-skill-cli[rag]'`. Everything outside a span is
|
|
351
|
+
split on whitespace, which collapses runs and newlines the way
|
|
352
|
+
:func:`truncate` does; the span itself is copied verbatim, so a command
|
|
353
|
+
that legitimately holds two spaces survives.
|
|
354
|
+
|
|
355
|
+
An unterminated backtick simply never matches, and its text wraps as
|
|
356
|
+
ordinary words. That is the right failure: a half-open span is a typo in
|
|
357
|
+
the message, not a reason to refuse to render it.
|
|
358
|
+
"""
|
|
359
|
+
parts: list[str] = []
|
|
360
|
+
pos = 0
|
|
361
|
+
for m in _CODE_SPAN_RE.finditer(text):
|
|
362
|
+
parts.extend(text[pos:m.start()].split())
|
|
363
|
+
parts.append(m.group(0))
|
|
364
|
+
pos = m.end()
|
|
365
|
+
parts.extend(text[pos:].split())
|
|
366
|
+
return parts
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def wrap(text: str, width: int | None = None, indent: str = "") -> list[str]:
|
|
370
|
+
"""Greedy word-wrap to `width` visible columns, never splitting a code span.
|
|
371
|
+
|
|
372
|
+
Returns one string per line: the first bare, the rest prefixed with
|
|
373
|
+
`indent`, and every one measured with :func:`visible_len` so a coloured
|
|
374
|
+
message is bounded by what the pane shows rather than by its byte count.
|
|
375
|
+
``width`` defaults to the live terminal.
|
|
376
|
+
|
|
377
|
+
**A token wider than the line is emitted whole and overflows.** That is
|
|
378
|
+
deliberate and it is the reason this is not `textwrap.wrap(break_long_words
|
|
379
|
+
=True)`: the tokens that hit this case are the backticked commands, and a
|
|
380
|
+
command chopped at column 80 is worse than useless — the user pastes it and
|
|
381
|
+
it fails. One long line the terminal soft-wraps still yields the right text
|
|
382
|
+
on a copy.
|
|
383
|
+
|
|
384
|
+
Empty (or all-whitespace) text wraps to no lines at all, so a caller can
|
|
385
|
+
tell "nothing to say" from "one blank line".
|
|
386
|
+
"""
|
|
387
|
+
width = term_width() if width is None else width
|
|
388
|
+
tokens = _wrap_tokens(text)
|
|
389
|
+
if not tokens:
|
|
390
|
+
return []
|
|
391
|
+
pad = visible_len(indent)
|
|
392
|
+
lines: list[str] = []
|
|
393
|
+
cur = ""
|
|
394
|
+
for tok in tokens:
|
|
395
|
+
# The first line spends the full width; every later one pays for the
|
|
396
|
+
# indent. No floor under the subtraction: a pane narrower than its own
|
|
397
|
+
# indent yields a limit no token can meet, and each token lands on its
|
|
398
|
+
# own line — which is the same answer a floor of 1 gives, because the
|
|
399
|
+
# fit test below is never satisfiable below 3 columns anyway.
|
|
400
|
+
limit = width if not lines else width - pad
|
|
401
|
+
if cur and visible_len(cur) + 1 + visible_len(tok) <= limit:
|
|
402
|
+
cur += " " + tok
|
|
403
|
+
else:
|
|
404
|
+
if cur:
|
|
405
|
+
lines.append(cur)
|
|
406
|
+
cur = tok
|
|
407
|
+
lines.append(cur)
|
|
408
|
+
return [lines[0]] + [indent + ln for ln in lines[1:]]
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
#: Alias for callers that take a ``wrap`` keyword argument of their own, which
|
|
412
|
+
#: would otherwise shadow the function inside their own body.
|
|
413
|
+
wrap_text = wrap
|
|
414
|
+
|
|
415
|
+
|
|
313
416
|
def panel(lines, title: str | None = None, hue: str = "cyan") -> str:
|
|
314
417
|
"""A rounded box around one or more lines, with an Aurora-tinted border and
|
|
315
418
|
an optional title set into the top rule — the terminal echo of the web
|
|
@@ -506,11 +609,23 @@ def format_search_row(name: str, desc: str, kind: str, tap: str, frac: float,
|
|
|
506
609
|
return row.rstrip()
|
|
507
610
|
|
|
508
611
|
|
|
509
|
-
def kv(key: str, value: str, width: int = 14) -> None:
|
|
510
|
-
"""Print an indented key/value line: dim key padded to width, then value.
|
|
612
|
+
def kv(key: str, value: str, width: int = 14, wrap: bool = False) -> None:
|
|
613
|
+
"""Print an indented key/value line: dim key padded to width, then value.
|
|
614
|
+
|
|
615
|
+
``wrap`` as in :func:`warn`, and the continuations align under the *value*
|
|
616
|
+
rather than the key — a value folded back to column 0 reads as a new row.
|
|
617
|
+
"""
|
|
511
618
|
# The str() is NOT redundant despite the annotation: callers pass raw ints
|
|
512
619
|
# (e.g. `boost impact` prints files_touched), which would raise TypeError.
|
|
513
|
-
|
|
620
|
+
text = str(value) # noqa: FURB123
|
|
621
|
+
if not wrap:
|
|
622
|
+
print(" " + c(key.ljust(width), DIM) + text)
|
|
623
|
+
return
|
|
624
|
+
lead = 2 + width
|
|
625
|
+
lines = wrap_text(text, term_width() - lead) or [text]
|
|
626
|
+
print(" " + c(key.ljust(width), DIM) + lines[0])
|
|
627
|
+
for line in lines[1:]:
|
|
628
|
+
print(" " * lead + line)
|
|
514
629
|
|
|
515
630
|
|
|
516
631
|
def _pad(cell: str, width: int) -> str:
|
|
@@ -383,6 +383,65 @@ def read_postings(terms: Sequence[str]) -> dict[str, list[list[int]]]:
|
|
|
383
383
|
return dict(out) # noqa: FURB123 out is a defaultdict; .copy() would keep the factory
|
|
384
384
|
|
|
385
385
|
|
|
386
|
+
# A query term shorter than this expands to noise: `cal` prefixes `calendar`,
|
|
387
|
+
# `calculate` and `callbacks` alike, and picking one of them for the user is a
|
|
388
|
+
# guess rather than a correction.
|
|
389
|
+
STEM_MIN_LEN = 4
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def stem_expansions(terms: Sequence[str]) -> dict[str, str]:
|
|
393
|
+
"""Map each term that indexes *nothing* to the commonest term it prefixes.
|
|
394
|
+
|
|
395
|
+
`tokenize` is exact-match, so a query term and its own inflection are
|
|
396
|
+
unrelated strings: `boost search brainstorm` returned zero matches while
|
|
397
|
+
`brainstorming` returned the skill, and `boost chat` had the same hole.
|
|
398
|
+
Measured over the 461 tap caches on one real machine, 4,663 of 29,607 item
|
|
399
|
+
names (15.7%) were unreachable by an attested stem — `pattern` missed 474
|
|
400
|
+
names ending `-patterns`, `skill` missed 252 ending `-skills`.
|
|
401
|
+
|
|
402
|
+
**A term that has postings is never expanded.** That is the whole safety
|
|
403
|
+
argument: this can only ever add signal where `_bm25` scored exactly none
|
|
404
|
+
(it skips a term with no posting list), so a query whose terms all exist
|
|
405
|
+
ranks byte-identically and the retrieval floors cannot move. It is also why
|
|
406
|
+
this is a fallback rather than a stemmer — a real stemmer conflates terms
|
|
407
|
+
that both exist, which changes established rankings and needs an index
|
|
408
|
+
format bump and a regenerated baseline.
|
|
409
|
+
|
|
410
|
+
Returns ``{}`` — never raises — when the store is missing or unreadable,
|
|
411
|
+
matching :func:`read_postings`.
|
|
412
|
+
"""
|
|
413
|
+
uniq = [t for t in dict.fromkeys(terms) if len(t) >= STEM_MIN_LEN]
|
|
414
|
+
if not uniq:
|
|
415
|
+
return {}
|
|
416
|
+
indexed = read_postings(uniq)
|
|
417
|
+
missing = [t for t in uniq if not indexed.get(t)]
|
|
418
|
+
if not missing:
|
|
419
|
+
return {}
|
|
420
|
+
try:
|
|
421
|
+
con = sqlite3.connect("file:%s?mode=ro" % postings_path(), uri=True)
|
|
422
|
+
except sqlite3.Error:
|
|
423
|
+
return {}
|
|
424
|
+
out: dict[str, str] = {}
|
|
425
|
+
try:
|
|
426
|
+
for term in missing:
|
|
427
|
+
# `tokenize` emits only [a-z0-9]+, and "~" sorts above every
|
|
428
|
+
# character it can produce — so this half-open range is exactly the
|
|
429
|
+
# terms beginning with `term`, and it rides the postings_term index
|
|
430
|
+
# instead of scanning. Ties break on the term itself so the choice
|
|
431
|
+
# is deterministic across machines.
|
|
432
|
+
row = con.execute(
|
|
433
|
+
"SELECT term FROM postings WHERE term > ? AND term < ? "
|
|
434
|
+
"GROUP BY term ORDER BY COUNT(*) DESC, term LIMIT 1",
|
|
435
|
+
(term, term + "~")).fetchone()
|
|
436
|
+
if row:
|
|
437
|
+
out[term] = row[0]
|
|
438
|
+
except sqlite3.Error:
|
|
439
|
+
return {}
|
|
440
|
+
finally:
|
|
441
|
+
con.close()
|
|
442
|
+
return out
|
|
443
|
+
|
|
444
|
+
|
|
386
445
|
def _all_postings() -> dict[str, list[list[int]]]:
|
|
387
446
|
"""Every posting — only the incremental rebuild path needs this."""
|
|
388
447
|
try:
|
|
@@ -804,6 +863,12 @@ def retrieve(query: str, k: int = 60, kind: str | None = None,
|
|
|
804
863
|
terms = tokenize(query)
|
|
805
864
|
if not terms:
|
|
806
865
|
return []
|
|
866
|
+
# Substitute before scoring, not after: the expanded term has to reach the
|
|
867
|
+
# snippet windowing too, or the hit is highlighted on a word it does not
|
|
868
|
+
# contain.
|
|
869
|
+
substitutions = stem_expansions(terms)
|
|
870
|
+
if substitutions:
|
|
871
|
+
terms = [substitutions.get(t, t) for t in terms]
|
|
807
872
|
docs = raw["docs"]
|
|
808
873
|
scores = _bm25(terms, raw, read_postings(terms))
|
|
809
874
|
if entries is None:
|
|
@@ -543,6 +543,7 @@ tests/functional/test_cli_discovery.py
|
|
|
543
543
|
tests/functional/test_cli_hooks.py
|
|
544
544
|
tests/functional/test_cli_info.py
|
|
545
545
|
tests/functional/test_cli_intelligence.py
|
|
546
|
+
tests/functional/test_cli_pane_width.py
|
|
546
547
|
tests/functional/test_cli_pkg.py
|
|
547
548
|
tests/functional/test_cli_quality.py
|
|
548
549
|
tests/functional/test_cli_taps.py
|
|
@@ -135,6 +135,20 @@ normalization, which matters when bodies vary from 3 lines to 300). Sparse term
|
|
|
135
135
|
Scoring is standard BM25 (`k1≈1.2`, `b≈0.75`). At ~9k items / tens of thousands of chunks this is a
|
|
136
136
|
dict-of-postings scan — comfortably sub-second per query in Python.
|
|
137
137
|
|
|
138
|
+
**Tokenization is exact-match, and `stem_expansions` is the one concession to that.**
|
|
139
|
+
A query term and its own inflection are unrelated strings, so `boost search brainstorm`
|
|
140
|
+
returned nothing while `brainstorming` returned the skill. Measured over 461 tap caches,
|
|
141
|
+
4,663 of 29,607 item names (15.7%) were unreachable by an attested stem — `pattern` missed
|
|
142
|
+
474 names ending `-patterns`. Before scoring, any term with **no** posting list is replaced
|
|
143
|
+
by the commonest term it prefixes, found with an index-backed range scan over the postings
|
|
144
|
+
table. A term that *has* postings is never touched: expansion only ever adds signal where
|
|
145
|
+
`_bm25` scored exactly none, so a query whose terms all exist ranks byte-identically and the
|
|
146
|
+
retrieval floors cannot move. That is what makes it a fallback rather than a stemmer — a real
|
|
147
|
+
stemmer conflates terms that both exist, which changes established rankings and would need an
|
|
148
|
+
index-format bump and a regenerated baseline. Terms shorter than `STEM_MIN_LEN` (4) are left
|
|
149
|
+
alone, because a three-letter prefix expands to a guess. `boost search` states the
|
|
150
|
+
substitution rather than silently answering a different question.
|
|
151
|
+
|
|
138
152
|
**Query path as shipped** (post `cold-search-reads-the-whole-catalogue`): with
|
|
139
153
|
`entries=None` — the CLI, MCP and eval path — `rag.retrieve` ranks straight off
|
|
140
154
|
the index's own doc metadata and materialises real catalog entries only for the
|
{boost_skill_cli-1.2.20 → boost_skill_cli-1.2.22}/docs/roadmap/items/bm25-has-no-stemming.md
RENAMED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
id: bm25-has-no-stemming
|
|
3
3
|
board: code
|
|
4
4
|
section: pipeline
|
|
5
|
-
status:
|
|
5
|
+
status: inflight
|
|
6
6
|
category: Search · Retrieval
|
|
7
7
|
complexity: M
|
|
8
8
|
impact: High
|
|
9
9
|
wow: 4
|
|
10
|
-
note:
|
|
10
|
+
note: a term with no postings is now replaced by the commonest term it prefixes; a term that has postings is never touched, which is what keeps the eval floors still
|
|
11
11
|
order: 127
|
|
12
|
-
owner:
|
|
12
|
+
owner: loop/bm25-stem-fallback
|
|
13
13
|
pr:
|
|
14
14
|
title: <code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it
|
|
15
15
|
---
|
|
@@ -41,10 +41,28 @@ BM25 path — which is what every user without the extra runs, what
|
|
|
41
41
|
<code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
|
|
42
42
|
easily reproduce a plain user's result.
|
|
43
43
|
|
|
44
|
-
<b>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
<b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
|
|
45
|
+
whole query returns zero hits — was drafted and rejected, because it does not fix the reported
|
|
46
|
+
case. <code>boost chat “what helps me brainstorm”</code> already returns non-empty
|
|
47
|
+
results from its other words, so a zero-hit trigger never fires and chat stays broken.
|
|
48
|
+
Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
|
|
49
|
+
term it prefixes, found by an index-backed range scan (<code>term > ? AND term < ?</code>,
|
|
50
|
+
upper bound <code>term + "~"</code> because <code>~</code> outranks every character
|
|
51
|
+
<code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
|
|
52
|
+
<code>analy</code> → <code>analyze</code>). Measured after: <code>search brainstorm</code>
|
|
53
|
+
returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
|
|
54
|
+
|
|
55
|
+
<b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
|
|
56
|
+
<em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
|
|
57
|
+
no posting list, so expansion can only add signal where there was exactly none — meaning any
|
|
58
|
+
query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
|
|
59
|
+
<code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
|
|
60
|
+
<code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
|
|
61
|
+
rewrites a query that already worked and fails. Nine hand-written mutants were run against the
|
|
62
|
+
new lines and all nine died, including that one.
|
|
63
|
+
|
|
64
|
+
<b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
|
|
65
|
+
inflection — a user typing <code>patterns</code> still will not reach an item named
|
|
66
|
+
<code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
|
|
67
|
+
Closing that means conflating terms that both exist, which changes established rankings and costs
|
|
68
|
+
an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.
|