boost-skill-cli 1.2.19__tar.gz → 1.2.21__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.19 → boost_skill_cli-1.2.21}/.vale/styles/config/vocabularies/boost/accept.txt +2 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/cli.py +37 -7
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/discovery.py +19 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/team.py +2 -2
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/output.py +12 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/rag.py +65 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/rag-architecture.md +14 -0
- boost_skill_cli-1.2.21/docs/roadmap/items/bm25-has-no-stemming.md +68 -0
- boost_skill_cli-1.2.21/docs/roadmap/items/cli-output-ignored-the-terminal.md +56 -0
- boost_skill_cli-1.2.21/docs/roadmap/items/long-hints-overflow-narrow-panes.md +38 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap.html +151 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_discovery.py +23 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_team.py +16 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_errors_and_cli_table.py +36 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_output.py +50 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rag.py +123 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.gitattributes +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.gitignore +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/.vale.ini +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/LICENSE +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/Makefile +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/codecov.yml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/index.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/self-update-claims-up-to-date-without-asking.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sweep-died-at-launch-not-at-a-page.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/sync-reported-success-for-a-link-it-refused.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-catalogue-advertised-repos-that-no-longer-exist.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-ignores-drift-and-make-lint-never-ran-it.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/examples/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/index.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/noxfile.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/setup.cfg +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/boost.css +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/boost.js +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/style/demo.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.21}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.2.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 2,
|
|
21
|
+
__version__ = version = '1.2.21'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 21)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -155,20 +155,50 @@ _GROUP_HUES = ("cyan", "violet", "pink", "green", "yellow")
|
|
|
155
155
|
|
|
156
156
|
|
|
157
157
|
def print_help() -> None:
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
"""The command index, fitted to the pane.
|
|
159
|
+
|
|
160
|
+
Every other screen in the CLI adapts — `search` drops the tap column and
|
|
161
|
+
truncates at 60 columns — while this one emitted a fixed 105-column banner
|
|
162
|
+
at every width and wrapped mid-word for anyone not running a wide
|
|
163
|
+
terminal. Names are never clipped, because the help's whole job is to be
|
|
164
|
+
an index you can copy a command out of; summaries are.
|
|
165
|
+
"""
|
|
166
|
+
cols = out.term_width()
|
|
167
|
+
|
|
168
|
+
title_line = out.gradient(PRODUCT) + " — Homebrew for AI coding skills"
|
|
169
|
+
stamp = "%s · v%s" % (TAGLINE, __version__)
|
|
170
|
+
if out.visible_len(title_line) + out.visible_len(stamp) + 4 <= cols:
|
|
171
|
+
print(title_line + out.c(" (%s)" % stamp, out.DIM))
|
|
172
|
+
else:
|
|
173
|
+
print(title_line)
|
|
174
|
+
# The tagline is the first thing to go; the version never is, because
|
|
175
|
+
# it is what a bug report needs.
|
|
176
|
+
print(out.c(stamp if out.visible_len(stamp) <= cols
|
|
177
|
+
else "v%s" % __version__, out.DIM))
|
|
160
178
|
print()
|
|
161
|
-
|
|
162
|
-
|
|
179
|
+
|
|
180
|
+
usage = out.c("Usage:", out.BOLD) + " boost <command> [args]"
|
|
181
|
+
detail = out.c("boost help <command> for details", out.DIM)
|
|
182
|
+
if out.visible_len(usage) + out.visible_len(detail) + 3 <= cols:
|
|
183
|
+
print(usage + " " + detail)
|
|
184
|
+
else:
|
|
185
|
+
print(usage)
|
|
186
|
+
print(" " + detail)
|
|
187
|
+
|
|
163
188
|
width = max(len(n) for n, _, _, _ in COMMANDS)
|
|
164
189
|
for idx, (gkey, (_icon, title, desc)) in enumerate(GROUPS.items()):
|
|
165
190
|
cmds = [(n, s) for n, g, _m, s in COMMANDS if g == gkey]
|
|
166
191
|
bullet = out.aurora("●", _GROUP_HUES[idx % len(_GROUP_HUES)])
|
|
167
192
|
print()
|
|
168
|
-
|
|
169
|
-
|
|
193
|
+
head = bullet + " " + out.c(title, out.BOLD)
|
|
194
|
+
room = cols - len(title) - 6 # "● " + title + " — "
|
|
195
|
+
if room >= 8:
|
|
196
|
+
print(head + out.c(" — %s" % out.truncate(desc, room), out.DIM))
|
|
197
|
+
else:
|
|
198
|
+
print(head)
|
|
170
199
|
for n, s in cmds:
|
|
171
|
-
print(" " + out.c(n.ljust(width + 2), out.CYAN)
|
|
200
|
+
print(" " + out.c(n.ljust(width + 2), out.CYAN)
|
|
201
|
+
+ out.truncate(s, max(0, cols - width - 4)))
|
|
172
202
|
print()
|
|
173
203
|
print(out.c("%d commands · %d groups" % (len(COMMANDS), len(GROUPS)), out.DIM))
|
|
174
204
|
|
|
@@ -176,10 +176,29 @@ def cmd_search(argv):
|
|
|
176
176
|
installed=e["name"] in installed, lay=lay))
|
|
177
177
|
out.info(out.role("%d match%s · ranked by %s"
|
|
178
178
|
% (len(scored), "" if len(scored) == 1 else "es", ranker), "muted"))
|
|
179
|
+
if use_rag:
|
|
180
|
+
_note_stem_expansions(query)
|
|
179
181
|
_hint_semantic_search(engine)
|
|
180
182
|
return 0
|
|
181
183
|
|
|
182
184
|
|
|
185
|
+
def _note_stem_expansions(query: str) -> None:
|
|
186
|
+
"""Say when a query term was widened to the word actually indexed.
|
|
187
|
+
|
|
188
|
+
Staying quiet would be a worse answer than the old empty one: the user
|
|
189
|
+
asked for `brainstorm` and is looking at results for `brainstorming`, and
|
|
190
|
+
only one of those is a word they typed.
|
|
191
|
+
"""
|
|
192
|
+
subs = rag.stem_expansions(rag.tokenize(query))
|
|
193
|
+
if not subs:
|
|
194
|
+
return
|
|
195
|
+
said = ", ".join("%r" % term for term in subs)
|
|
196
|
+
shown = ", ".join("%r" % term for term in subs.values())
|
|
197
|
+
out.info(out.role(out.truncate(
|
|
198
|
+
"no exact match for %s — showing %s" % (said, shown),
|
|
199
|
+
max(0, out.term_width() - 2)), "muted"))
|
|
200
|
+
|
|
201
|
+
|
|
183
202
|
def _hint_semantic_search(engine: str) -> None:
|
|
184
203
|
"""Say that a better engine exists, when BM25 answered alone.
|
|
185
204
|
|
|
@@ -69,7 +69,7 @@ def cmd_cohort(argv) -> int:
|
|
|
69
69
|
p = cliparse.parser(
|
|
70
70
|
prog="boost cohort",
|
|
71
71
|
description="Controlled skill rollouts & team A/B testing",
|
|
72
|
-
epilog="Membership is a deterministic hash of user+cohort, so a 50
|
|
72
|
+
epilog="Membership is a deterministic hash of user+cohort, so a 50% "
|
|
73
73
|
"rollout lands on the same half of the team every time. "
|
|
74
74
|
"This machine evaluates its own membership locally.")
|
|
75
75
|
p.add_argument("action", nargs="?", default="list",
|
|
@@ -177,7 +177,7 @@ def cmd_cohort(argv) -> int:
|
|
|
177
177
|
return 0
|
|
178
178
|
out.table(rows, headers=("COHORT", "SKILLS", "ROLLOUT", "YOU"))
|
|
179
179
|
print()
|
|
180
|
-
out.dim("membership = sha256(user:cohort)
|
|
180
|
+
out.dim("membership = sha256(user:cohort) % 100 < rollout · apply with `boost cohort apply`")
|
|
181
181
|
return 0
|
|
182
182
|
|
|
183
183
|
|
|
@@ -317,9 +317,20 @@ def panel(lines, title: str | None = None, hue: str = "cyan") -> str:
|
|
|
317
317
|
"""
|
|
318
318
|
if isinstance(lines, str):
|
|
319
319
|
lines = [lines]
|
|
320
|
+
# The border costs four columns — "\u2502 " on the left, " \u2502" on the right —
|
|
321
|
+
# so that is what the content may not exceed. Without this the box sized
|
|
322
|
+
# itself to its content and sailed past the pane: `boost count` drew 108
|
|
323
|
+
# columns into an 80-column terminal, and a box whose border wraps is the
|
|
324
|
+
# worst-looking overflow the CLI has, because the shape itself breaks.
|
|
325
|
+
room = term_width() - 4
|
|
326
|
+
if title:
|
|
327
|
+
title = _clip_visible(title, room - 2)
|
|
328
|
+
lines = [_clip_visible(x, room) for x in lines]
|
|
320
329
|
widths = [visible_len(x) for x in lines]
|
|
321
330
|
tw = visible_len(title) if title else 0
|
|
322
|
-
|
|
331
|
+
# A titled rule needs a space each side, hence the +2 / -2. Clipping above
|
|
332
|
+
# already bounds every width by `room`, so no second clamp is needed here.
|
|
333
|
+
inner = max([*widths, tw + 2])
|
|
323
334
|
|
|
324
335
|
def b(s: str) -> str:
|
|
325
336
|
return aurora(s, hue)
|
|
@@ -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:
|
|
@@ -191,6 +191,7 @@ docs/roadmap/items/ambiguous-tap-short-name-resolution.md
|
|
|
191
191
|
docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
|
|
192
192
|
docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
|
|
193
193
|
docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
|
|
194
|
+
docs/roadmap/items/bm25-has-no-stemming.md
|
|
194
195
|
docs/roadmap/items/bm25-index-is-one-json-blob.md
|
|
195
196
|
docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md
|
|
196
197
|
docs/roadmap/items/boost-first-carried-the-losing-trigger.md
|
|
@@ -211,6 +212,7 @@ docs/roadmap/items/ci-job-timeout-minutes.md
|
|
|
211
212
|
docs/roadmap/items/ci-summary-step-fails-itself.md
|
|
212
213
|
docs/roadmap/items/ci-time-is-now-runner-queueing.md
|
|
213
214
|
docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md
|
|
215
|
+
docs/roadmap/items/cli-output-ignored-the-terminal.md
|
|
214
216
|
docs/roadmap/items/code-scanning-rule-can-be-restored.md
|
|
215
217
|
docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md
|
|
216
218
|
docs/roadmap/items/cold-search-reads-the-whole-catalogue.md
|
|
@@ -296,6 +298,7 @@ docs/roadmap/items/localize-the-stored-bm25-snippet.md
|
|
|
296
298
|
docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md
|
|
297
299
|
docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md
|
|
298
300
|
docs/roadmap/items/log-timestamps-mislabeled-utc.md
|
|
301
|
+
docs/roadmap/items/long-hints-overflow-narrow-panes.md
|
|
299
302
|
docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md
|
|
300
303
|
docs/roadmap/items/main-has-no-branch-protection.md
|
|
301
304
|
docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md
|
|
@@ -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
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: bm25-has-no-stemming
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: inflight
|
|
6
|
+
category: Search · Retrieval
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
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
|
+
order: 127
|
|
12
|
+
owner: loop/bm25-stem-fallback
|
|
13
|
+
pr:
|
|
14
|
+
title: <code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it
|
|
15
|
+
---
|
|
16
|
+
<b>The symptom, in two commands against the same five-skill tap.</b>
|
|
17
|
+
<code>boost search brainstorming</code> returns the skill.
|
|
18
|
+
<code>boost search brainstorm</code> returns <b>zero</b> matches and sends the user to
|
|
19
|
+
<code>boost discover</code> to search all of GitHub for something already sitting in their
|
|
20
|
+
catalogue. <code>boost chat "what helps me brainstorm"</code> has the same hole and answers with
|
|
21
|
+
two unrelated skills. <code>core/rag.tokenize</code> lowercases, splits on non-alphanumerics and
|
|
22
|
+
drops a small stopword list — there is no stemming and no prefix fallback, so
|
|
23
|
+
<code>brainstorm</code> and <code>brainstorming</code> are simply different terms.
|
|
24
|
+
|
|
25
|
+
<b>Measured on the 461 tap caches on this machine: 29,607 distinct item names, 9,739 distinct
|
|
26
|
+
name tokens.</b> <b>4,663 of those names (15.7%)</b> carry a token whose stem finds nothing —
|
|
27
|
+
counting only stems that appear at least five times elsewhere in the corpus, so each is
|
|
28
|
+
demonstrably a word people type rather than an artefact of naive suffix stripping. The worst are
|
|
29
|
+
not exotic: <code>pattern</code> misses <b>474</b> names ending <code>-patterns</code>,
|
|
30
|
+
<code>skill</code> misses <b>252</b> ending <code>-skills</code>, <code>implement</code> misses
|
|
31
|
+
161, <code>event</code> 115, <code>error</code> 112, <code>webhook</code> 109,
|
|
32
|
+
<code>agent</code> 83, <code>market</code> 81 named <code>-marketing</code>. A user searching
|
|
33
|
+
this catalogue for <code>skill</code> cannot reach a quarter of a thousand items named for it.
|
|
34
|
+
|
|
35
|
+
<b>It is invisible from a developer install, which is why it survived.</b> This machine has the
|
|
36
|
+
<code>[rag]</code> extra and a built dense store, so search reports <code>hybrid RRF (BM25 +
|
|
37
|
+
dense)</code> and the embeddings absorb the morphology: <code>webhook</code> returns 51 matches
|
|
38
|
+
and <code>webhooks</code> returns 47. The gap is only visible on the always-on, zero-dependency
|
|
39
|
+
BM25 path — which is what every user without the extra runs, what
|
|
40
|
+
<code>search</code> prints <code>semantic search is off</code> for, and what the required
|
|
41
|
+
<code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
|
|
42
|
+
easily reproduce a plain user's result.
|
|
43
|
+
|
|
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>.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: cli-output-ignored-the-terminal
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: inflight
|
|
6
|
+
category: CLI · Output
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Med
|
|
9
|
+
wow: 3
|
|
10
|
+
note: an 80-command sweep found a box that drew wider than the pane, a help screen that never measured it, and a literal %% on screen
|
|
11
|
+
order: 125
|
|
12
|
+
owner: loop/cli-output-defects
|
|
13
|
+
pr: 552
|
|
14
|
+
title: The box drew 108 columns into an 80-column pane, and <code>--help</code> never asked how wide the pane was
|
|
15
|
+
---
|
|
16
|
+
<b>Every one of the 80 commands was run, not just read.</b> All 80 answered
|
|
17
|
+
<code>--help</code> with exit 0 and no traceback; ~73 were then driven for their real effect
|
|
18
|
+
against a disposable <code>HOME</code> — install, link, quarantine, focus, snapshot, replay,
|
|
19
|
+
cohort, hooks and the rest, checking the filesystem after each rather than trusting the success
|
|
20
|
+
line. <code>boost focus tdd-workflow</code> was confirmed by listing
|
|
21
|
+
<code>~/.claude/skills</code> and finding the other two skills genuinely unlinked with the
|
|
22
|
+
canonical store intact, and <code>focus --clear</code> by finding all three back. Seven commands
|
|
23
|
+
could not run here and are recorded as blocked rather than passed: <code>serve</code> (the
|
|
24
|
+
sandbox denies <code>socket.bind</code>), <code>discover</code> and <code>index</code> (no
|
|
25
|
+
<code>gh</code> auth), <code>run</code> live (no Agents SDK — <code>--print</code> was verified
|
|
26
|
+
instead), plus the interactive halves of <code>browse</code>, <code>chat</code> and
|
|
27
|
+
<code>edit</code>, each of which degraded with a correct hint.
|
|
28
|
+
|
|
29
|
+
<b>A literal <code>%%</code> was reaching the terminal.</b>
|
|
30
|
+
<code>boost cohort</code> printed <code>sha256(user:cohort) %% 100 < rollout</code> and its
|
|
31
|
+
<code>--help</code> epilog offered <code>a 50%% rollout</code>. Both strings carry printf
|
|
32
|
+
escaping and neither is ever <code>%</code>-formatted, so the escape survived to the screen. The
|
|
33
|
+
existing test asserted <code>"membership = sha256(user:cohort)" in r.out</code> — it stops one
|
|
34
|
+
character short of the defect, which is exactly how it survived. Four other <code>%%</code> in
|
|
35
|
+
the same file are correct: they sit inside real <code>%</code>-format calls, including the
|
|
36
|
+
<code>Exec=%s %%u</code> that a <code>.desktop</code> file requires.
|
|
37
|
+
|
|
38
|
+
<b><code>panel()</code> sized itself to its content and never asked the terminal.</b> Measured:
|
|
39
|
+
<code>boost count</code> drew <b>108 columns into an 80-column pane</b>. A box is the worst
|
|
40
|
+
thing to overflow, because the border wraps and the shape itself breaks. It now clamps to
|
|
41
|
+
<code>term_width() - 4</code> — the four columns the border costs — and clips over-long content,
|
|
42
|
+
so every row stays the same width at any pane size.
|
|
43
|
+
|
|
44
|
+
<b>The help screen was the one screen that never measured the pane.</b>
|
|
45
|
+
<code>search</code> already adapts, dropping the tap column and truncating at 60 columns —
|
|
46
|
+
<code>term_width()</code> existed and <code>discovery.py</code> was its only caller. Meanwhile
|
|
47
|
+
<code>boost --help</code>, the first thing a new user sees, emitted a fixed <b>102-column</b>
|
|
48
|
+
banner at every width. It now fits exactly at 60, 80 and 100. Command <em>names</em> are never
|
|
49
|
+
clipped, because the help's whole job is to be an index you can copy a command out of; summaries
|
|
50
|
+
and the tagline are. The version never is — it is what a bug report needs.
|
|
51
|
+
|
|
52
|
+
<b>Two findings were measured and deliberately left for their own items.</b> Eleven commands
|
|
53
|
+
still overflow 80 columns, but the remainder are prose hints, and the worst of them is one shared
|
|
54
|
+
string that six test files and a BDD feature pin by substring — wrapping it is a cross-cutting
|
|
55
|
+
output change, not a rider on this one. See <code>long-hints-overflow-narrow-panes</code> and
|
|
56
|
+
<code>bm25-has-no-stemming</code>.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: long-hints-overflow-narrow-panes
|
|
3
|
+
board: code
|
|
4
|
+
section: dx
|
|
5
|
+
status: next
|
|
6
|
+
category: CLI · Output
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: Low
|
|
9
|
+
wow: 2
|
|
10
|
+
note: 11 commands still emit prose hints past 80 columns; the worst is one string pinned by six test files
|
|
11
|
+
order: 126
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: The hints still run past the pane, and the worst one is pinned by six test files
|
|
15
|
+
---
|
|
16
|
+
<b>Measured, at <code>COLUMNS=80</code>, over 46 commands.</b> After the box and the help screen
|
|
17
|
+
were fitted, <b>11</b> still emit a line past 80 columns. Ranked:
|
|
18
|
+
<code>doctor</code>'s semantic-search hint at <b>127</b>; the AI-fallback notice at <b>101</b>,
|
|
19
|
+
which is one shared string surfacing in <code>explain</code>, <code>impact</code> and
|
|
20
|
+
<code>simulate</code>; <code>protocol</code>'s URL forms at 100; <code>changelog</code>'s
|
|
21
|
+
unshallow hint at 93; <code>who</code>'s footer at 87; <code>search</code>'s extra hint at 82;
|
|
22
|
+
<code>replay</code>'s footer at 81.
|
|
23
|
+
|
|
24
|
+
<b>Two of the eleven must be left alone.</b> <code>pulse</code>'s <code>source=</code> paths and
|
|
25
|
+
<code>fingerprint</code>'s hash are data, not chrome — clipping them destroys the information the
|
|
26
|
+
line exists to carry. So a blanket "no line exceeds <code>term_width()</code>" assertion is the
|
|
27
|
+
wrong gate: it would false-positive on exactly the lines that should be long. Pin the composed
|
|
28
|
+
sites individually.
|
|
29
|
+
|
|
30
|
+
<b>Why this is not a quick wrap.</b> The 101-column offender contains
|
|
31
|
+
<code>using the heuristic fallback</code>, which is asserted by <b>six</b> test files plus
|
|
32
|
+
<code>tests/bdd/features/explain.feature</code>. Wrapping inserts a newline mid-sentence and
|
|
33
|
+
breaks every one of them; and under pytest <code>term_width()</code> falls back to 80, so the
|
|
34
|
+
wrap fires in the suite rather than only on a narrow terminal. The change is a
|
|
35
|
+
<code>wrap()</code> helper in <code>core/output.py</code> — mutation-gated, so boundary-width
|
|
36
|
+
tests, not coverage — plus re-pinning those assertions. Shortening the strings instead is a
|
|
37
|
+
smaller diff but a voice decision, and the substring pinned by the tests would have to survive
|
|
38
|
+
either way.
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
134
134
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
135
135
|
<div class="stat"><b>7</b><span>Planned</span></div>
|
|
136
|
-
<div class="stat"><b>
|
|
136
|
+
<div class="stat"><b>267</b><span>Loop finds</span></div>
|
|
137
137
|
<!-- /ROADMAP:stats -->
|
|
138
138
|
</div>
|
|
139
139
|
</section>
|
|
@@ -7053,6 +7053,70 @@ state where that line is the advice.</p>
|
|
|
7053
7053
|
<span class="m">0.94 s cold search at 71.6k entries — ~0.5 s spent materialising data the top hits never use</span>
|
|
7054
7054
|
</div>
|
|
7055
7055
|
</article>
|
|
7056
|
+
|
|
7057
|
+
<article class="cap rcard" id="bm25-has-no-stemming">
|
|
7058
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">Search · Retrieval</span></div>
|
|
7059
|
+
<h3><code>boost search brainstorm</code> finds nothing, and <code>brainstorming</code> finds it</h3>
|
|
7060
|
+
<p><b>The symptom, in two commands against the same five-skill tap.</b>
|
|
7061
|
+
<code>boost search brainstorming</code> returns the skill.
|
|
7062
|
+
<code>boost search brainstorm</code> returns <b>zero</b> matches and sends the user to
|
|
7063
|
+
<code>boost discover</code> to search all of GitHub for something already sitting in their
|
|
7064
|
+
catalogue. <code>boost chat "what helps me brainstorm"</code> has the same hole and answers with
|
|
7065
|
+
two unrelated skills. <code>core/rag.tokenize</code> lowercases, splits on non-alphanumerics and
|
|
7066
|
+
drops a small stopword list — there is no stemming and no prefix fallback, so
|
|
7067
|
+
<code>brainstorm</code> and <code>brainstorming</code> are simply different terms.
|
|
7068
|
+
|
|
7069
|
+
<b>Measured on the 461 tap caches on this machine: 29,607 distinct item names, 9,739 distinct
|
|
7070
|
+
name tokens.</b> <b>4,663 of those names (15.7%)</b> carry a token whose stem finds nothing —
|
|
7071
|
+
counting only stems that appear at least five times elsewhere in the corpus, so each is
|
|
7072
|
+
demonstrably a word people type rather than an artefact of naive suffix stripping. The worst are
|
|
7073
|
+
not exotic: <code>pattern</code> misses <b>474</b> names ending <code>-patterns</code>,
|
|
7074
|
+
<code>skill</code> misses <b>252</b> ending <code>-skills</code>, <code>implement</code> misses
|
|
7075
|
+
161, <code>event</code> 115, <code>error</code> 112, <code>webhook</code> 109,
|
|
7076
|
+
<code>agent</code> 83, <code>market</code> 81 named <code>-marketing</code>. A user searching
|
|
7077
|
+
this catalogue for <code>skill</code> cannot reach a quarter of a thousand items named for it.
|
|
7078
|
+
|
|
7079
|
+
<b>It is invisible from a developer install, which is why it survived.</b> This machine has the
|
|
7080
|
+
<code>[rag]</code> extra and a built dense store, so search reports <code>hybrid RRF (BM25 +
|
|
7081
|
+
dense)</code> and the embeddings absorb the morphology: <code>webhook</code> returns 51 matches
|
|
7082
|
+
and <code>webhooks</code> returns 47. The gap is only visible on the always-on, zero-dependency
|
|
7083
|
+
BM25 path — which is what every user without the extra runs, what
|
|
7084
|
+
<code>search</code> prints <code>semantic search is off</code> for, and what the required
|
|
7085
|
+
<code>eval</code> gate floors. There is no <code>--engine</code> flag, so a maintainer cannot
|
|
7086
|
+
easily reproduce a plain user's result.
|
|
7087
|
+
|
|
7088
|
+
<b>What shipped: per-term expansion, not per-query.</b> The obvious design — widen only when the
|
|
7089
|
+
whole query returns zero hits — was drafted and rejected, because it does not fix the reported
|
|
7090
|
+
case. <code>boost chat “what helps me brainstorm”</code> already returns non-empty
|
|
7091
|
+
results from its other words, so a zero-hit trigger never fires and chat stays broken.
|
|
7092
|
+
Expansion is therefore per-term: a term with <b>no</b> posting list is replaced by the commonest
|
|
7093
|
+
term it prefixes, found by an index-backed range scan (<code>term > ? AND term < ?</code>,
|
|
7094
|
+
upper bound <code>term + "~"</code> because <code>~</code> outranks every character
|
|
7095
|
+
<code>tokenize</code> can emit — a bound of <code>"z"</code> silently loses
|
|
7096
|
+
<code>analy</code> → <code>analyze</code>). Measured after: <code>search brainstorm</code>
|
|
7097
|
+
returns the skill, and the chat question promotes it from <em>absent</em> to <b>rank 1</b>.
|
|
7098
|
+
|
|
7099
|
+
<b>The invariant is the whole safety argument, and it is a test rather than a comment.</b>
|
|
7100
|
+
<em>A term that has postings is never expanded.</em> <code>_bm25</code> already skips a term with
|
|
7101
|
+
no posting list, so expansion can only add signal where there was exactly none — meaning any
|
|
7102
|
+
query whose terms all exist ranks byte-identically and the four retrieval floors cannot move.
|
|
7103
|
+
<code>test_a_term_that_has_postings_is_never_expanded</code> pins it against a corpus where
|
|
7104
|
+
<code>pattern</code> and <code>patterns</code> both exist, so a build that dropped the guard
|
|
7105
|
+
rewrites a query that already worked and fails. Nine hand-written mutants were run against the
|
|
7106
|
+
new lines and all nine died, including that one.
|
|
7107
|
+
|
|
7108
|
+
<b>Still open: a real stemmer.</b> This fallback cannot help where a term exists but is the wrong
|
|
7109
|
+
inflection — a user typing <code>patterns</code> still will not reach an item named
|
|
7110
|
+
<code>pattern</code>, because <code>patterns</code> has postings of its own and is left alone.
|
|
7111
|
+
Closing that means conflating terms that both exist, which changes established rankings and costs
|
|
7112
|
+
an index-format bump plus a regenerated <code>tests/eval/baseline.json</code>.</p>
|
|
7113
|
+
<div class="meta">
|
|
7114
|
+
<span class="m">Complexity <b>M</b></span>
|
|
7115
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
7116
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
7117
|
+
<span class="m">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</span>
|
|
7118
|
+
</div>
|
|
7119
|
+
</article>
|
|
7056
7120
|
<!-- /ROADMAP:cards -->
|
|
7057
7121
|
|
|
7058
7122
|
</div>
|
|
@@ -9009,6 +9073,92 @@ the same search from 0.94 s to 0.49 s.</p>
|
|
|
9009
9073
|
<span class="m">MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one</span>
|
|
9010
9074
|
</div>
|
|
9011
9075
|
</article>
|
|
9076
|
+
|
|
9077
|
+
<article class="cap rcard" id="cli-output-ignored-the-terminal">
|
|
9078
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">CLI · Output</span></div>
|
|
9079
|
+
<h3>The box drew 108 columns into an 80-column pane, and <code>--help</code> never asked how wide the pane was</h3>
|
|
9080
|
+
<p><b>Every one of the 80 commands was run, not just read.</b> All 80 answered
|
|
9081
|
+
<code>--help</code> with exit 0 and no traceback; ~73 were then driven for their real effect
|
|
9082
|
+
against a disposable <code>HOME</code> — install, link, quarantine, focus, snapshot, replay,
|
|
9083
|
+
cohort, hooks and the rest, checking the filesystem after each rather than trusting the success
|
|
9084
|
+
line. <code>boost focus tdd-workflow</code> was confirmed by listing
|
|
9085
|
+
<code>~/.claude/skills</code> and finding the other two skills genuinely unlinked with the
|
|
9086
|
+
canonical store intact, and <code>focus --clear</code> by finding all three back. Seven commands
|
|
9087
|
+
could not run here and are recorded as blocked rather than passed: <code>serve</code> (the
|
|
9088
|
+
sandbox denies <code>socket.bind</code>), <code>discover</code> and <code>index</code> (no
|
|
9089
|
+
<code>gh</code> auth), <code>run</code> live (no Agents SDK — <code>--print</code> was verified
|
|
9090
|
+
instead), plus the interactive halves of <code>browse</code>, <code>chat</code> and
|
|
9091
|
+
<code>edit</code>, each of which degraded with a correct hint.
|
|
9092
|
+
|
|
9093
|
+
<b>A literal <code>%%</code> was reaching the terminal.</b>
|
|
9094
|
+
<code>boost cohort</code> printed <code>sha256(user:cohort) %% 100 < rollout</code> and its
|
|
9095
|
+
<code>--help</code> epilog offered <code>a 50%% rollout</code>. Both strings carry printf
|
|
9096
|
+
escaping and neither is ever <code>%</code>-formatted, so the escape survived to the screen. The
|
|
9097
|
+
existing test asserted <code>"membership = sha256(user:cohort)" in r.out</code> — it stops one
|
|
9098
|
+
character short of the defect, which is exactly how it survived. Four other <code>%%</code> in
|
|
9099
|
+
the same file are correct: they sit inside real <code>%</code>-format calls, including the
|
|
9100
|
+
<code>Exec=%s %%u</code> that a <code>.desktop</code> file requires.
|
|
9101
|
+
|
|
9102
|
+
<b><code>panel()</code> sized itself to its content and never asked the terminal.</b> Measured:
|
|
9103
|
+
<code>boost count</code> drew <b>108 columns into an 80-column pane</b>. A box is the worst
|
|
9104
|
+
thing to overflow, because the border wraps and the shape itself breaks. It now clamps to
|
|
9105
|
+
<code>term_width() - 4</code> — the four columns the border costs — and clips over-long content,
|
|
9106
|
+
so every row stays the same width at any pane size.
|
|
9107
|
+
|
|
9108
|
+
<b>The help screen was the one screen that never measured the pane.</b>
|
|
9109
|
+
<code>search</code> already adapts, dropping the tap column and truncating at 60 columns —
|
|
9110
|
+
<code>term_width()</code> existed and <code>discovery.py</code> was its only caller. Meanwhile
|
|
9111
|
+
<code>boost --help</code>, the first thing a new user sees, emitted a fixed <b>102-column</b>
|
|
9112
|
+
banner at every width. It now fits exactly at 60, 80 and 100. Command <em>names</em> are never
|
|
9113
|
+
clipped, because the help's whole job is to be an index you can copy a command out of; summaries
|
|
9114
|
+
and the tagline are. The version never is — it is what a bug report needs.
|
|
9115
|
+
|
|
9116
|
+
<b>Two findings were measured and deliberately left for their own items.</b> Eleven commands
|
|
9117
|
+
still overflow 80 columns, but the remainder are prose hints, and the worst of them is one shared
|
|
9118
|
+
string that six test files and a BDD feature pin by substring — wrapping it is a cross-cutting
|
|
9119
|
+
output change, not a rider on this one. See <code>long-hints-overflow-narrow-panes</code> and
|
|
9120
|
+
<code>bm25-has-no-stemming</code>.</p>
|
|
9121
|
+
<div class="meta">
|
|
9122
|
+
<span class="m">Complexity <b>S</b></span>
|
|
9123
|
+
<span class="m">Impact <b>Med</b></span>
|
|
9124
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
9125
|
+
<span class="m">an 80-command sweep found a box that drew wider than the pane, a help screen that never measured it, and a literal %% on screen</span>
|
|
9126
|
+
</div>
|
|
9127
|
+
</article>
|
|
9128
|
+
|
|
9129
|
+
<article class="cap rcard" id="long-hints-overflow-narrow-panes">
|
|
9130
|
+
<div class="head"><span class="pill next">Next</span><span class="cat">CLI · Output</span></div>
|
|
9131
|
+
<h3>The hints still run past the pane, and the worst one is pinned by six test files</h3>
|
|
9132
|
+
<p><b>Measured, at <code>COLUMNS=80</code>, over 46 commands.</b> After the box and the help screen
|
|
9133
|
+
were fitted, <b>11</b> still emit a line past 80 columns. Ranked:
|
|
9134
|
+
<code>doctor</code>'s semantic-search hint at <b>127</b>; the AI-fallback notice at <b>101</b>,
|
|
9135
|
+
which is one shared string surfacing in <code>explain</code>, <code>impact</code> and
|
|
9136
|
+
<code>simulate</code>; <code>protocol</code>'s URL forms at 100; <code>changelog</code>'s
|
|
9137
|
+
unshallow hint at 93; <code>who</code>'s footer at 87; <code>search</code>'s extra hint at 82;
|
|
9138
|
+
<code>replay</code>'s footer at 81.
|
|
9139
|
+
|
|
9140
|
+
<b>Two of the eleven must be left alone.</b> <code>pulse</code>'s <code>source=</code> paths and
|
|
9141
|
+
<code>fingerprint</code>'s hash are data, not chrome — clipping them destroys the information the
|
|
9142
|
+
line exists to carry. So a blanket "no line exceeds <code>term_width()</code>" assertion is the
|
|
9143
|
+
wrong gate: it would false-positive on exactly the lines that should be long. Pin the composed
|
|
9144
|
+
sites individually.
|
|
9145
|
+
|
|
9146
|
+
<b>Why this is not a quick wrap.</b> The 101-column offender contains
|
|
9147
|
+
<code>using the heuristic fallback</code>, which is asserted by <b>six</b> test files plus
|
|
9148
|
+
<code>tests/bdd/features/explain.feature</code>. Wrapping inserts a newline mid-sentence and
|
|
9149
|
+
breaks every one of them; and under pytest <code>term_width()</code> falls back to 80, so the
|
|
9150
|
+
wrap fires in the suite rather than only on a narrow terminal. The change is a
|
|
9151
|
+
<code>wrap()</code> helper in <code>core/output.py</code> — mutation-gated, so boundary-width
|
|
9152
|
+
tests, not coverage — plus re-pinning those assertions. Shortening the strings instead is a
|
|
9153
|
+
smaller diff but a voice decision, and the substring pinned by the tests would have to survive
|
|
9154
|
+
either way.</p>
|
|
9155
|
+
<div class="meta">
|
|
9156
|
+
<span class="m">Complexity <b>M</b></span>
|
|
9157
|
+
<span class="m">Impact <b>Low</b></span>
|
|
9158
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
9159
|
+
<span class="m">11 commands still emit prose hints past 80 columns; the worst is one string pinned by six test files</span>
|
|
9160
|
+
</div>
|
|
9161
|
+
</article>
|
|
9012
9162
|
<!-- /ROADMAP:cards -->
|
|
9013
9163
|
|
|
9014
9164
|
</div>
|