boost-skill-cli 1.0.306__tar.gz → 1.0.308__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.306/boost_skill_cli.egg-info → boost_skill_cli-1.0.308}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/_version.py +2 -2
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/pkg.py +42 -6
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/quality.py +70 -1
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/dense.py +100 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/store.py +99 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308/boost_skill_cli.egg-info}/PKG-INFO +1 -1
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/SOURCES.txt +7 -0
- boost_skill_cli-1.0.308/docs/roadmap/items/bm25-index-is-one-json-blob.md +45 -0
- boost_skill_cli-1.0.308/docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md +42 -0
- boost_skill_cli-1.0.308/docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md +58 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-servers-ignore-install-scope.md +29 -3
- boost_skill_cli-1.0.308/docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md +40 -0
- boost_skill_cli-1.0.308/docs/roadmap/items/prerequisites-and-semantic-search-setup.md +41 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap.html +234 -2
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_workspace_scope.py +63 -0
- boost_skill_cli-1.0.308/tests/unit/test_dense_status.py +314 -0
- boost_skill_cli-1.0.308/tests/unit/test_project_mcp_sidecar.py +187 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.gitattributes +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.gitignore +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.gitleaks.toml +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.htmlvalidate.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.lighthouserc.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.lycheeignore +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.markdownlint-cli2.jsonc +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.pre-commit-config.yaml +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.stylelintrc.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.vale/styles/boost/Terminology.yml +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.vale/styles/config/vocabularies/boost/accept.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/.vale.ini +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/CLAUDE.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/CODE_OF_CONDUCT.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/CONTRIBUTING.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/LICENSE +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/MANIFEST.in +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/Makefile +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/README.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/SECURITY.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/__init__.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/__main__.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/cli.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/cliparse.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/__init__.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/_common.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/bmad.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/configuration.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/discovery.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/hooks.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/info.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/intelligence.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/run.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/safety.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/taps.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/commands/team.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/__init__.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/adapters.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/agents.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/ai.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/capabilities.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/catalog.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/claude_settings.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/config.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/ed25519.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/embed.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/faithfulness.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/frontmatter.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/gitutil.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/imperative.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/injectscan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/installscan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/integrity.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/journal.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/lockfile.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/logs.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/mcp.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/mcpdecl.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/mcphost.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/minisign.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/nethttp.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/output.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/paths.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/policy.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/projectlock.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/provenance.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/rag.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/registry.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/resolve.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/rules.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/scopes.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/secretscan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/selfupdate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/serve.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/stackprobe.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/staleness.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/trustaudit.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/typosquat.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/updatediff.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/util.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/core/workflows.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/data/registries.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/errors.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_cli/spin.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/dependency_links.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/entry_points.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/requires.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/boost_skill_cli.egg-info/top_level.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/codecov.yml +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/.claude/settings.local.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/DEBUGGING.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/adapters.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/architecture/README.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/architecture/c4-components-core.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/architecture/c4-containers.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/architecture/c4-context.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/architecture/c4-dynamic-install.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/distill.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/doctor.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/explain.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/hooks.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/install.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/pulse.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/search.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/gifs/tap.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/distill.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/doctor.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/explain.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/hooks.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/install.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/pulse.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/search.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel/tapes/tap.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/carousel.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/commands.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/demo.gif +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/demo.tape +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/design-roadmap.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/eval.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/index.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/mcp-hub.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/rag-architecture.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D01.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D02.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D03.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D04.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D05.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D06.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D07.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D08.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D09.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D10.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D11.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D12.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D13.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D14.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D15.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D16.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D17.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D18.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D19.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D20.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D21.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D22.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D23.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D24.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D25.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/BOOST-D26.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/accessibility-audit-pa11y-ci-axe-core.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/actionlint-skips-shellcheck-silently.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/adapter-conformance-langgraph-leg-never-ran.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ai-bridge-silent-failure-logging.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ambiguous-tap-short-name-resolution.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/atomic-skill-install-temp-dir-swap.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/boost-run-live-agents.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/bring-commands-under-mutation-testing.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/broken-link-and-anchor-checking-lychee.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/browse-crashes-selecting-a-rule-or-workflow.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/build-provenance-slsa-attestations.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/cache-the-catalog-entry-set-across-rag-queries.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/capability-manifest-and-least-privilege-policy.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ci-job-timeout-minutes.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ci-summary-step-fails-itself.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ci-time-is-now-runner-queueing.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/clean-env-install-smoke-pip-and-pipx.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/code-scanning-rule-can-be-restored.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/codeql-job-rename-stranded-merge-protection.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/command-carousel-page.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/command-reference-docs-site.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/complexity-and-dead-code-radar-xenon-vulture.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/consolidate-skill-staleness-drift-logic-into-cor.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/coverage-dashboard-codecov-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/coverage-guided-fuzzing-atheris-oss-fuzz.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/crash-listing-branch-untested.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/crash-recorder-error-paths-core-logs-py.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/demo-cannot-open-its-own-pr.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/demo-gif-workflow-has-never-succeeded.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/dense-search-fallback-and-stale-tap-pruning.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependabot-missing-pip-ecosystem.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependabot-regeneration-drops-platform-pins.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependabot-root-pip-entry-duplicates-requirements.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/dependency-cve-gate-pip-audit.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/docsite-chrome-and-content-audit.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/docstring-coverage-interrogate.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/doctor-checks-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/end-of-options-guard-on-git-commands.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/extension-free-tests-core-dense-py.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/finish-mutation-hardening-across-core.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/fix-self-update-version-detection-dead-branch.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/fork-safe-network-proxy-handler.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/framework-adapter-langgraph.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/framework-adapter-multi-agent.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/framework-adapters-boost-adapt.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/frontmatter-scalar-over-coercion.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/gemini-cli-agent-target.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/github-community-health-files.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/github-pages-deploy-is-broken-every-push.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/golden-set-statistical-power.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/hash-pinned-reproducible-toolchain-uv-lock.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/html-validation-html-validate.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-docs-never-mentioned-upgrading.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-from-path-bypasses-policy-and-pin-checks.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-resolves-skill-dependencies.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/install-scope-user-or-project.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/installed-skill-trust-audit.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/integrity-verification-boost-verify.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/internal-architecture-diagrams.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/journal-rotation-race-and-handle-leak.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/keyless-item.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/layering-guard-import-linter.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/license-compliance-scanning.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/lighthouse-ci-on-the-pages-site.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/lint-tap-misscopes-rule-workflow-entries.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/list-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/localize-the-stored-bm25-snippet.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/lock-invariant-cannot-parse-extras-pins.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/lockfile-enforcement-and-commit-pinning.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/log-timestamps-mislabeled-utc.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/lowest-version-resolution-uv-resolution-lowest-d.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/main-has-no-branch-protection.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/main-ruleset-ref-pattern-has-literal-quotes.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/make-lint-masks-actionlint-failures.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/make-the-roadmaps-discoverable.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/markdown-consistency-markdownlint-cli2.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/markdownlint-lints-the-fuzz-corpus.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-aware-skills.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-check-skills-before-starting-a-task.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-hub-diagram-node-text-overflow.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-install-skips-the-injection-scan.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-launch-objc-fork-safety.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-register-names-server-before-env.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-search-before-reinventing.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mcp-startup-self-harden-fork-safety.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/memoize-config-load-in-process.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/merge-queue-would-deadlock-most-required-checks.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/merged-loop-branches-are-never-pruned.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/modernization-smells-refurb-pyupgrade.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-gate-was-the-whole-critical-path.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-hardening-core-frontmatter-py.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-hardening-core-gitutil-py.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-hardening-core-store-py.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mutation-shard-floor-is-one-file.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/mypy-strict-mode-for-commands.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/negative-limit-inverts-log-pulse-output.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/one-command-every-env-nox.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/one-commit-can-cut-two-releases.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/one-shared-atomic-write-helper.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/package-metadata-validation-twine-check-friends.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/patch-coverage-gate-diff-cover.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/path-traversal-unsanitized-rule-workflow-name.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/performance-regression-gate-pytest-benchmark.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/pin-the-lint-toolchain.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/post-deploy-smoke-headless-load-check.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/project-scope-across-every-command.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/project-scope-symlink-escape-on-write.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/prompt-injection-scanning-of-skill-markdown.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/property-based-tests-hypothesis-on-the-parsers.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/prose-and-terminology-linting-vale.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/prune-ignored-dirs-during-scan-dir-walk.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/publish-gate-ignores-pip-audit-and-metadata.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/publish-trigger-was-reachable-from-a-fork.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/pytest-tmpdir-cve-blocked-by-py39-floor.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/quality-dashboard-sonarcloud-free-for-oss.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ranx-significance-monitor.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/reconcile-the-theme-drift.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/refresh-the-marketing-surface.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/rel-time-tests-race-the-wall-clock.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/release-verifies-the-wrong-commit.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/required-checks-can-declare-a-check-that-deadlocks-prs.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/required-checks-config-drift.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/retrieval-quality-eval-harness.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/reuse-helpers-kill-minor-dead-work.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/roadmap-html-goes-stale-on-every-rebase.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/robust-tag-argument-parsing.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/ruff-016-widens-the-default-rule-set.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/rule-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/runner-egress-monitoring-stepsecurity-harden-run.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/runtime-explain-faithfulness-guardrail.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-aware-scanning-osv-scanner.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-declares-the-wrong-version.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-on-every-release-cyclonedx-syft.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/sbom-release-event-never-fires.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/scan-and-sync-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/scheduled-toolchain-lock-regeneration.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/scorecard-findings-triage.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/second-type-checker-pyright.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/secret-and-pii-scanning-of-installed-skills.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/secret-scanning-gitleaks-push-protection.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/security-linting-bandit-via-ruff-s-rules.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/self-update-broken-for-pip-pipx-installs.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/serve-py-traversal-guards-untested.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/shift-left-gate-pre-commit-pre-commit-ci.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/single-imperative-rule-extractor.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/single-tech-stack-prober.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/split-oversized-command-modules.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/startup-and-import-time-budget-x-importtime.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/stop-re-serializing-entry-meta-on-every-search.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/structured-json-log-output-mode.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/supply-chain-posture-openssf-scorecard.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/surface-every-docs-page-from-the-guide.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/sync-deletes-unowned-broken-symlinks.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/sync-relinks-into-every-agent-ignoring-scope.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/tap-signing-and-provenance-sigstore-minisign.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/theme-asset-linting-stylelint-eslint.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/typo-detection-codespell.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/typosquat-and-name-confusion-detection.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/unify-tilde-two-copies-have-a-boundary-bug.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/uninstall-has-no-confirmation-prompt.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/untrack-generated-build-noise.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/update-diff-before-apply.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/update-refreshes-rules-and-workflows.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/update-reinstall-widens-agent-scope.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/visual-regression-pass-on-the-guide.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/widen-the-ruff-rule-surface-b-sim-c4-perf-ruf.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/windows-in-the-ci-matrix.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/wire-bdd-suite-into-ci.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/workflow-install-native-materialization.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/workflow-linting-actionlint.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/workflow-sast-zizmor.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/workspace-scope-install.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/docs/roadmap/items/zizmor-pin-is-a-yanked-release.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/eslint.config.mjs +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/README.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/__init__.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/baseline.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/faithfulness.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/golden_set.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/make_corpus.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/make_golden.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/metrics.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/evals/run_evals.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/examples/README.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/examples/adapt-demo.sh +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/examples/boost-run-prototype.sh +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/index.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/noxfile.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/pyproject.toml +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/coverage-tools.in +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/coverage-tools.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/lint-tools.in +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/lint-tools.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/mutation-tools.in +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/mutation-tools.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/platform-pins.lock +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/release-tools.in +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/release-tools.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/test-tools.in +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/requirements/test-tools.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/a11y_check.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/bench_cli.sh +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/build_command_reference.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/build_registries.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/build_roadmap.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/check_anchors.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/check_licenses.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/check_required_checks.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/ensure_eval_corpus.sh +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/eval_explain.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/eval_gate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/eval_recommend.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/eval_retrieval.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/import_budget.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/lock_toolchain.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/mutation_gate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/mutation_shards.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/mutation_weights.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/perf_gate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/release_guard.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/scripts/release_preflight.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/setup.cfg +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/sonar-project.properties +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/style/README.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/style/boost.css +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/style/boost.js +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/style/demo.html +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/adapt.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/browse.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/count.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/discover.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/doctor.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/environment.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/explain.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/index.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/install.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/list.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/mcp.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/search.feature +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/cli_steps.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/discovery_steps.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/mcp_steps.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/bdd/features/steps/quality_steps.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/conftest.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/eval/baseline.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/eval/explain.jsonl +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/eval/golden.jsonl +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/eval/recommend.jsonl +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/eval/taps.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_capabilities_policy.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_adapt.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_bmad.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_configuration.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_discovery.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_hooks.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_info.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_intelligence.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_pkg.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_quality.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_taps.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_cli_team.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_everyday_loop.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_integrity_enforce.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_property_parsers.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_run.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/functional/test_tap_signing.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/README.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/01-typical.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/02-lossy-version.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/03-lossy-numbers.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/04-lists.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/05-nested.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/06-empty-block.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/07-unterminated.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/08-none.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/09-unbalanced-quote.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/10-keywords.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/11-crlf.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/frontmatter/12-bom.md +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/01-shorthand.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/02-https.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/03-ssh.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/04-traversal.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/05-empty.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/06-space.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/07-slash.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/corpus/registry/08-bare-host.txt +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/fuzz_frontmatter.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/fuzz/fuzz_registry.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/make_fixture.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/perf/test_benchmarks.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/smoke.sh +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_a11y_check.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_adapters.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_adapters_multi.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_adapters_runner.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_agents.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_ai.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_capabilities.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_catalog.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_check_anchors.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_check_licenses.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_claude_settings.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_cliparse.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_codeql_analysis_key.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_command_reference_fresh.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_community_health_files.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_config.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_dense.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_dense_fallback.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_dependabot_config.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_docs_pages_linked.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_docsite_chrome.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_ed25519.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_embed.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_errors_and_cli_table.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_eval_faithfulness.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_eval_gate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_eval_metrics.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_eval_stats_summary.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_faithfulness.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_frontmatter.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_fuzz_targets.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_gitleaks_config.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_gitutil.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_imperative.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_import_budget.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_injectscan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_installscan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_integrity.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_journal.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_lockfile.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_logs.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_marketing_counts.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mcp.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mcp_install_scan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mcpdecl.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mcphost.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_minisign.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mutation_hardening.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mutation_shards.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mutation_subfile_shards.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_mutmut_source_paths.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_nethttp.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_output.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_paths.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_perf_gate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_pkg_confusions.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_pkg_injection.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_pkg_secrets.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_platform_pins.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_policy.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_post_deploy_smoke.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_projectlock.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_provenance.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_rag.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_registries_fresh.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_registry.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_registry_categories.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_release_guard.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_release_preflight.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_required_checks.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_resolve.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_roadmap_fresh.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_rules.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_scopes.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_secretscan.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_selfupdate.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_serve.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_spin.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_stackprobe.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_staleness.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_store.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_token_parity.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_toolchain_lock.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_trustaudit.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_typosquat.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_updatediff.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_util.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_version.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_workflow_concurrency.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_workflow_timeouts.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/unit/test_workflows.py +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/visual/a11y_check.mjs +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/visual/console_check.mjs +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/visual/package-lock.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/visual/package.json +0 -0
- {boost_skill_cli-1.0.306 → boost_skill_cli-1.0.308}/tests/visual/visual_check.mjs +0 -0
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '1.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (1, 0,
|
|
21
|
+
__version__ = version = '1.0.308'
|
|
22
|
+
__version_tuple__ = version_tuple = (1, 0, 308)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -123,7 +123,33 @@ def _offer_mcp(res: store.InstallResult, no_mcp: bool = False) -> None:
|
|
|
123
123
|
rows = res.mcp_servers
|
|
124
124
|
if not rows or no_mcp or os.environ.get("BOOST_NO_MCP_OFFER"):
|
|
125
125
|
return
|
|
126
|
-
from ..core import mcpdecl
|
|
126
|
+
from ..core import mcpdecl, scopes
|
|
127
|
+
# A project-scoped install already recorded these in the repo's .mcp.json
|
|
128
|
+
# (store.register_project_mcp), which is the committable, reviewable
|
|
129
|
+
# registration `--scope project` promises. Offering a `<host> mcp add` on
|
|
130
|
+
# top would register the same servers a second time, machine-wide — which
|
|
131
|
+
# is the bug this path had: the offer never looked at res.scope at all.
|
|
132
|
+
if res.scope == scopes.SCOPE_PROJECT:
|
|
133
|
+
# Report what was RECORDED, not what was declared. The two differ when
|
|
134
|
+
# the sidecar could not be written — a read-only checkout, a root-owned
|
|
135
|
+
# .mcp.json — and claiming success there would be the worse failure,
|
|
136
|
+
# because the skill really is installed and the servers really are not.
|
|
137
|
+
wanted = [r["name"] for r in mcpdecl.registrable(rows)]
|
|
138
|
+
if not wanted:
|
|
139
|
+
return
|
|
140
|
+
out.info("")
|
|
141
|
+
if res.mcp_recorded:
|
|
142
|
+
out.ok("recorded %s in %s"
|
|
143
|
+
% (_plural(len(res.mcp_recorded), "MCP server"),
|
|
144
|
+
mcpdecl.SIDECAR))
|
|
145
|
+
out.dim(" %s — commit it to share with the team"
|
|
146
|
+
% ", ".join(res.mcp_recorded))
|
|
147
|
+
else:
|
|
148
|
+
out.warn("could not write %s — %s not registered"
|
|
149
|
+
% (mcpdecl.SIDECAR, ", ".join(wanted)))
|
|
150
|
+
out.dim(" the skill is installed; fix the file's permissions and "
|
|
151
|
+
"reinstall to record them")
|
|
152
|
+
return
|
|
127
153
|
out.info("")
|
|
128
154
|
out.warn("%s needs %s to work:" % (res.name, _plural(len(rows), "MCP server")))
|
|
129
155
|
for row in rows:
|
|
@@ -142,22 +168,32 @@ def _offer_mcp(res: store.InstallResult, no_mcp: bool = False) -> None:
|
|
|
142
168
|
targets = [h for h in mcphost.hosts() if shutil.which(mcphost.cli(h))] \
|
|
143
169
|
or mcphost.hosts()
|
|
144
170
|
where = " · ".join(mcphost.label(h) for h in targets)
|
|
145
|
-
|
|
171
|
+
# Name the scope. The prompt used to say only "register N servers with
|
|
172
|
+
# Claude Code now?", which is the one detail the answer turns on — this
|
|
173
|
+
# writes a registration every project on this machine will then launch.
|
|
174
|
+
if not out.confirm("register %s with %s, for every project on this machine?"
|
|
146
175
|
% (_plural(len(wirable), "server"), where), default=False):
|
|
147
176
|
out.dim(" skipped — `%s mcp add …` when you're ready"
|
|
148
177
|
% mcphost.cli(targets[0]))
|
|
149
178
|
return
|
|
150
179
|
for row in wirable:
|
|
151
180
|
for host in targets:
|
|
152
|
-
_register_mcp_server(row["name"], row["spec"], host=host
|
|
181
|
+
_register_mcp_server(row["name"], row["spec"], host=host,
|
|
182
|
+
scope=res.scope)
|
|
153
183
|
|
|
154
184
|
|
|
155
|
-
def _register_mcp_server(name: str, spec: dict, host: str = "claude"
|
|
156
|
-
|
|
185
|
+
def _register_mcp_server(name: str, spec: dict, host: str = "claude",
|
|
186
|
+
scope: str = "user") -> None:
|
|
187
|
+
"""Run one `<host> mcp add` for a skill-declared server. Never raises.
|
|
188
|
+
|
|
189
|
+
``scope`` is threaded from the install rather than defaulted, because
|
|
190
|
+
``register_argv``'s own default is ``"user"`` and silently taking it is how
|
|
191
|
+
a ``--scope project`` install ended up registering machine-wide.
|
|
192
|
+
"""
|
|
157
193
|
import subprocess
|
|
158
194
|
|
|
159
195
|
from ..core import mcpdecl, mcphost
|
|
160
|
-
argv = mcpdecl.register_argv(name, spec, host=host)
|
|
196
|
+
argv = mcpdecl.register_argv(name, spec, host=host, scope=scope)
|
|
161
197
|
if not shutil.which(mcphost.cli(host)):
|
|
162
198
|
out.warn("`%s` CLI not found — run this yourself:" % mcphost.cli(host))
|
|
163
199
|
out.info(" " + " ".join(argv))
|
|
@@ -365,9 +365,25 @@ def cmd_doctor(argv):
|
|
|
365
365
|
if not rotation:
|
|
366
366
|
bad("journal is overdue for rotation — run `boost heal`")
|
|
367
367
|
|
|
368
|
+
# Which search engine will actually answer a query. Dense retrieval needs
|
|
369
|
+
# three things to line up and every one of them fails silently, so doctor
|
|
370
|
+
# is where the answer belongs — `search` only ever reports the engine that
|
|
371
|
+
# already ran, never that a configured one never got the chance.
|
|
372
|
+
_report_search_engine(bad)
|
|
373
|
+
|
|
368
374
|
lp = logs.log_path()
|
|
369
375
|
if lp.exists():
|
|
370
|
-
|
|
376
|
+
# Existence is not health: a log the process cannot open makes every
|
|
377
|
+
# invocation print a PermissionError traceback from the logging module
|
|
378
|
+
# while this check happily reported a ✓ for the same file. Diagnostics
|
|
379
|
+
# are the first thing consulted when something else breaks, so a log
|
|
380
|
+
# that silently accepts nothing has to read as a fault.
|
|
381
|
+
if os.access(str(lp), os.W_OK):
|
|
382
|
+
out.ok("diagnostic log at %s" % _tilde(lp))
|
|
383
|
+
else:
|
|
384
|
+
bad("diagnostic log %s is not writable — every invocation is "
|
|
385
|
+
"failing to record; fix its permissions (chmod u+w)"
|
|
386
|
+
% _tilde(lp))
|
|
371
387
|
crashes = sorted(paths.logs_dir().glob("crash-*.log")) \
|
|
372
388
|
if paths.logs_dir().is_dir() else []
|
|
373
389
|
if crashes:
|
|
@@ -391,6 +407,59 @@ def cmd_doctor(argv):
|
|
|
391
407
|
return 1 if issues else 0
|
|
392
408
|
|
|
393
409
|
|
|
410
|
+
# Why dense retrieval isn't serving, keyed by `dense.status()["reason"]`. Each
|
|
411
|
+
# names the ONE next action; the reason order in `status()` guarantees only the
|
|
412
|
+
# first missing link is ever reported, so these never chain.
|
|
413
|
+
_DENSE_FIX = {
|
|
414
|
+
"no-backend": "install the extra: `pip install 'boost-skill-cli[rag]'`",
|
|
415
|
+
"no-key": "set VOYAGE_API_KEY or OPENAI_API_KEY",
|
|
416
|
+
"no-store": "build it: `boost reindex --dense`",
|
|
417
|
+
"version-changed": "rebuild it: `boost reindex --dense --force`",
|
|
418
|
+
"provider-changed": "rebuild it: `boost reindex --dense --force`",
|
|
419
|
+
"model-changed": "rebuild it: `boost reindex --dense --force`",
|
|
420
|
+
"dim-changed": "rebuild it: `boost reindex --dense --force`",
|
|
421
|
+
"empty": "rebuild it: `boost reindex --dense --force`",
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def _report_search_engine(bad) -> None:
|
|
426
|
+
"""Report the engine `boost search` will use, and why it isn't the best one.
|
|
427
|
+
|
|
428
|
+
Only a *degraded* dense tier counts against doctor's exit code: BM25 is the
|
|
429
|
+
documented default and most users never opt in, so an unconfigured tier is
|
|
430
|
+
healthy. Vectors already on disk that have stopped serving are not.
|
|
431
|
+
"""
|
|
432
|
+
# Local import: the dense/embedding engines are opt-in and stay out of
|
|
433
|
+
# startup for every other command (scripts/import_budget.py enforces it).
|
|
434
|
+
from ..core import dense
|
|
435
|
+
st = dense.status()
|
|
436
|
+
|
|
437
|
+
if st["ready"]:
|
|
438
|
+
out.ok("semantic search active — %s %s (%d-d), %d chunk%s across %d tap%s"
|
|
439
|
+
% (st["provider"], st["model"], st["dim"] or 0,
|
|
440
|
+
st["chunks"], _s(st["chunks"]), st["taps"], _s(st["taps"])))
|
|
441
|
+
return
|
|
442
|
+
|
|
443
|
+
fix = _DENSE_FIX.get(str(st["reason"]), "see `boost reindex --dense`")
|
|
444
|
+
if st["degraded"]:
|
|
445
|
+
# The store was built and is now dead weight: say what it holds, what
|
|
446
|
+
# changed, and that search has silently been on BM25 the whole time.
|
|
447
|
+
built = st["built_model"] or st["built_provider"] or "an older build"
|
|
448
|
+
detail = "built with %s" % built
|
|
449
|
+
if st["reason"] == "model-changed":
|
|
450
|
+
detail += ", live key is %s" % st["model"]
|
|
451
|
+
elif st["reason"] == "provider-changed":
|
|
452
|
+
detail += ", live key is %s" % st["provider"]
|
|
453
|
+
elif st["reason"] == "empty":
|
|
454
|
+
detail += " but holds no vectors"
|
|
455
|
+
bad("semantic search silently off — %d-chunk vector store %s; "
|
|
456
|
+
"searches are using BM25. %s" % (st["chunks"], detail, fix))
|
|
457
|
+
return
|
|
458
|
+
|
|
459
|
+
out.info("semantic search not configured — using the full-content BM25 "
|
|
460
|
+
"engine (%s)" % fix)
|
|
461
|
+
|
|
462
|
+
|
|
394
463
|
def _print_skipped(skipped: List[dict]) -> None:
|
|
395
464
|
"""Note the rule/workflow entries `lint` passed over (they have no SKILL.md)."""
|
|
396
465
|
if not skipped:
|
|
@@ -102,6 +102,106 @@ def _chunk_texts(entry: dict, tap_paths: Optional[Dict[str, Path]]
|
|
|
102
102
|
return chunk(body) or [body]
|
|
103
103
|
|
|
104
104
|
|
|
105
|
+
def _recorded_meta() -> dict:
|
|
106
|
+
"""What an existing store says it was built with, read WITHOUT sqlite-vec.
|
|
107
|
+
|
|
108
|
+
Deliberately not routed through :func:`_connect`, which loads the extension
|
|
109
|
+
and returns ``None`` without it: the most useful diagnostic line ("your
|
|
110
|
+
store was built with voyage-3") would then vanish in exactly the case that
|
|
111
|
+
needs it — a user who dropped the ``[rag]`` extra and wants to know why
|
|
112
|
+
dense went quiet. ``meta`` is a plain table, so plain sqlite3 can read it.
|
|
113
|
+
"""
|
|
114
|
+
p = db_path()
|
|
115
|
+
if not p.exists():
|
|
116
|
+
return {}
|
|
117
|
+
try:
|
|
118
|
+
con = sqlite3.connect(str(p))
|
|
119
|
+
except sqlite3.Error:
|
|
120
|
+
return {}
|
|
121
|
+
try:
|
|
122
|
+
meta = _read_meta(con)
|
|
123
|
+
try:
|
|
124
|
+
meta["_chunks"] = con.execute(
|
|
125
|
+
"SELECT COUNT(*) FROM chunks").fetchone()[0]
|
|
126
|
+
except sqlite3.DatabaseError:
|
|
127
|
+
meta["_chunks"] = 0
|
|
128
|
+
return meta
|
|
129
|
+
except sqlite3.DatabaseError:
|
|
130
|
+
# A truncated or non-sqlite file: report "no store", never raise into
|
|
131
|
+
# a health check whose whole job is to survive a broken install.
|
|
132
|
+
return {}
|
|
133
|
+
finally:
|
|
134
|
+
con.close()
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def status() -> dict:
|
|
138
|
+
"""Why dense retrieval is, or is not, serving queries.
|
|
139
|
+
|
|
140
|
+
Pure inspection — never builds, never embeds, never needs the extra. Three
|
|
141
|
+
independent things must line up (the ``[rag]`` extra, an embeddings key, a
|
|
142
|
+
built store whose space matches the live one) and every one of them fails
|
|
143
|
+
*silently* today, because :func:`rag.retrieve_any` floors to BM25 and
|
|
144
|
+
returns. ``reason`` names which link is missing so a caller can say so.
|
|
145
|
+
|
|
146
|
+
``degraded`` is the load-bearing distinction: a user who never configured
|
|
147
|
+
dense search is *healthy* (BM25 is the documented default), while a user
|
|
148
|
+
who did all three steps and is still on BM25 has a real problem no other
|
|
149
|
+
surface reports. Only the latter should move an exit code.
|
|
150
|
+
"""
|
|
151
|
+
have_be = have_backend()
|
|
152
|
+
prov, mdl, dim = embed.provider(), embed.model(), embed.dimension()
|
|
153
|
+
meta = _recorded_meta()
|
|
154
|
+
b_prov = meta.get("provider")
|
|
155
|
+
b_mdl = meta.get("model")
|
|
156
|
+
b_dim = meta.get("dim")
|
|
157
|
+
b_ver = meta.get("version")
|
|
158
|
+
commits = meta.get("commits")
|
|
159
|
+
chunks = int(meta.get("_chunks") or 0)
|
|
160
|
+
store_exists = bool(meta)
|
|
161
|
+
|
|
162
|
+
# Order matters: report the *first* missing link, so the message names the
|
|
163
|
+
# next action rather than a downstream symptom of the same gap.
|
|
164
|
+
if not have_be:
|
|
165
|
+
reason: Optional[str] = "no-backend"
|
|
166
|
+
elif prov is None:
|
|
167
|
+
reason = "no-key"
|
|
168
|
+
elif not store_exists:
|
|
169
|
+
reason = "no-store"
|
|
170
|
+
elif b_ver != INDEX_VERSION:
|
|
171
|
+
reason = "version-changed"
|
|
172
|
+
elif b_prov != prov:
|
|
173
|
+
reason = "provider-changed"
|
|
174
|
+
elif b_mdl != mdl:
|
|
175
|
+
reason = "model-changed"
|
|
176
|
+
elif b_dim != dim:
|
|
177
|
+
reason = "dim-changed"
|
|
178
|
+
elif chunks <= 0:
|
|
179
|
+
reason = "empty"
|
|
180
|
+
else:
|
|
181
|
+
reason = None
|
|
182
|
+
|
|
183
|
+
# Unconfigured is not degraded; a built-but-unusable store is. Vectors on
|
|
184
|
+
# disk are the proof of intent — the user paid to embed them, so anything
|
|
185
|
+
# that stops them serving (a dropped extra, an unset key, a changed model)
|
|
186
|
+
# is a real fault. Without a store there is nothing to have regressed:
|
|
187
|
+
# "no-store" is an unfinished setup, and it is the one reason that implies
|
|
188
|
+
# store_exists is False, so this single clause covers every case.
|
|
189
|
+
degraded = store_exists and reason is not None
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
"backend": have_be,
|
|
193
|
+
"provider": prov, "model": mdl, "dim": dim,
|
|
194
|
+
"store_exists": store_exists,
|
|
195
|
+
"built_provider": b_prov, "built_model": b_mdl,
|
|
196
|
+
"built_dim": b_dim, "built_version": b_ver,
|
|
197
|
+
"chunks": chunks,
|
|
198
|
+
"taps": len(commits) if isinstance(commits, dict) else 0,
|
|
199
|
+
"ready": reason is None,
|
|
200
|
+
"reason": reason,
|
|
201
|
+
"degraded": degraded,
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
105
205
|
def ready() -> bool:
|
|
106
206
|
"""True when a usable, provider-matched vector index exists on disk."""
|
|
107
207
|
if not have_backend() or not embed.available() or not db_path().exists():
|
|
@@ -51,6 +51,10 @@ class InstallResult:
|
|
|
51
51
|
# but never acted on: core stays non-interactive, so the command layer owns
|
|
52
52
|
# the offer to register them — same split as `conflicts` and `score`.
|
|
53
53
|
mcp_servers: List[dict] = field(default_factory=list)
|
|
54
|
+
# Names actually written to the project's .mcp.json — not what was
|
|
55
|
+
# declared. The two differ when the file could not be written, and the
|
|
56
|
+
# install report must show the former.
|
|
57
|
+
mcp_recorded: List[str] = field(default_factory=list)
|
|
54
58
|
|
|
55
59
|
|
|
56
60
|
def skill_store_dir(name: str) -> Path:
|
|
@@ -266,6 +270,89 @@ def declared_mcp_servers(skill_dir) -> List[dict]:
|
|
|
266
270
|
return mcpdecl.servers_for(meta, sidecar)
|
|
267
271
|
|
|
268
272
|
|
|
273
|
+
def project_mcp_sidecar(base) -> Path:
|
|
274
|
+
"""The repo's ``.mcp.json`` — where a project-scoped install records servers.
|
|
275
|
+
|
|
276
|
+
The committable file agents already read, which is the whole point of
|
|
277
|
+
project scope over shelling out to ``<host> mcp add``: a registration that
|
|
278
|
+
lives here is reviewable in a diff and arrives with a teammate's clone,
|
|
279
|
+
where one made through a host CLI exists only on the machine that ran it.
|
|
280
|
+
"""
|
|
281
|
+
from . import mcpdecl
|
|
282
|
+
return Path(base) / mcpdecl.SIDECAR
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _load_sidecar(path: Path) -> Optional[dict]:
|
|
286
|
+
"""The sidecar document, or None if absent or unreadable.
|
|
287
|
+
|
|
288
|
+
Best-effort by design, exactly like :func:`declared_mcp_servers`: by the
|
|
289
|
+
time this runs the skill is already on disk, so a corrupt ``.mcp.json`` must
|
|
290
|
+
not turn a completed install into a traceback. ``merge_into`` treats a
|
|
291
|
+
non-dict as empty, so a damaged file is rebuilt rather than propagated.
|
|
292
|
+
"""
|
|
293
|
+
import json
|
|
294
|
+
try:
|
|
295
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
296
|
+
except (OSError, ValueError):
|
|
297
|
+
return None
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _write_sidecar(path: Path, doc: dict) -> bool:
|
|
301
|
+
"""Write the sidecar as indented JSON. False if it could not be written.
|
|
302
|
+
|
|
303
|
+
Best-effort on the way OUT as well as in. ``_load_sidecar`` already refuses
|
|
304
|
+
to turn a corrupt file into a traceback, but the write is the half that runs
|
|
305
|
+
*after* the skill is materialized, the lock is written and the journal is
|
|
306
|
+
logged — so an unwritable ``.mcp.json`` (read-only checkout, a root-owned
|
|
307
|
+
file, a full disk) would crash an install that had already succeeded. The
|
|
308
|
+
caller reports what was actually recorded rather than what was declared, so
|
|
309
|
+
a failure here is visible instead of silent.
|
|
310
|
+
"""
|
|
311
|
+
import json
|
|
312
|
+
try:
|
|
313
|
+
path.write_text(json.dumps(doc, indent=2, sort_keys=True) + "\n",
|
|
314
|
+
encoding="utf-8")
|
|
315
|
+
return True
|
|
316
|
+
except OSError:
|
|
317
|
+
return False
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def register_project_mcp(base, rows, skill: str) -> List[str]:
|
|
321
|
+
"""Record ``skill``'s declared MCP servers in the repo. Returns names added.
|
|
322
|
+
|
|
323
|
+
Never overwrites a server already present — one the user configured by hand,
|
|
324
|
+
or one another skill declared first — and never creates the file for a skill
|
|
325
|
+
that declares nothing registrable, so a repo gains an ``.mcp.json`` only
|
|
326
|
+
when there is genuinely something in it.
|
|
327
|
+
"""
|
|
328
|
+
from . import mcpdecl as _decl
|
|
329
|
+
if not _decl.registrable(rows):
|
|
330
|
+
return []
|
|
331
|
+
path = project_mcp_sidecar(base)
|
|
332
|
+
doc, added = _decl.merge_into(_load_sidecar(path), rows, skill)
|
|
333
|
+
if added and not _write_sidecar(path, doc):
|
|
334
|
+
return [] # nothing was recorded; do not claim otherwise
|
|
335
|
+
return added
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def unregister_project_mcp(base, skill: str) -> List[str]:
|
|
339
|
+
"""Remove the servers boost recorded for ``skill``. Returns names removed.
|
|
340
|
+
|
|
341
|
+
Marker-keyed entries only, so a hand-configured server and another skill's
|
|
342
|
+
server both survive. Writes nothing when it owns nothing, which keeps an
|
|
343
|
+
uninstall from rewriting — and reformatting — a file it has no claim on.
|
|
344
|
+
"""
|
|
345
|
+
from . import mcpdecl as _decl
|
|
346
|
+
path = project_mcp_sidecar(base)
|
|
347
|
+
existing = _load_sidecar(path)
|
|
348
|
+
if existing is None:
|
|
349
|
+
return []
|
|
350
|
+
doc, removed = _decl.strip_owned(existing, skill)
|
|
351
|
+
if removed and not _write_sidecar(path, doc):
|
|
352
|
+
return []
|
|
353
|
+
return removed
|
|
354
|
+
|
|
355
|
+
|
|
269
356
|
def _enforce_capability_policy(name: str, skill_md: Path) -> None:
|
|
270
357
|
"""Raise if the skill's declared/detected capabilities are denied by policy.
|
|
271
358
|
|
|
@@ -501,6 +588,12 @@ def _install_project_skill(entry: dict, force: bool = False,
|
|
|
501
588
|
res.upgraded = existing is not None
|
|
502
589
|
res.scope = scopes.SCOPE_PROJECT
|
|
503
590
|
res.score, _ = util.score_skill(first)
|
|
591
|
+
res.mcp_servers = declared_mcp_servers(first)
|
|
592
|
+
# Project scope registers into the repo's own .mcp.json rather than leaving
|
|
593
|
+
# it to the command layer's `<host> mcp add` offer, which is user-scoped and
|
|
594
|
+
# would put a machine-wide registration behind a --scope project install.
|
|
595
|
+
# Recorded here so it lands with the skill and reverses with it.
|
|
596
|
+
res.mcp_recorded = register_project_mcp(resolved_base, res.mcp_servers, name)
|
|
504
597
|
return res
|
|
505
598
|
|
|
506
599
|
|
|
@@ -525,8 +618,14 @@ def uninstall_project(name: str, base=None) -> dict:
|
|
|
525
618
|
if m.get("agent"):
|
|
526
619
|
removed.append(m["agent"])
|
|
527
620
|
projectlock.remove_skill(resolved_base, name)
|
|
621
|
+
# Reverse exactly what the install recorded. Marker-keyed entries only, so a
|
|
622
|
+
# server the user configured by hand — or one another skill still needs —
|
|
623
|
+
# survives. Without this a skill tried once keeps launching its server for
|
|
624
|
+
# every project that clones the repo.
|
|
625
|
+
unregistered = unregister_project_mcp(resolved_base, name)
|
|
528
626
|
journal.log("uninstall", name, scope=scopes.SCOPE_PROJECT)
|
|
529
627
|
return {"name": name, "unlinked": removed, "entry": entry,
|
|
628
|
+
"mcp_unregistered": unregistered,
|
|
530
629
|
"scope": scopes.SCOPE_PROJECT, "base": str(resolved_base)}
|
|
531
630
|
|
|
532
631
|
|
|
@@ -169,6 +169,7 @@ docs/roadmap/items/ambiguous-tap-short-name-resolution.md
|
|
|
169
169
|
docs/roadmap/items/atomic-corruption-safe-lock-file-writes.md
|
|
170
170
|
docs/roadmap/items/atomic-skill-install-temp-dir-swap.md
|
|
171
171
|
docs/roadmap/items/autonomous-ship-workflow-and-isolated-worktree.md
|
|
172
|
+
docs/roadmap/items/bm25-index-is-one-json-blob.md
|
|
172
173
|
docs/roadmap/items/boost-run-live-agents.md
|
|
173
174
|
docs/roadmap/items/bring-commands-under-mutation-testing.md
|
|
174
175
|
docs/roadmap/items/broken-link-and-anchor-checking-lychee.md
|
|
@@ -201,6 +202,7 @@ docs/roadmap/items/docsite-chrome-and-content-audit.md
|
|
|
201
202
|
docs/roadmap/items/docstring-coverage-interrogate.md
|
|
202
203
|
docs/roadmap/items/doctor-checks-rules-and-workflows.md
|
|
203
204
|
docs/roadmap/items/end-of-options-guard-on-git-commands.md
|
|
205
|
+
docs/roadmap/items/eval-corpus-cannot-see-real-retrieval.md
|
|
204
206
|
docs/roadmap/items/extension-free-tests-core-dense-py.md
|
|
205
207
|
docs/roadmap/items/extract-mcp-http-servers-out-of-configuration-py.md
|
|
206
208
|
docs/roadmap/items/finish-mutation-hardening-across-core.md
|
|
@@ -225,6 +227,7 @@ docs/roadmap/items/integrity-verification-boost-verify.md
|
|
|
225
227
|
docs/roadmap/items/internal-architecture-diagrams.md
|
|
226
228
|
docs/roadmap/items/invocation-pid-logging-for-crash-correlation.md
|
|
227
229
|
docs/roadmap/items/journal-rotation-race-and-handle-leak.md
|
|
230
|
+
docs/roadmap/items/keyless-dense-tier-local-static-embeddings.md
|
|
228
231
|
docs/roadmap/items/keyless-item.md
|
|
229
232
|
docs/roadmap/items/layering-guard-import-linter.md
|
|
230
233
|
docs/roadmap/items/license-compliance-scanning.md
|
|
@@ -261,6 +264,7 @@ docs/roadmap/items/mutation-hardening-core-gitutil-py.md
|
|
|
261
264
|
docs/roadmap/items/mutation-hardening-core-store-py.md
|
|
262
265
|
docs/roadmap/items/mutation-shard-floor-is-one-file.md
|
|
263
266
|
docs/roadmap/items/mypy-strict-mode-for-commands.md
|
|
267
|
+
docs/roadmap/items/near-duplicate-items-eat-the-result-slots.md
|
|
264
268
|
docs/roadmap/items/negative-limit-inverts-log-pulse-output.md
|
|
265
269
|
docs/roadmap/items/onboard-overwrites-generated-files-without-confirm.md
|
|
266
270
|
docs/roadmap/items/one-command-every-env-nox.md
|
|
@@ -274,6 +278,7 @@ docs/roadmap/items/pin-the-lint-toolchain.md
|
|
|
274
278
|
docs/roadmap/items/post-deploy-always-defeated-by-skipped-setup.md
|
|
275
279
|
docs/roadmap/items/post-deploy-smoke-headless-load-check.md
|
|
276
280
|
docs/roadmap/items/pre-release-python-canary-3-14t-free-threaded.md
|
|
281
|
+
docs/roadmap/items/prerequisites-and-semantic-search-setup.md
|
|
277
282
|
docs/roadmap/items/project-scope-across-every-command.md
|
|
278
283
|
docs/roadmap/items/project-scope-symlink-escape-on-write.md
|
|
279
284
|
docs/roadmap/items/promote-nav-footer-into-the-shared-style-system.md
|
|
@@ -477,6 +482,7 @@ tests/unit/test_community_health_files.py
|
|
|
477
482
|
tests/unit/test_config.py
|
|
478
483
|
tests/unit/test_dense.py
|
|
479
484
|
tests/unit/test_dense_fallback.py
|
|
485
|
+
tests/unit/test_dense_status.py
|
|
480
486
|
tests/unit/test_dependabot_config.py
|
|
481
487
|
tests/unit/test_docs_pages_linked.py
|
|
482
488
|
tests/unit/test_docsite_chrome.py
|
|
@@ -520,6 +526,7 @@ tests/unit/test_pkg_secrets.py
|
|
|
520
526
|
tests/unit/test_platform_pins.py
|
|
521
527
|
tests/unit/test_policy.py
|
|
522
528
|
tests/unit/test_post_deploy_smoke.py
|
|
529
|
+
tests/unit/test_project_mcp_sidecar.py
|
|
523
530
|
tests/unit/test_projectlock.py
|
|
524
531
|
tests/unit/test_provenance.py
|
|
525
532
|
tests/unit/test_rag.py
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: bm25-index-is-one-json-blob
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: planned
|
|
6
|
+
category: Search · Index
|
|
7
|
+
complexity: L
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: 2.5 GB RSS per search at 50k items
|
|
11
|
+
order: 72
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: The BM25 index is one JSON blob, and it stops working between 10k and 50k items
|
|
15
|
+
---
|
|
16
|
+
<code>rag.py</code> persists the whole index as a single JSON file and
|
|
17
|
+
<code>json.loads</code> it on every invocation. <code>_CACHE</code>
|
|
18
|
+
(<code>rag.py:275</code>) is process-local, so a long-lived MCP server amortises
|
|
19
|
+
the cost but <b>every cold <code>boost search</code> pays it in full</b>.
|
|
20
|
+
Measured on a synthetic corpus of real repo prose, 10k items → 50k items:<br>
|
|
21
|
+
index on disk 52.7 MB → <b>270 MB</b>;<br>
|
|
22
|
+
<code>json.loads</code> per search 2.0–2.9 s → <b>12.2–13.6 s</b>;<br>
|
|
23
|
+
peak RSS 702 MB → <b>2.49 GB</b>;<br>
|
|
24
|
+
BM25 scoring itself 31 ms → 70 ms — cold start dominates by ~200×.
|
|
25
|
+
On a real 83-tap install the index is already 132 MB at 11.1k entries. Scaling
|
|
26
|
+
that shape to 50k gives ~594 MB and ~5.7 GB resident. <b>Target RSS, not
|
|
27
|
+
bytes</b>: Python object overhead was measured at a consistent 9.5–9.6× file
|
|
28
|
+
size across three independent runs, which is what OOM-kills an 8 GB machine
|
|
29
|
+
while the disk figure still looks survivable.
|
|
30
|
+
Two cheap wins come first and are worth landing on their own.
|
|
31
|
+
<b>(1) Stop chunking.</b> An unchunked index with the item's surface
|
|
32
|
+
(name + de-hyphenated name + description) counted alongside the body scored
|
|
33
|
+
<code>recall@10 0.742 / hit@1 0.429</code> at <b>41 MB and 0.43 s</b> to load,
|
|
34
|
+
versus the live chunked index's <code>0.720 / 0.407</code> at <b>132 MB and
|
|
35
|
+
8–13 s</b> — better on every metric, 3.2× smaller, 20× faster to load.
|
|
36
|
+
<b>(2) Get postings out of JSON.</b> FTS5 is compiled into CPython's bundled
|
|
37
|
+
sqlite (verified: 3.53.4, <code>ENABLE_FTS5</code>), so there is a
|
|
38
|
+
zero-dependency path — but probe it at runtime, because that is a per-build
|
|
39
|
+
property, not a guarantee. A compact mmap-able binary postings format is the
|
|
40
|
+
alternative. Either way <code>snip</code> text (46.7 MB of the 132 MB) belongs
|
|
41
|
+
out of the hot path.
|
|
42
|
+
Also note <code>build()</code>'s incremental path is O(entire corpus): reusing
|
|
43
|
+
unchanged taps runs <code>_kept_docs</code> → <code>_postings_to_doc_tf</code>,
|
|
44
|
+
which inverts every posting in the index — measured 35 s and 1.72 GB RSS at
|
|
45
|
+
11.1k entries to reindex a single changed file.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: eval-corpus-cannot-see-real-retrieval
|
|
3
|
+
board: code
|
|
4
|
+
section: internals
|
|
5
|
+
status: planned
|
|
6
|
+
category: Quality · Eval
|
|
7
|
+
complexity: M
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 4
|
|
10
|
+
note: gate reports 1.000 while users get 0.720
|
|
11
|
+
order: 70
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: The eval gate reports a perfect score on a corpus 4× smaller than a real user's
|
|
15
|
+
---
|
|
16
|
+
<code>make eval</code> reports BM25 <code>recall@10 = 1.000</code> against the
|
|
17
|
+
pinned 23-tap corpus in <code>tests/eval/taps.txt</code>. Run the same script
|
|
18
|
+
against a real 83-tap install and it reports <b>0.720</b> — below the gate's own
|
|
19
|
+
0.85 floor — with <code>hit@1 0.407</code>, <code>MRR 0.526</code>,
|
|
20
|
+
<code>nDCG 0.566</code>, and <code>rule</code> the weakest kind at 0.500 recall /
|
|
21
|
+
0.286 hit@1. The gate has been advertising a perfect score while real-world
|
|
22
|
+
recall sits at 0.72, and it is blind in three separate ways:
|
|
23
|
+
<b>(1) recall-only flooring.</b> <code>--fail-under</code> gates
|
|
24
|
+
<code>recall@k</code> and nothing else, so a total <code>hit@1</code> collapse
|
|
25
|
+
from 0.780 to 0.000 would still pass.
|
|
26
|
+
<b>(2) regression detection is switched off.</b> <code>Makefile</code> passes
|
|
27
|
+
<code>--regression-eps 1</code>, which tolerates any absolute drop up to 1.0.
|
|
28
|
+
<b>(3) a kind oracle.</b> Grading per-row by the golden set's <code>kind</code>
|
|
29
|
+
field tells the retriever whether the answer is a skill, a rule or a workflow —
|
|
30
|
+
which <code>boost search</code> never knows unless the user passes
|
|
31
|
+
<code>--kind</code>. That single filter is worth +0.073 recall and +0.073 hit@1,
|
|
32
|
+
enough to flatter any change measured against it.
|
|
33
|
+
<b>The consequence is that no retrieval work in the repo is currently
|
|
34
|
+
falsifiable</b>, which makes this a hard prerequisite for every other item in
|
|
35
|
+
this group rather than a cleanup. Note the companion gate is in better shape:
|
|
36
|
+
<code>make evals</code> (<code>scripts/eval_gate.py</code>) already floors five
|
|
37
|
+
metrics and runs a paired bootstrap for significance — its limitation is corpus
|
|
38
|
+
size (57 entries, 1 tap), not metric design, so the work is to grow an
|
|
39
|
+
instrument that exists rather than to build one. Also needed: queries that
|
|
40
|
+
<em>only</em> body text can satisfy. The golden set grades items by name, so it
|
|
41
|
+
scores a surface-only index <em>above</em> the full-content one and would
|
|
42
|
+
cheerfully greenlight deleting body indexing altogether.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: keyless-dense-tier-local-static-embeddings
|
|
3
|
+
board: code
|
|
4
|
+
section: pipeline
|
|
5
|
+
status: planned
|
|
6
|
+
category: Search · Retrieval
|
|
7
|
+
complexity: L
|
|
8
|
+
impact: High
|
|
9
|
+
wow: 5
|
|
10
|
+
note: semantic search with no key, no billing, no deps
|
|
11
|
+
order: 73
|
|
12
|
+
owner:
|
|
13
|
+
pr:
|
|
14
|
+
title: Semantic search for users who will never set an API key
|
|
15
|
+
---
|
|
16
|
+
Dense retrieval today needs the <code>[rag]</code> extra <em>and</em> a
|
|
17
|
+
<code>VOYAGE_API_KEY</code>/<code>OPENAI_API_KEY</code> <em>and</em> a built
|
|
18
|
+
store. Most users will do none of that, so the default experience is BM25
|
|
19
|
+
forever. The keyless path is a <b>local static embedding model</b> —
|
|
20
|
+
<code>potion-retrieval-32M</code> class, MIT, model2vec family — which is not a
|
|
21
|
+
transformer: the entire weight file is one lookup table, so inference is
|
|
22
|
+
tokenize → gather rows → mean-pool → L2-normalize.
|
|
23
|
+
Measured locally, pure stdlib: <b>~1 ms to embed a query</b> (mmap + bisect over
|
|
24
|
+
sorted keys), 12.8 MB of int8 vectors for 50k items at 256-d, and <b>~20 ms to
|
|
25
|
+
rerank BM25's top-200</b>. No numpy, no <code>sqlite-vec</code>, no ANN index,
|
|
26
|
+
no new runtime dependency. <code>import numpy</code> alone costs 180–390 ms
|
|
27
|
+
cold, which disqualifies it from a one-shot CLI query path; the BM25 prefilter is
|
|
28
|
+
what makes the stdlib version viable, since a full 50k brute-force scan is 1.5 s
|
|
29
|
+
in pure Python. Pool depth is justified by measurement: BM25 recall saturates at
|
|
30
|
+
0.890 by depth 200 and gains nothing at 400, so reranking the top-200 gives up
|
|
31
|
+
essentially nothing versus scanning everything.
|
|
32
|
+
<b>Why this and not a shipped Voyage index.</b> A precomputed Voyage index is
|
|
33
|
+
inert without a Voyage <em>query</em> vector, and the only keyless way to get one
|
|
34
|
+
is a maintainer-run anonymous embedding endpoint — an unauthenticated free
|
|
35
|
+
embeddings API backed by the maintainer's card, which also ships every user query
|
|
36
|
+
off-machine and breaks offline. A local model is deterministic, so the artifact
|
|
37
|
+
becomes a <em>cache</em> rather than a correctness dependency: a newly tapped
|
|
38
|
+
repo can be embedded on the user's own machine. Doc-side is the asymmetry worth
|
|
39
|
+
shipping for — 29 ms/doc in pure Python is ~24 min for 50k single-core, versus
|
|
40
|
+
seconds in CI with numpy.
|
|
41
|
+
<b>Do not ship this before the eval and dedup items.</b> The headline claim
|
|
42
|
+
(+11.0 recall / +15.9 hit@1) did <em>not</em> survive verification: its baseline
|
|
43
|
+
used the kind oracle the real search path lacks, and both the blend weight
|
|
44
|
+
(<code>w_dense=0.7</code>) and the pool depth were argmax'd on the same 82
|
|
45
|
+
queries they were reported on, by 2-query margins. On a binary metric at n=82
|
|
46
|
+
the smallest net win reaching p<0.05 is 6 queries; <code>hit@1</code> (+13 net
|
|
47
|
+
queries) holds up, recall (+9) sits at the resolution floor. And the structural
|
|
48
|
+
risk is real: the name is only ~10.5% of a mean-pooled surface vector while 106
|
|
49
|
+
description clusters are shared across 270 distinct names, so the lift may
|
|
50
|
+
<em>shrink</em> toward 50k rather than hold. Sequence: fix the gate, dedup, fix
|
|
51
|
+
the index format, then re-measure with McNemar and a held-out blend weight,
|
|
52
|
+
leading with <code>hit@1</code>. Test entry-level dense <em>alone</em> before the
|
|
53
|
+
blend, ship 512-d not 256-d (the whole case for 256-d was one query), keep
|
|
54
|
+
Voyage/OpenAI as the opt-in ceiling, and keep BM25 as the floor. The model table
|
|
55
|
+
cannot go in the default wheel — the shipped runtime is 0.79 MB and every merge
|
|
56
|
+
to main cuts a release, so +17.4 MB × ~24 releases/day exhausts PyPI's 10 GB
|
|
57
|
+
project quota in under a month; it needs a separate, rarely-released data
|
|
58
|
+
package behind an extra.
|