boost-skill-cli 1.2.19__tar.gz → 1.2.20__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.20}/PKG-INFO +1 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/cli.py +37 -7
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/team.py +2 -2
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/output.py +12 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_skill_cli.egg-info/SOURCES.txt +3 -0
- boost_skill_cli-1.2.20/docs/roadmap/items/bm25-has-no-stemming.md +50 -0
- boost_skill_cli-1.2.20/docs/roadmap/items/cli-output-ignored-the-terminal.md +56 -0
- boost_skill_cli-1.2.20/docs/roadmap/items/long-hints-overflow-narrow-panes.md +38 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap.html +133 -1
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_team.py +16 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_errors_and_cli_table.py +36 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_output.py +50 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.gitattributes +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.gitignore +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.lycheeignore +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.vale.ini +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/CLAUDE.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/LICENSE +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/MANIFEST.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/Makefile +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/SECURITY.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/pkg.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/bmad.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/bootstrap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/browse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/builtin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/catalogbundle.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/data/rules/boost-first.mdc +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_langchain/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_langchain/_compat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_langchain/graph.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_langchain/loader.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_langchain/py.typed +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_langchain/retriever.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/codecov.yml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/adapters.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/carousel.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/chat.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/commands.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/demo.gif +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/demo.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/demo.tape +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/eval.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/index.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/langchain.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/bmad-autopilot-one-command-persona-routing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/boost-first-carried-the-losing-trigger.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/boost-first-rule.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/boost-langchain-publishing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/browse-could-not-search-two-words.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/catalogue-entries-carry-no-content-identity.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/cold-search-reads-the-whole-catalogue.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/completions-install-could-eat-your-rc-file.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/crash-reports-leak-api-keys.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/demo-workflow-cancels-other-prs.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dense-search-rescans-every-vector.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dependabot-splits-multi-path-action-repos.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/discover-searches-github-not-a-stale-sample.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/efficiency-registries-ponytail-caveman.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/est-items-counts-agent-mirrors-as-items.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/eval-stats-could-never-publish.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/expanded-card-bodies-overflow.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/gemini-agent-frontmatter-sanitizer.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/install-path-disambiguation.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/langchain-in-the-wheel.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/langchain-retriever-metadata-and-k-floor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/marketing-crm-domain-had-no-category.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-already-covered-defeater.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mcp-zero-setup-and-three-kinds.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/pathlib-exists-is-not-total.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ragas-unpin-when-upstream-ships.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/scripts-under-the-lint-gate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/search-and-browse-visual-refresh.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/serve-404-reflected-the-request.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/serve-is-a-searchable-catalogue.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/shards-pipeline-never-produced-a-shard.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/shareable-catalogue-bundle.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/smart-rerank-pays-per-novel-query.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/sync-could-not-repair-a-gutted-skill.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/taps-check-out-freight-they-never-index.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/the-scale-corpus-refreshed-the-wrong-rows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/the-shard-job-that-could-not-finish.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/tool-call-eval-tier.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/two-ci-controls-that-could-not-act.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/two-crashes-that-should-have-been-messages.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/unwatched-crons-hid-a-real-fuzz-crash.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/docs/superpowers/specs/2026-08-16-catalogue-content-identity-design.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/__init__.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/baseline.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/metrics.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/examples/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/index.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/noxfile.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/pyproject.toml +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/measure_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/setup.cfg +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/sonar-project.properties +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/style/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/style/boost.css +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/style/boost.js +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/style/demo.html +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/conftest.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_catalog.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_kind_conformance.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/09-nul.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/10-name-too-long.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/corpus/registry/11-long-owner-repo.txt +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/langchain/conftest.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/langchain/test_graph.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/langchain/test_loader.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/langchain/test_retriever.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_action_pin_lockstep.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_bmad_core.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_boost_first_offer.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_bootstrap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_browse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_builtin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_catalogbundle.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_clean_internal_cache.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_compact.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_complete_rc_block.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_content_identity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_crash_redaction.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_embed_dedupe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_quantized.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_ready_order.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_shard_real_schema.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_shard_unreadable_vectors.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dense_status_cheap.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_embed_truncated_response.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_failure_alerting_covers_unattended.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_gemini_agent_sanitize.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_gitutil_lfs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_gitutil_sparse.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_install_permission_error.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_langchain_packaging.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_measure_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_publish_golden_dataset.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_rag_fastpath.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_registry_control_chars.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_rerank_cache.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_shards_matrix.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_smoke_covers_every_command.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_store_materialize.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_sync_blocked_links.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_sync_repairs_gutted_skill.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_visual_harness_flags.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_workflow_concurrency_groups.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_workflow_push_has_credentials.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/unit/test_zizmor_ignores_still_anchor.py +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/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.20'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 2, 20)
|
|
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
|
|
|
@@ -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)
|
|
@@ -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
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: bm25-has-no-stemming
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: next
|
|
6
|
+
category: Search · Retrieval
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: boost search brainstorm finds nothing while brainstorming finds it; 15.7% of catalog names are unreachable by their own stem
|
|
11
|
+
order: 127
|
|
12
|
+
owner:
|
|
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>Two fixes, and they are not the same size.</b> A <b>zero-match prefix fallback</b> — on 0
|
|
45
|
+
hits, retry against vocabulary tokens by prefix — touches no index format, needs no baseline
|
|
46
|
+
regeneration, and fires only where BM25 currently returns nothing, so it cannot move a single
|
|
47
|
+
eval metric; it fixes the exact observed symptom in both <code>search</code> and
|
|
48
|
+
<code>chat</code>. A <b>real stemmer</b> is the better answer and costs an index-format bump plus
|
|
49
|
+
a regenerated <code>tests/eval/baseline.json</code>, and would move all four floored metrics.
|
|
50
|
+
Either lands in <code>core/rag.py</code>, so the tests must kill mutants, not merely cover lines.
|
|
@@ -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,52 @@ 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 next">Next</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>Two fixes, and they are not the same size.</b> A <b>zero-match prefix fallback</b> — on 0
|
|
7089
|
+
hits, retry against vocabulary tokens by prefix — touches no index format, needs no baseline
|
|
7090
|
+
regeneration, and fires only where BM25 currently returns nothing, so it cannot move a single
|
|
7091
|
+
eval metric; it fixes the exact observed symptom in both <code>search</code> and
|
|
7092
|
+
<code>chat</code>. A <b>real stemmer</b> is the better answer and costs an index-format bump plus
|
|
7093
|
+
a regenerated <code>tests/eval/baseline.json</code>, and would move all four floored metrics.
|
|
7094
|
+
Either lands in <code>core/rag.py</code>, so the tests must kill mutants, not merely cover lines.</p>
|
|
7095
|
+
<div class="meta">
|
|
7096
|
+
<span class="m">Complexity <b>M</b></span>
|
|
7097
|
+
<span class="m hi">Impact <b>High</b></span>
|
|
7098
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
7099
|
+
<span class="m">boost search brainstorm finds nothing while brainstorming finds it; 15.7% of catalog names are unreachable by their own stem</span>
|
|
7100
|
+
</div>
|
|
7101
|
+
</article>
|
|
7056
7102
|
<!-- /ROADMAP:cards -->
|
|
7057
7103
|
|
|
7058
7104
|
</div>
|
|
@@ -9009,6 +9055,92 @@ the same search from 0.94 s to 0.49 s.</p>
|
|
|
9009
9055
|
<span class="m">MCP boost_search measured 11.7-17 s per call — every call, even a repeat of the last one</span>
|
|
9010
9056
|
</div>
|
|
9011
9057
|
</article>
|
|
9058
|
+
|
|
9059
|
+
<article class="cap rcard" id="cli-output-ignored-the-terminal">
|
|
9060
|
+
<div class="head"><span class="pill inflight">In flight</span><span class="cat">CLI · Output</span></div>
|
|
9061
|
+
<h3>The box drew 108 columns into an 80-column pane, and <code>--help</code> never asked how wide the pane was</h3>
|
|
9062
|
+
<p><b>Every one of the 80 commands was run, not just read.</b> All 80 answered
|
|
9063
|
+
<code>--help</code> with exit 0 and no traceback; ~73 were then driven for their real effect
|
|
9064
|
+
against a disposable <code>HOME</code> — install, link, quarantine, focus, snapshot, replay,
|
|
9065
|
+
cohort, hooks and the rest, checking the filesystem after each rather than trusting the success
|
|
9066
|
+
line. <code>boost focus tdd-workflow</code> was confirmed by listing
|
|
9067
|
+
<code>~/.claude/skills</code> and finding the other two skills genuinely unlinked with the
|
|
9068
|
+
canonical store intact, and <code>focus --clear</code> by finding all three back. Seven commands
|
|
9069
|
+
could not run here and are recorded as blocked rather than passed: <code>serve</code> (the
|
|
9070
|
+
sandbox denies <code>socket.bind</code>), <code>discover</code> and <code>index</code> (no
|
|
9071
|
+
<code>gh</code> auth), <code>run</code> live (no Agents SDK — <code>--print</code> was verified
|
|
9072
|
+
instead), plus the interactive halves of <code>browse</code>, <code>chat</code> and
|
|
9073
|
+
<code>edit</code>, each of which degraded with a correct hint.
|
|
9074
|
+
|
|
9075
|
+
<b>A literal <code>%%</code> was reaching the terminal.</b>
|
|
9076
|
+
<code>boost cohort</code> printed <code>sha256(user:cohort) %% 100 < rollout</code> and its
|
|
9077
|
+
<code>--help</code> epilog offered <code>a 50%% rollout</code>. Both strings carry printf
|
|
9078
|
+
escaping and neither is ever <code>%</code>-formatted, so the escape survived to the screen. The
|
|
9079
|
+
existing test asserted <code>"membership = sha256(user:cohort)" in r.out</code> — it stops one
|
|
9080
|
+
character short of the defect, which is exactly how it survived. Four other <code>%%</code> in
|
|
9081
|
+
the same file are correct: they sit inside real <code>%</code>-format calls, including the
|
|
9082
|
+
<code>Exec=%s %%u</code> that a <code>.desktop</code> file requires.
|
|
9083
|
+
|
|
9084
|
+
<b><code>panel()</code> sized itself to its content and never asked the terminal.</b> Measured:
|
|
9085
|
+
<code>boost count</code> drew <b>108 columns into an 80-column pane</b>. A box is the worst
|
|
9086
|
+
thing to overflow, because the border wraps and the shape itself breaks. It now clamps to
|
|
9087
|
+
<code>term_width() - 4</code> — the four columns the border costs — and clips over-long content,
|
|
9088
|
+
so every row stays the same width at any pane size.
|
|
9089
|
+
|
|
9090
|
+
<b>The help screen was the one screen that never measured the pane.</b>
|
|
9091
|
+
<code>search</code> already adapts, dropping the tap column and truncating at 60 columns —
|
|
9092
|
+
<code>term_width()</code> existed and <code>discovery.py</code> was its only caller. Meanwhile
|
|
9093
|
+
<code>boost --help</code>, the first thing a new user sees, emitted a fixed <b>102-column</b>
|
|
9094
|
+
banner at every width. It now fits exactly at 60, 80 and 100. Command <em>names</em> are never
|
|
9095
|
+
clipped, because the help's whole job is to be an index you can copy a command out of; summaries
|
|
9096
|
+
and the tagline are. The version never is — it is what a bug report needs.
|
|
9097
|
+
|
|
9098
|
+
<b>Two findings were measured and deliberately left for their own items.</b> Eleven commands
|
|
9099
|
+
still overflow 80 columns, but the remainder are prose hints, and the worst of them is one shared
|
|
9100
|
+
string that six test files and a BDD feature pin by substring — wrapping it is a cross-cutting
|
|
9101
|
+
output change, not a rider on this one. See <code>long-hints-overflow-narrow-panes</code> and
|
|
9102
|
+
<code>bm25-has-no-stemming</code>.</p>
|
|
9103
|
+
<div class="meta">
|
|
9104
|
+
<span class="m">Complexity <b>S</b></span>
|
|
9105
|
+
<span class="m">Impact <b>Med</b></span>
|
|
9106
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
9107
|
+
<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>
|
|
9108
|
+
</div>
|
|
9109
|
+
</article>
|
|
9110
|
+
|
|
9111
|
+
<article class="cap rcard" id="long-hints-overflow-narrow-panes">
|
|
9112
|
+
<div class="head"><span class="pill next">Next</span><span class="cat">CLI · Output</span></div>
|
|
9113
|
+
<h3>The hints still run past the pane, and the worst one is pinned by six test files</h3>
|
|
9114
|
+
<p><b>Measured, at <code>COLUMNS=80</code>, over 46 commands.</b> After the box and the help screen
|
|
9115
|
+
were fitted, <b>11</b> still emit a line past 80 columns. Ranked:
|
|
9116
|
+
<code>doctor</code>'s semantic-search hint at <b>127</b>; the AI-fallback notice at <b>101</b>,
|
|
9117
|
+
which is one shared string surfacing in <code>explain</code>, <code>impact</code> and
|
|
9118
|
+
<code>simulate</code>; <code>protocol</code>'s URL forms at 100; <code>changelog</code>'s
|
|
9119
|
+
unshallow hint at 93; <code>who</code>'s footer at 87; <code>search</code>'s extra hint at 82;
|
|
9120
|
+
<code>replay</code>'s footer at 81.
|
|
9121
|
+
|
|
9122
|
+
<b>Two of the eleven must be left alone.</b> <code>pulse</code>'s <code>source=</code> paths and
|
|
9123
|
+
<code>fingerprint</code>'s hash are data, not chrome — clipping them destroys the information the
|
|
9124
|
+
line exists to carry. So a blanket "no line exceeds <code>term_width()</code>" assertion is the
|
|
9125
|
+
wrong gate: it would false-positive on exactly the lines that should be long. Pin the composed
|
|
9126
|
+
sites individually.
|
|
9127
|
+
|
|
9128
|
+
<b>Why this is not a quick wrap.</b> The 101-column offender contains
|
|
9129
|
+
<code>using the heuristic fallback</code>, which is asserted by <b>six</b> test files plus
|
|
9130
|
+
<code>tests/bdd/features/explain.feature</code>. Wrapping inserts a newline mid-sentence and
|
|
9131
|
+
breaks every one of them; and under pytest <code>term_width()</code> falls back to 80, so the
|
|
9132
|
+
wrap fires in the suite rather than only on a narrow terminal. The change is a
|
|
9133
|
+
<code>wrap()</code> helper in <code>core/output.py</code> — mutation-gated, so boundary-width
|
|
9134
|
+
tests, not coverage — plus re-pinning those assertions. Shortening the strings instead is a
|
|
9135
|
+
smaller diff but a voice decision, and the substring pinned by the tests would have to survive
|
|
9136
|
+
either way.</p>
|
|
9137
|
+
<div class="meta">
|
|
9138
|
+
<span class="m">Complexity <b>M</b></span>
|
|
9139
|
+
<span class="m">Impact <b>Low</b></span>
|
|
9140
|
+
<span class="m">Wow <b class="wow">★★</b></span>
|
|
9141
|
+
<span class="m">11 commands still emit prose hints past 80 columns; the worst is one string pinned by six test files</span>
|
|
9142
|
+
</div>
|
|
9143
|
+
</article>
|
|
9012
9144
|
<!-- /ROADMAP:cards -->
|
|
9013
9145
|
|
|
9014
9146
|
</div>
|
|
@@ -89,6 +89,22 @@ class TestCohort:
|
|
|
89
89
|
assert data[0]["member"] == _member("pilot", 100)
|
|
90
90
|
assert data[1]["member"] == _member("zero", 0)
|
|
91
91
|
|
|
92
|
+
def test_no_literal_double_percent_reaches_the_terminal(self, boost, tapped):
|
|
93
|
+
"""`%%` is printf escaping, and neither of these two strings is ever
|
|
94
|
+
%-formatted — so both reached the terminal verbatim as `%%`. The
|
|
95
|
+
membership assertion above stops one character short of the listing's
|
|
96
|
+
occurrence, which is how it survived.
|
|
97
|
+
"""
|
|
98
|
+
boost("cohort", "create", "pilot", "--skills", "brainstorming",
|
|
99
|
+
"--percent", "50")
|
|
100
|
+
listing = boost("cohort", "list")
|
|
101
|
+
assert "%%" not in listing.out
|
|
102
|
+
assert "sha256(user:cohort) % 100 < rollout" in listing.out
|
|
103
|
+
|
|
104
|
+
helptext = boost("cohort", "--help")
|
|
105
|
+
assert "%%" not in helptext.out
|
|
106
|
+
assert "a 50% rollout" in helptext.out
|
|
107
|
+
|
|
92
108
|
def test_zero_percent_creates_out_and_apply_skips(self, boost, tapped):
|
|
93
109
|
r = boost("cohort", "create", "zero", "--skills", "brainstorming",
|
|
94
110
|
"--percent", "0")
|
|
@@ -137,6 +137,42 @@ class TestMainDispatch:
|
|
|
137
137
|
for _icon, title, _desc in cli.GROUPS.values():
|
|
138
138
|
assert title in out
|
|
139
139
|
|
|
140
|
+
@pytest.mark.parametrize("cols", [60, 80, 100, 120])
|
|
141
|
+
def test_help_never_overflows_the_terminal(self, sandbox, capsys,
|
|
142
|
+
monkeypatch, cols):
|
|
143
|
+
"""The top-level help was the one screen in the CLI that ignored the
|
|
144
|
+
terminal: `search` drops columns and truncates at 60, while `boost
|
|
145
|
+
--help` emitted a 105-column banner at every width, wrapping mid-word
|
|
146
|
+
for anyone not running a wide pane.
|
|
147
|
+
"""
|
|
148
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
149
|
+
monkeypatch.setattr(cli.out, "term_width", lambda: cols)
|
|
150
|
+
assert cli.main(["--help"]) == 0
|
|
151
|
+
for line in capsys.readouterr().out.splitlines():
|
|
152
|
+
assert cli.out.visible_len(line) <= cols, line
|
|
153
|
+
|
|
154
|
+
def test_help_keeps_the_product_name_and_version_at_60_columns(
|
|
155
|
+
self, sandbox, capsys, monkeypatch):
|
|
156
|
+
"""Fitting the banner must not cost the two facts it carries."""
|
|
157
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
158
|
+
monkeypatch.setattr(cli.out, "term_width", lambda: 60)
|
|
159
|
+
assert cli.main(["--help"]) == 0
|
|
160
|
+
out = capsys.readouterr().out
|
|
161
|
+
assert "Homebrew for AI coding skills" in out
|
|
162
|
+
assert cli.__version__ in out
|
|
163
|
+
assert "80 commands · 8 groups" in out
|
|
164
|
+
|
|
165
|
+
def test_help_still_names_every_command_when_narrow(self, sandbox, capsys,
|
|
166
|
+
monkeypatch):
|
|
167
|
+
"""Summaries may be clipped to fit; command names never are, or the
|
|
168
|
+
help stops being usable as an index."""
|
|
169
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
170
|
+
monkeypatch.setattr(cli.out, "term_width", lambda: 60)
|
|
171
|
+
assert cli.main(["--help"]) == 0
|
|
172
|
+
out = capsys.readouterr().out
|
|
173
|
+
for name, _g, _m, _s in cli.COMMANDS:
|
|
174
|
+
assert "\n %s" % name in out, name
|
|
175
|
+
|
|
140
176
|
def test_help_word(self, sandbox, capsys):
|
|
141
177
|
assert cli.main(["help"]) == 0
|
|
142
178
|
assert "80 commands · 8 groups" in capsys.readouterr().out
|
|
@@ -457,6 +457,56 @@ class TestPanel:
|
|
|
457
457
|
assert "\033[1minventory\033[0m" in output.panel("x", title="inventory")
|
|
458
458
|
|
|
459
459
|
|
|
460
|
+
class TestPanelFitsTerminal:
|
|
461
|
+
"""`panel()` sized itself to its content and ignored the terminal, so a
|
|
462
|
+
long line produced a box wider than the pane — and a broken box is the
|
|
463
|
+
ugliest overflow there is, because the border wraps into the next row.
|
|
464
|
+
Measured: `boost count` drew 108 columns into an 80-column terminal.
|
|
465
|
+
"""
|
|
466
|
+
|
|
467
|
+
def _rows(self, monkeypatch, cols, lines, **kw):
|
|
468
|
+
monkeypatch.setenv("NO_COLOR", "1")
|
|
469
|
+
monkeypatch.setattr(output, "term_width", lambda: cols)
|
|
470
|
+
return output.panel(lines, **kw).split("\n")
|
|
471
|
+
|
|
472
|
+
def test_untouched_when_it_already_fits(self, monkeypatch):
|
|
473
|
+
rows = self._rows(monkeypatch, 40, "x" * 36)
|
|
474
|
+
assert [output.visible_len(r) for r in rows] == [40, 40, 40]
|
|
475
|
+
assert "…" not in rows[1]
|
|
476
|
+
|
|
477
|
+
def test_exactly_at_the_limit_is_not_clipped(self, monkeypatch):
|
|
478
|
+
# inner 36 + "│ " + " │" == 40 == the full width: the boundary case a
|
|
479
|
+
# mutant flipping <= to < would break.
|
|
480
|
+
rows = self._rows(monkeypatch, 40, "y" * 36)
|
|
481
|
+
assert rows[1] == "│ " + "y" * 36 + " │"
|
|
482
|
+
|
|
483
|
+
def test_one_column_over_is_clipped(self, monkeypatch):
|
|
484
|
+
rows = self._rows(monkeypatch, 40, "z" * 37)
|
|
485
|
+
assert [output.visible_len(r) for r in rows] == [40, 40, 40]
|
|
486
|
+
assert rows[1].endswith("… │")
|
|
487
|
+
|
|
488
|
+
def test_every_row_is_the_same_width_after_clipping(self, monkeypatch):
|
|
489
|
+
rows = self._rows(monkeypatch, 30, ["short", "w" * 90, "mid" * 4])
|
|
490
|
+
assert len({output.visible_len(r) for r in rows}) == 1
|
|
491
|
+
assert output.visible_len(rows[0]) <= 30
|
|
492
|
+
|
|
493
|
+
def test_title_is_clipped_too(self, monkeypatch):
|
|
494
|
+
rows = self._rows(monkeypatch, 24, "a" * 50, title="t" * 40)
|
|
495
|
+
assert all(output.visible_len(r) <= 24 for r in rows)
|
|
496
|
+
assert len({output.visible_len(r) for r in rows}) == 1
|
|
497
|
+
|
|
498
|
+
def test_a_narrow_pane_still_yields_a_box(self, monkeypatch):
|
|
499
|
+
rows = self._rows(monkeypatch, 8, "content that is far too long")
|
|
500
|
+
assert len(rows) == 3
|
|
501
|
+
assert rows[0].startswith("╭") and rows[-1].endswith("╯")
|
|
502
|
+
assert all(output.visible_len(r) <= 8 for r in rows)
|
|
503
|
+
|
|
504
|
+
def test_a_zero_width_pane_does_not_crash_or_go_negative(self, monkeypatch):
|
|
505
|
+
rows = self._rows(monkeypatch, 0, "anything")
|
|
506
|
+
assert len(rows) == 3
|
|
507
|
+
assert all(output.visible_len(r) >= 0 for r in rows)
|
|
508
|
+
|
|
509
|
+
|
|
460
510
|
class TestEmptyState:
|
|
461
511
|
def test_message_only_plain(self, monkeypatch):
|
|
462
512
|
monkeypatch.setenv("NO_COLOR", "1")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{boost_skill_cli-1.2.19 → boost_skill_cli-1.2.20}/.vale/styles/config/vocabularies/boost/accept.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|