boost-skill-cli 1.0.403__tar.gz → 1.0.405__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.0.403 → boost_skill_cli-1.0.405}/.lighthouserc.json +1 -1
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/configuration.py +27 -3
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/pkg.py +19 -1
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/rag.py +8 -1
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_skill_cli.egg-info/PKG-INFO +1 -1
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_skill_cli.egg-info/SOURCES.txt +2 -0
- boost_skill_cli-1.0.405/docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md +43 -0
- boost_skill_cli-1.0.405/docs/roadmap/items/mcp-search-hid-which-ranking-ran.md +45 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/roadmap-perf-budget-has-no-local-guard.md +11 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap.html +95 -2
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_configuration.py +72 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_pkg.py +37 -4
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.gitattributes +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.gitignore +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/.vale.ini +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/LICENSE +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/Makefile +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/README.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/quality.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/chat.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/complete.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/dense.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/localembed.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/store.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/codecov.yml +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/chat.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/demo-index.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/demo.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/eval-latest.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/index.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/a11y-sweep-flakes-on-color-contrast.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/agents-field-records-the-request-not-the-links.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/bm25-index-is-one-json-blob.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/chat-cites-sources-by-a-number-it-never-prints.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/chat-command-grounded-conversational-search.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/completions-complete-only-command-names.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/eval-corpus-is-one-strangers-repo.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/eval-corpus-pins-have-no-refresh-path.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/eval-corpus-was-not-actually-pinned.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/eval-deduped-ranked-lists-by-name.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/golden-set-grades-by-name-not-by-skill.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/heal-deleted-links-it-never-made.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/info-rejects-the-qualified-name-it-recommends.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/keyless-semantic-search-for-everyone.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/langchain-integration-explainer-page.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/langchain-langgraph-langsmith-integration.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/lighthouse-scored-a-page-nobody-is-served.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-one-benefit-nameable-task.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-search-cost-was-understated.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/one-dead-tap-broke-every-update.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/pep585-604-modernization-sweep.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/python-floor-moves-to-312.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/resolve-vendored-duplicate-copies.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/roadmap-page-weight-grows-without-bound.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/rules-install-but-cannot-be-governed.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/search-never-notices-a-new-tap.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/update-advertises-a-flag-it-rejects.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/update-refreshed-rules-without-a-gate.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/zip-strict-audit.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/README.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/examples/README.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/index.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/noxfile.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/build_demo_index.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/build_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/eval_corpus.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/page_budget.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/publish_eval_json.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/scripts/serve_docs.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/setup.cfg +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/style/README.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/style/boost.css +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/style/boost.js +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/style/demo.html +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/golden-natural.jsonl +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/taps-scale.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_chat.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_workspace_scope.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_chat.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_complete.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_content_dedupe.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dedup_trust.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_demo_index.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dense_fix_hint.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dense_shards.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dense_status.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_embed_local.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_entry_key.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_baseline.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_corpus.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_grading.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_link_ownership.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_localembed.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_localembed_e2e.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_page_budget.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_project_mcp_sidecar.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_rag_fusion.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_scale_corpus.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_serve_docs.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/visual/visual_check.mjs +0 -0
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"assert": {
|
|
16
16
|
"aggregationMethod": "median-run",
|
|
17
17
|
"assertions": {
|
|
18
|
-
"categories:performance": ["error", { "minScore": 0.
|
|
18
|
+
"categories:performance": ["error", { "minScore": 0.9 }],
|
|
19
19
|
"categories:accessibility": ["error", { "minScore": 0.95 }],
|
|
20
20
|
"categories:best-practices": ["error", { "minScore": 0.9 }],
|
|
21
21
|
"categories:seo": ["error", { "minScore": 0.95 }]
|
|
@@ -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.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.405'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 405)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -818,6 +818,28 @@ def cmd_serve(argv) -> int:
|
|
|
818
818
|
REGISTRY = mcp.Registry()
|
|
819
819
|
|
|
820
820
|
|
|
821
|
+
def _ranking_note(ranker: str) -> str:
|
|
822
|
+
"""One line naming the ranking that actually produced this order.
|
|
823
|
+
|
|
824
|
+
`boost_search`'s own description promises an LLM rerank and quotes what it
|
|
825
|
+
buys — the right skill first 95% of the time against 79% without. When no
|
|
826
|
+
AI is configured that rerank degrades to the retrieval order, and the reply
|
|
827
|
+
was byte-for-byte the shape of a reranked one: same ten lines, same
|
|
828
|
+
confidence, 79%. An agent acts on the top result because the description
|
|
829
|
+
told it to.
|
|
830
|
+
|
|
831
|
+
`rag.rerank` already computes the only thing that distinguishes the two
|
|
832
|
+
cases, and its own comment says so — "the label is the only signal about
|
|
833
|
+
which engine" produced the order. This handler was discarding it.
|
|
834
|
+
"""
|
|
835
|
+
if ranker == rag.LLM_RANKER:
|
|
836
|
+
return "\n(ranked by %s)" % ranker
|
|
837
|
+
return ("\n(ranked by %s — the LLM rerank named in this tool's description "
|
|
838
|
+
"did NOT run, so this is a shortlist to read rather than a verdict "
|
|
839
|
+
"to act on. Configure ANTHROPIC_API_KEY or the `claude` CLI to "
|
|
840
|
+
"enable it.)" % ranker)
|
|
841
|
+
|
|
842
|
+
|
|
821
843
|
def _tool_search(args: dict):
|
|
822
844
|
query = str(args.get("query", ""))
|
|
823
845
|
rag.ensure() # build the full-content index on first use (BM25 by default)
|
|
@@ -835,14 +857,16 @@ def _tool_search(args: dict):
|
|
|
835
857
|
# default nobody chose. It degrades on its own when no AI is configured.
|
|
836
858
|
rag_result = rag.search(query, limit=10, smart=True)
|
|
837
859
|
if rag_result is not None: # full-content index is built
|
|
838
|
-
hits,
|
|
860
|
+
hits, ranker = rag_result
|
|
839
861
|
if not hits:
|
|
840
862
|
return "no skills match %r" % query, False
|
|
841
|
-
|
|
863
|
+
lines = [
|
|
842
864
|
"%s — %s (%s)" % (h["entry"]["name"],
|
|
843
865
|
h["entry"].get("description", ""),
|
|
844
866
|
h["entry"]["tap"])
|
|
845
|
-
for h in hits
|
|
867
|
+
for h in hits]
|
|
868
|
+
lines.append(_ranking_note(ranker))
|
|
869
|
+
return "\n".join(lines), False
|
|
846
870
|
# no index yet -> keep today's frontmatter search so nothing regresses
|
|
847
871
|
scored = catalog.search(query)[:10]
|
|
848
872
|
if not scored:
|
|
@@ -388,7 +388,18 @@ def cmd_install(argv: List[str]) -> int:
|
|
|
388
388
|
multi = multi or len(entries) > 1
|
|
389
389
|
|
|
390
390
|
if args.dry_run:
|
|
391
|
+
# TWO lists, because the three kinds do not reach the same agents.
|
|
392
|
+
# Rules and workflows materialize into every enabled agent's dotdir,
|
|
393
|
+
# Gemini included. A skill is symlinked only into the agents that take
|
|
394
|
+
# links — Gemini reads the canonical store directly and is deliberately
|
|
395
|
+
# never linked (see agents.linking_agents). One list for both is how
|
|
396
|
+
# `--dry-run` came to promise a `~/.gemini/skills` symlink that the real
|
|
397
|
+
# install has never created.
|
|
391
398
|
targets = [a for a in agents.enabled_agents() if not only or a in only]
|
|
399
|
+
link_targets = [a for a in agents.linking_agents()
|
|
400
|
+
if not only or a in only]
|
|
401
|
+
native_targets = [a for a in agents.native_store_agents()
|
|
402
|
+
if not only or a in only]
|
|
392
403
|
pbase = scopes.resolve_base(args.scope)
|
|
393
404
|
if args.scope == scopes.SCOPE_PROJECT and pbase is None:
|
|
394
405
|
raise BoostError(
|
|
@@ -423,7 +434,14 @@ def cmd_install(argv: List[str]) -> int:
|
|
|
423
434
|
e["version"], e["tap"]))
|
|
424
435
|
out.info(" copy %s → %s" % (_tilde(store.source_dir_for(e)),
|
|
425
436
|
_tilde(store.skill_store_dir(e["name"]))))
|
|
426
|
-
out.info(" link → %s" % (" · ".join(
|
|
437
|
+
out.info(" link → %s" % (" · ".join(link_targets)
|
|
438
|
+
or "(no linking agents)"))
|
|
439
|
+
# Mirrors what the real install reports, so a Gemini-only install
|
|
440
|
+
# does not read as reaching no agent at all.
|
|
441
|
+
if native_targets:
|
|
442
|
+
out.info(" available to %s (reads the store directly)"
|
|
443
|
+
% " · ".join(agents.display_name(a)
|
|
444
|
+
for a in native_targets))
|
|
427
445
|
out.info("dry run — nothing was changed")
|
|
428
446
|
return 1 if failed else 0
|
|
429
447
|
|
|
@@ -721,6 +721,13 @@ def retrieve(query: str, k: int = 60, kind: Optional[str] = None,
|
|
|
721
721
|
return dedupe_by_content(hits, k)
|
|
722
722
|
|
|
723
723
|
|
|
724
|
+
#: The label `rerank` returns when the LLM pass actually ran. Every other value
|
|
725
|
+
#: is a retrieval engine's own name, i.e. "the rerank did not happen". Callers
|
|
726
|
+
#: that quote what the rerank buys have to be able to tell those apart without
|
|
727
|
+
#: string-matching a literal that could drift.
|
|
728
|
+
LLM_RANKER = "Claude relevance"
|
|
729
|
+
|
|
730
|
+
|
|
724
731
|
def rerank(query: str, hits: List[Hit], limit: int = 10,
|
|
725
732
|
engine: str = "BM25 full-content") -> Tuple[List[Hit], str]:
|
|
726
733
|
"""Reorder the shortlist with the LLM bridge; degrade to ``engine`` order.
|
|
@@ -756,7 +763,7 @@ def rerank(query: str, hits: List[Hit], limit: int = 10,
|
|
|
756
763
|
picked = [by_name[str(n)] for n in order if str(n) in by_name]
|
|
757
764
|
rest = [h for h in hits if h["entry"]["name"]
|
|
758
765
|
not in {str(n) for n in order}]
|
|
759
|
-
return (picked + rest)[:limit],
|
|
766
|
+
return (picked + rest)[:limit], LLM_RANKER
|
|
760
767
|
|
|
761
768
|
|
|
762
769
|
# The damping constant from the original reciprocal-rank-fusion paper. It is
|
|
@@ -213,6 +213,7 @@ docs/roadmap/items/dependency-cve-gate-pip-audit.md
|
|
|
213
213
|
docs/roadmap/items/docsite-chrome-and-content-audit.md
|
|
214
214
|
docs/roadmap/items/docstring-coverage-interrogate.md
|
|
215
215
|
docs/roadmap/items/doctor-checks-rules-and-workflows.md
|
|
216
|
+
docs/roadmap/items/dry-run-promised-a-link-nobody-makes.md
|
|
216
217
|
docs/roadmap/items/end-of-options-guard-on-git-commands.md
|
|
217
218
|
docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md
|
|
218
219
|
docs/roadmap/items/eval-corpus-is-96x-smaller-than-a-real-install.md
|
|
@@ -277,6 +278,7 @@ docs/roadmap/items/mcp-one-benefit-nameable-task.md
|
|
|
277
278
|
docs/roadmap/items/mcp-register-names-server-before-env.md
|
|
278
279
|
docs/roadmap/items/mcp-search-before-reinventing.md
|
|
279
280
|
docs/roadmap/items/mcp-search-cost-was-understated.md
|
|
281
|
+
docs/roadmap/items/mcp-search-hid-which-ranking-ran.md
|
|
280
282
|
docs/roadmap/items/mcp-servers-ignore-install-scope.md
|
|
281
283
|
docs/roadmap/items/mcp-startup-self-harden-fork-safety.md
|
|
282
284
|
docs/roadmap/items/memoize-config-load-in-process.md
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: dry-run-promised-a-link-nobody-makes
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Correctness
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Medium
|
|
9
|
+
wow: 3
|
|
10
|
+
note: the bug was written down in a test comment and pinned as "behaves today"
|
|
11
|
+
order: 100
|
|
12
|
+
owner: fix/dry-run-matches-the-real-install
|
|
13
|
+
pr: 460
|
|
14
|
+
title: install --dry-run predicted an install that never happens
|
|
15
|
+
---
|
|
16
|
+
<b>A preview has exactly one job, and this one got it wrong by an agent and a verb.</b>
|
|
17
|
+
<code>boost install brainstorming --dry-run</code> reported
|
|
18
|
+
<code>link → claude-code · windsurf · cursor · gemini</code>.
|
|
19
|
+
The real install reports three agents, plus a separate line saying Gemini reads the store directly
|
|
20
|
+
— and <code>~/.gemini/skills</code> does not exist afterwards, because boost has never created
|
|
21
|
+
it.
|
|
22
|
+
|
|
23
|
+
<b>One list was doing two jobs.</b> The dry-run block computed a single set of targets from
|
|
24
|
+
<code>agents.enabled_agents()</code> and printed it for both the skill <code>link</code> line and the
|
|
25
|
+
rule/workflow <code>materialize</code> line. For rules and workflows that is right: they really are
|
|
26
|
+
materialised into every enabled agent's dotdir, Gemini included. For a <i>skill</i> it is wrong,
|
|
27
|
+
because Gemini implements the Agent Skills standard and discovers the canonical store itself, so it
|
|
28
|
+
is configured <code>links_skills: false</code> and is deliberately never symlinked. CLAUDE.md is
|
|
29
|
+
explicit — iterate <code>linking_agents()</code> for anything symlink-shaped.
|
|
30
|
+
|
|
31
|
+
<b>The bug was already written down.</b> The functional test carried a comment saying so:
|
|
32
|
+
"<i>the preview lists every enabled agent, so it still promises a gemini link the real install does
|
|
33
|
+
not make … Pinned as it behaves today.</i>" Someone found it, understood it, described it
|
|
34
|
+
accurately, and pinned the wrong behaviour rather than fixing it — which is how a known defect
|
|
35
|
+
acquires a test that defends it.
|
|
36
|
+
|
|
37
|
+
<b>Fixed as a distinction, not a deletion.</b> A skill's preview names the agents that take links and
|
|
38
|
+
adds the same "available to Gemini CLI (reads the store directly)" line the real install prints; a
|
|
39
|
+
rule's preview still names all four, because a rule genuinely reaches all four. A test now compares
|
|
40
|
+
the two runs field by field — the preview's link list against the real install's —
|
|
41
|
+
because <code>"a · b · c"</code> contains
|
|
42
|
+
<code>"a · b"</code>, so a substring assertion passes on exactly this bug. It was
|
|
43
|
+
written as a substring first and caught nothing until it was tightened.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: mcp-search-hid-which-ranking-ran
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: shipped
|
|
6
|
+
category: Correctness · MCP
|
|
7
|
+
complexity: S
|
|
8
|
+
impact: Medium
|
|
9
|
+
wow: 4
|
|
10
|
+
note: the degraded order was byte-for-byte the shape of the promised one
|
|
11
|
+
order: 101
|
|
12
|
+
owner: fix/mcp-search-names-its-ranker
|
|
13
|
+
pr: 461
|
|
14
|
+
title: boost_search never said which ranking produced its answer
|
|
15
|
+
---
|
|
16
|
+
<b>The MCP tool tells an agent an LLM reranks every match, "which is what makes the top result worth
|
|
17
|
+
acting on rather than skimming ten". When no AI is configured, it doesn't — and the reply looked
|
|
18
|
+
exactly the same.</b> Ten lines, same shape, same confidence, produced by BM25 alone. An agent acts on
|
|
19
|
+
the top result because the description told it to.
|
|
20
|
+
|
|
21
|
+
<b>The signal existed and was thrown away.</b> <code>rag.search</code> returns
|
|
22
|
+
<code>(hits, ranker_label)</code>, and <code>rag.rerank</code>'s own docstring says why the label
|
|
23
|
+
matters: "the label is the only signal about which engine answered, so a confident
|
|
24
|
+
<code>BM25 full-content</code> sent debugging somewhere else." The MCP handler unpacked it into
|
|
25
|
+
<code>_ranker</code> and dropped it on the floor. Every degrade path — no AI available, a reply
|
|
26
|
+
that isn't a JSON array — already returns the retrieval label rather than claiming a rerank, so
|
|
27
|
+
the distinction was fully computed and merely unreported.
|
|
28
|
+
|
|
29
|
+
<b>This is not hypothetical on a normal machine.</b> The rerank needs
|
|
30
|
+
<code>ANTHROPIC_API_KEY</code> or the <code>claude</code> CLI. A boost installed with
|
|
31
|
+
<code>pipx</code> has neither inside its venv unless the key is exported, so the silent path is the
|
|
32
|
+
common one rather than the edge case.
|
|
33
|
+
|
|
34
|
+
<b>What shipped.</b> The reply now ends with the ranking that produced it —
|
|
35
|
+
<i>"(ranked by Claude relevance)"</i> when the rerank ran, and otherwise a line naming the engine,
|
|
36
|
+
saying plainly that the rerank <i>did not</i> run, and telling the caller to treat the order as a
|
|
37
|
+
shortlist to read rather than a verdict to act on. <code>rag.LLM_RANKER</code> replaces the literal
|
|
38
|
+
so the producer and the consumer of that label cannot drift apart, with a test driving
|
|
39
|
+
<code>rerank</code> through all three of its outcomes.
|
|
40
|
+
|
|
41
|
+
<b>A related claim was already corrected upstream.</b> The "95% against 79%" figures once quoted here
|
|
42
|
+
were removed from both the tool description and the server instructions, because 0.791 was the BM25
|
|
43
|
+
baseline over the <i>six</i>-repo corpus and the twenty-repo corpus that replaced it measures 0.4725
|
|
44
|
+
— overstating the baseline by 31 points. The mechanism claim survived that edit, which is
|
|
45
|
+
exactly the claim this card makes honest.
|
|
@@ -84,3 +84,14 @@ raise to be a decision rather than an emergency.
|
|
|
84
84
|
|
|
85
85
|
<b>Still genuinely open.</b> The page is not faster. 0.84 is still a board of 200 cards, and nothing
|
|
86
86
|
here changes that — only the odds that the next step change is noticed the day it lands.
|
|
87
|
+
|
|
88
|
+
<b>Corrected 2026-08-03: the page was never the slow part.</b> The <code>lighthouse</code> job served
|
|
89
|
+
the docs with <code>python3 -m http.server</code>, which sends no <code>Content-Encoding</code>
|
|
90
|
+
header at all, so every score above was measured on a document <b>3.27×</b> larger
|
|
91
|
+
than the one GitHub Pages delivers. That is why both experiments here moved the number by
|
|
92
|
+
<b>0.00</b>: each changed <i>layout</i> work while the score was being decided by <i>transfer</i>
|
|
93
|
+
bytes. Compressing the harness the way Pages does took roadmap.html from
|
|
94
|
+
<b>0.79 → 0.98</b> and FCP from <b>3,638 → 1,719 ms</b>, and the
|
|
95
|
+
floor went back to 0.90. The cheap local proxy this card called not obvious was markup bytes —
|
|
96
|
+
the dimension <code>page_budget.py</code>, shipped by this very PR, already measures. See
|
|
97
|
+
[[lighthouse-scored-a-page-nobody-is-served]].
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
<div class="stat"><b>16</b><span>Shipped</span></div>
|
|
126
126
|
<div class="stat"><b>1</b><span>Next up</span></div>
|
|
127
127
|
<div class="stat"><b>8</b><span>Planned</span></div>
|
|
128
|
-
<div class="stat"><b>
|
|
128
|
+
<div class="stat"><b>218</b><span>Loop finds</span></div>
|
|
129
129
|
<!-- /ROADMAP:stats -->
|
|
130
130
|
</div>
|
|
131
131
|
</section>
|
|
@@ -3521,6 +3521,88 @@ ownership check reverted.</p></details>
|
|
|
3521
3521
|
<span class="m">a dangling link is not garbage — an unmounted volume comes back, and heal deleted it anyway</span>
|
|
3522
3522
|
</div>
|
|
3523
3523
|
</article>
|
|
3524
|
+
|
|
3525
|
+
<article class="cap rcard" id="dry-run-promised-a-link-nobody-makes">
|
|
3526
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Correctness</span></div>
|
|
3527
|
+
<h3>install --dry-run predicted an install that never happens</h3>
|
|
3528
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3529
|
+
<p><b>A preview has exactly one job, and this one got it wrong by an agent and a verb.</b>
|
|
3530
|
+
<code>boost install brainstorming --dry-run</code> reported
|
|
3531
|
+
<code>link → claude-code · windsurf · cursor · gemini</code>.
|
|
3532
|
+
The real install reports three agents, plus a separate line saying Gemini reads the store directly
|
|
3533
|
+
— and <code>~/.gemini/skills</code> does not exist afterwards, because boost has never created
|
|
3534
|
+
it.
|
|
3535
|
+
|
|
3536
|
+
<b>One list was doing two jobs.</b> The dry-run block computed a single set of targets from
|
|
3537
|
+
<code>agents.enabled_agents()</code> and printed it for both the skill <code>link</code> line and the
|
|
3538
|
+
rule/workflow <code>materialize</code> line. For rules and workflows that is right: they really are
|
|
3539
|
+
materialised into every enabled agent's dotdir, Gemini included. For a <i>skill</i> it is wrong,
|
|
3540
|
+
because Gemini implements the Agent Skills standard and discovers the canonical store itself, so it
|
|
3541
|
+
is configured <code>links_skills: false</code> and is deliberately never symlinked. CLAUDE.md is
|
|
3542
|
+
explicit — iterate <code>linking_agents()</code> for anything symlink-shaped.
|
|
3543
|
+
|
|
3544
|
+
<b>The bug was already written down.</b> The functional test carried a comment saying so:
|
|
3545
|
+
"<i>the preview lists every enabled agent, so it still promises a gemini link the real install does
|
|
3546
|
+
not make … Pinned as it behaves today.</i>" Someone found it, understood it, described it
|
|
3547
|
+
accurately, and pinned the wrong behaviour rather than fixing it — which is how a known defect
|
|
3548
|
+
acquires a test that defends it.
|
|
3549
|
+
|
|
3550
|
+
<b>Fixed as a distinction, not a deletion.</b> A skill's preview names the agents that take links and
|
|
3551
|
+
adds the same "available to Gemini CLI (reads the store directly)" line the real install prints; a
|
|
3552
|
+
rule's preview still names all four, because a rule genuinely reaches all four. A test now compares
|
|
3553
|
+
the two runs field by field — the preview's link list against the real install's —
|
|
3554
|
+
because <code>"a · b · c"</code> contains
|
|
3555
|
+
<code>"a · b"</code>, so a substring assertion passes on exactly this bug. It was
|
|
3556
|
+
written as a substring first and caught nothing until it was tightened.</p></details>
|
|
3557
|
+
<div class="meta">
|
|
3558
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3559
|
+
<span class="m">Impact <b>Medium</b></span>
|
|
3560
|
+
<span class="m">Wow <b class="wow">★★★</b></span>
|
|
3561
|
+
<span class="m">the bug was written down in a test comment and pinned as "behaves today"</span>
|
|
3562
|
+
</div>
|
|
3563
|
+
</article>
|
|
3564
|
+
|
|
3565
|
+
<article class="cap rcard" id="mcp-search-hid-which-ranking-ran">
|
|
3566
|
+
<div class="head"><span class="pill shipped">Shipped</span><span class="cat">Correctness · MCP</span></div>
|
|
3567
|
+
<h3>boost_search never said which ranking produced its answer</h3>
|
|
3568
|
+
<details class="cardbody"><summary>Write-up</summary>
|
|
3569
|
+
<p><b>The MCP tool tells an agent an LLM reranks every match, "which is what makes the top result worth
|
|
3570
|
+
acting on rather than skimming ten". When no AI is configured, it doesn't — and the reply looked
|
|
3571
|
+
exactly the same.</b> Ten lines, same shape, same confidence, produced by BM25 alone. An agent acts on
|
|
3572
|
+
the top result because the description told it to.
|
|
3573
|
+
|
|
3574
|
+
<b>The signal existed and was thrown away.</b> <code>rag.search</code> returns
|
|
3575
|
+
<code>(hits, ranker_label)</code>, and <code>rag.rerank</code>'s own docstring says why the label
|
|
3576
|
+
matters: "the label is the only signal about which engine answered, so a confident
|
|
3577
|
+
<code>BM25 full-content</code> sent debugging somewhere else." The MCP handler unpacked it into
|
|
3578
|
+
<code>_ranker</code> and dropped it on the floor. Every degrade path — no AI available, a reply
|
|
3579
|
+
that isn't a JSON array — already returns the retrieval label rather than claiming a rerank, so
|
|
3580
|
+
the distinction was fully computed and merely unreported.
|
|
3581
|
+
|
|
3582
|
+
<b>This is not hypothetical on a normal machine.</b> The rerank needs
|
|
3583
|
+
<code>ANTHROPIC_API_KEY</code> or the <code>claude</code> CLI. A boost installed with
|
|
3584
|
+
<code>pipx</code> has neither inside its venv unless the key is exported, so the silent path is the
|
|
3585
|
+
common one rather than the edge case.
|
|
3586
|
+
|
|
3587
|
+
<b>What shipped.</b> The reply now ends with the ranking that produced it —
|
|
3588
|
+
<i>"(ranked by Claude relevance)"</i> when the rerank ran, and otherwise a line naming the engine,
|
|
3589
|
+
saying plainly that the rerank <i>did not</i> run, and telling the caller to treat the order as a
|
|
3590
|
+
shortlist to read rather than a verdict to act on. <code>rag.LLM_RANKER</code> replaces the literal
|
|
3591
|
+
so the producer and the consumer of that label cannot drift apart, with a test driving
|
|
3592
|
+
<code>rerank</code> through all three of its outcomes.
|
|
3593
|
+
|
|
3594
|
+
<b>A related claim was already corrected upstream.</b> The "95% against 79%" figures once quoted here
|
|
3595
|
+
were removed from both the tool description and the server instructions, because 0.791 was the BM25
|
|
3596
|
+
baseline over the <i>six</i>-repo corpus and the twenty-repo corpus that replaced it measures 0.4725
|
|
3597
|
+
— overstating the baseline by 31 points. The mechanism claim survived that edit, which is
|
|
3598
|
+
exactly the claim this card makes honest.</p></details>
|
|
3599
|
+
<div class="meta">
|
|
3600
|
+
<span class="m">Complexity <b>S</b></span>
|
|
3601
|
+
<span class="m">Impact <b>Medium</b></span>
|
|
3602
|
+
<span class="m">Wow <b class="wow">★★★★</b></span>
|
|
3603
|
+
<span class="m">the degraded order was byte-for-byte the shape of the promised one</span>
|
|
3604
|
+
</div>
|
|
3605
|
+
</article>
|
|
3524
3606
|
<!-- /ROADMAP:cards -->
|
|
3525
3607
|
|
|
3526
3608
|
</div>
|
|
@@ -7431,7 +7513,18 @@ from the other side: if the board ever creeps past 80% of its ceiling, it fails
|
|
|
7431
7513
|
raise to be a decision rather than an emergency.
|
|
7432
7514
|
|
|
7433
7515
|
<b>Still genuinely open.</b> The page is not faster. 0.84 is still a board of 200 cards, and nothing
|
|
7434
|
-
here changes that — only the odds that the next step change is noticed the day it lands
|
|
7516
|
+
here changes that — only the odds that the next step change is noticed the day it lands.
|
|
7517
|
+
|
|
7518
|
+
<b>Corrected 2026-08-03: the page was never the slow part.</b> The <code>lighthouse</code> job served
|
|
7519
|
+
the docs with <code>python3 -m http.server</code>, which sends no <code>Content-Encoding</code>
|
|
7520
|
+
header at all, so every score above was measured on a document <b>3.27×</b> larger
|
|
7521
|
+
than the one GitHub Pages delivers. That is why both experiments here moved the number by
|
|
7522
|
+
<b>0.00</b>: each changed <i>layout</i> work while the score was being decided by <i>transfer</i>
|
|
7523
|
+
bytes. Compressing the harness the way Pages does took roadmap.html from
|
|
7524
|
+
<b>0.79 → 0.98</b> and FCP from <b>3,638 → 1,719 ms</b>, and the
|
|
7525
|
+
floor went back to 0.90. The cheap local proxy this card called not obvious was markup bytes —
|
|
7526
|
+
the dimension <code>page_budget.py</code>, shipped by this very PR, already measures. See
|
|
7527
|
+
[[lighthouse-scored-a-page-nobody-is-served]].</p></details>
|
|
7435
7528
|
<div class="meta">
|
|
7436
7529
|
<span class="m">Complexity <b>S</b></span>
|
|
7437
7530
|
<span class="m">Impact <b>Medium</b></span>
|
{boost_skill_cli-1.0.403 → boost_skill_cli-1.0.405}/tests/functional/test_cli_configuration.py
RENAMED
|
@@ -1011,6 +1011,12 @@ class TestMcp:
|
|
|
1011
1011
|
# the flattering-but-stale claim the cost test below exists to prevent.
|
|
1012
1012
|
# State the mechanism; leave the arithmetic to the eval gate.
|
|
1013
1013
|
assert "95%" not in specs["boost_search"]
|
|
1014
|
+
|
|
1015
|
+
# The description still says the rerank happens ("ranks the matches
|
|
1016
|
+
# with an LLM"), so the REPLY has to say when it did not — otherwise
|
|
1017
|
+
# the degraded order is indistinguishable from the promised one. See
|
|
1018
|
+
# TestSearchNamesItsRanker below.
|
|
1019
|
+
assert "llm" in specs["boost_search"]
|
|
1014
1020
|
# Stating the benefit must never quietly drop the cost with it.
|
|
1015
1021
|
# A description whose job is to make a tool worth reaching for is the
|
|
1016
1022
|
# one place a flattering lie discredits everything around it.
|
|
@@ -1469,3 +1475,69 @@ class TestSelfUpdate:
|
|
|
1469
1475
|
ev = journal.events(action="self-update")[0]
|
|
1470
1476
|
assert ev["subject"] == "9.9.9" # git-derived, not the stale const
|
|
1471
1477
|
assert ev["previous"] == __version__
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
class TestSearchNamesItsRanker:
|
|
1481
|
+
"""The reply has to say which ranking produced it.
|
|
1482
|
+
|
|
1483
|
+
`boost_search`'s description tells the calling agent an LLM reranks every
|
|
1484
|
+
match, "which is what makes the top result worth acting on rather than
|
|
1485
|
+
skimming ten". With no AI configured that rerank silently degrades to the
|
|
1486
|
+
retrieval order and the reply was byte-for-byte the shape of a reranked
|
|
1487
|
+
one — same ten lines, same confidence. `rag.rerank` already computes the
|
|
1488
|
+
only signal that distinguishes them; the handler discarded it.
|
|
1489
|
+
"""
|
|
1490
|
+
|
|
1491
|
+
def test_a_degraded_search_says_the_rerank_did_not_run(self, monkeypatch):
|
|
1492
|
+
from boost_cli.commands import configuration
|
|
1493
|
+
from boost_cli.core import rag
|
|
1494
|
+
monkeypatch.setattr(
|
|
1495
|
+
rag, "ensure", lambda *a, **k: True)
|
|
1496
|
+
monkeypatch.setattr(rag, "search", lambda *a, **k: (
|
|
1497
|
+
[{"entry": {"name": "x", "description": "d", "tap": "t"}}],
|
|
1498
|
+
"BM25 full-content"))
|
|
1499
|
+
text, _ = configuration._tool_search({"query": "anything"})
|
|
1500
|
+
assert "did NOT run" in text
|
|
1501
|
+
assert "BM25 full-content" in text
|
|
1502
|
+
assert "ANTHROPIC_API_KEY" in text
|
|
1503
|
+
|
|
1504
|
+
def test_a_reranked_search_says_so_without_the_warning(self, monkeypatch):
|
|
1505
|
+
from boost_cli.commands import configuration
|
|
1506
|
+
from boost_cli.core import rag
|
|
1507
|
+
monkeypatch.setattr(rag, "ensure", lambda *a, **k: True)
|
|
1508
|
+
monkeypatch.setattr(rag, "search", lambda *a, **k: (
|
|
1509
|
+
[{"entry": {"name": "x", "description": "d", "tap": "t"}}],
|
|
1510
|
+
rag.LLM_RANKER))
|
|
1511
|
+
text, _ = configuration._tool_search({"query": "anything"})
|
|
1512
|
+
assert "(ranked by %s)" % rag.LLM_RANKER in text
|
|
1513
|
+
assert "did NOT run" not in text
|
|
1514
|
+
|
|
1515
|
+
def test_rerank_returns_that_label_only_when_the_llm_answered(
|
|
1516
|
+
self, monkeypatch):
|
|
1517
|
+
"""The producer and the consumer of the label must agree.
|
|
1518
|
+
|
|
1519
|
+
`rag.LLM_RANKER` exists so this is impossible to drift rather than
|
|
1520
|
+
merely unlikely — the note in the MCP handler keys on it, and every
|
|
1521
|
+
other value means "the rerank did not happen".
|
|
1522
|
+
"""
|
|
1523
|
+
from boost_cli.core import ai, rag
|
|
1524
|
+
hits = [{"entry": {"name": "b", "kind": "skill", "description": "d"},
|
|
1525
|
+
"snippet": ""},
|
|
1526
|
+
{"entry": {"name": "a", "kind": "skill", "description": "d"},
|
|
1527
|
+
"snippet": ""}]
|
|
1528
|
+
|
|
1529
|
+
monkeypatch.setattr(ai, "available", lambda: False)
|
|
1530
|
+
assert rag.rerank("q", hits, engine="BM25 full-content")[1] == \
|
|
1531
|
+
"BM25 full-content"
|
|
1532
|
+
|
|
1533
|
+
monkeypatch.setattr(ai, "available", lambda: True)
|
|
1534
|
+
monkeypatch.setattr(ai, "ask", lambda *a, **k: '["a", "b"]')
|
|
1535
|
+
order, label = rag.rerank("q", hits, engine="BM25 full-content")
|
|
1536
|
+
assert label == rag.LLM_RANKER
|
|
1537
|
+
assert [h["entry"]["name"] for h in order] == ["a", "b"]
|
|
1538
|
+
|
|
1539
|
+
# The model replied, but not with an order — the label must fall back
|
|
1540
|
+
# with the ordering, or it claims a rerank that did not take effect.
|
|
1541
|
+
monkeypatch.setattr(ai, "ask", lambda *a, **k: "sorry, I cannot")
|
|
1542
|
+
assert rag.rerank("q", hits, engine="BM25 full-content")[1] == \
|
|
1543
|
+
"BM25 full-content"
|
|
@@ -123,14 +123,47 @@ class TestInstall:
|
|
|
123
123
|
r = boost("install", "--dry-run", "brainstorming")
|
|
124
124
|
assert "would install brainstorming v1.4.0 from fixture-tap" in r.out
|
|
125
125
|
assert "~/.boost/repos/fixture-tap/skills/brainstorming" in r.out
|
|
126
|
-
#
|
|
127
|
-
#
|
|
128
|
-
#
|
|
129
|
-
assert "link → claude-code · windsurf · cursor
|
|
126
|
+
# The preview names the agents that actually take a link. Gemini reads
|
|
127
|
+
# the canonical store directly and is never symlinked, so promising one
|
|
128
|
+
# here made the dry run wrong about the one thing it exists to predict.
|
|
129
|
+
assert "link → claude-code · windsurf · cursor" in r.out
|
|
130
|
+
assert "· gemini" not in r.out
|
|
131
|
+
assert "available to Gemini CLI (reads the store directly)" in r.out
|
|
130
132
|
assert "dry run — nothing was changed" in r.out
|
|
131
133
|
assert not (paths.store_dir() / "brainstorming").exists()
|
|
132
134
|
assert not paths.lockfile_path().exists()
|
|
133
135
|
|
|
136
|
+
def test_dry_run_predicts_the_real_install(self, boost, tapped):
|
|
137
|
+
"""The whole job of a preview: say what the real run will do.
|
|
138
|
+
|
|
139
|
+
These two disagreed by one agent and one verb — `--dry-run` promised a
|
|
140
|
+
`~/.gemini/skills` symlink that no install has ever created.
|
|
141
|
+
"""
|
|
142
|
+
def agents_on(text, marker):
|
|
143
|
+
line = next(x for x in text.splitlines() if marker in x)
|
|
144
|
+
return line.split("→", 1)[1].strip()
|
|
145
|
+
|
|
146
|
+
preview = boost("install", "--dry-run", "brainstorming").out
|
|
147
|
+
real = boost("install", "brainstorming").out
|
|
148
|
+
# Compared as whole fields, not substrings: "a · b · c" contains
|
|
149
|
+
# "a · b", so a substring check would have passed on the bug.
|
|
150
|
+
assert agents_on(preview, "link →") == agents_on(real, "linked →")
|
|
151
|
+
for text in (preview, real):
|
|
152
|
+
assert "available to Gemini CLI (reads the store directly)" in text
|
|
153
|
+
assert not (paths.home() / ".gemini" / "skills").exists()
|
|
154
|
+
|
|
155
|
+
def test_dry_run_still_names_gemini_for_a_rule(self, boost, fixture_tap_src,
|
|
156
|
+
tmp_path):
|
|
157
|
+
# The distinction is the point, not a blanket removal: a RULE really is
|
|
158
|
+
# materialized into ~/.gemini/, so the preview must keep saying so.
|
|
159
|
+
tap_dir = _copy_tap(fixture_tap_src, tmp_path / "rule-dry-tap")
|
|
160
|
+
_add_and_commit(tap_dir, "rules/house.mdc",
|
|
161
|
+
"---\nname: house-style\nversion: 1.0.0\n---\n\nUse tabs.\n",
|
|
162
|
+
"add rule")
|
|
163
|
+
boost("tap", tap_dir)
|
|
164
|
+
r = boost("install", "house-style", "--dry-run")
|
|
165
|
+
assert "materialize → claude-code · windsurf · cursor · gemini" in r.out
|
|
166
|
+
|
|
134
167
|
def test_installs_declared_requires_closure(self, boost, tapped):
|
|
135
168
|
# jira-integration declares `requires: [commit-messages]` in the fixture;
|
|
136
169
|
# installing it must pull in the dependency, dependency-first.
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|